`
hn67
  • 浏览: 78680 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

大数据量下,分页查询优化方法解释

 
阅读更多

原文地址:http://blog.sina.com.cn/s/blog_6353885f0100gn4q.html

算法如这篇文章

http://hi.baidu.com/%D4%E7%B9%C8%C9%E7%C7%F8/blog/item/1fd6f3d04927fd86a1ec9c44.html

之前老王也发过此方法:

http://hi.baidu.com/thinkinginlamp/blog/item/a352918fe70d96fd503d925e.html

简单解释一下,也作为思路整理:

1,使用stat作为一个单一索引

desc Select id fromtable where stat=1 order by id limit 90000,5 ;

| 1 | SIMPLE | table | ref | stat | stat |1 | const | 151906 | Using where; Using filesort |

正常执行分页语句,通过WHERE条件圈定了符合的数据集此时还是用到了filesort,为什么?因为索引只对WHERE条件过滤起到了作用,对ORDER无效。MYSQL操作时的微观应该是这样的:

根据索引限定了结果集范围-》取出结果集数据暂存起来-》进行排序-》输出给客户端。

此时就算是索引去掉了大部分数据,如果表数据基数大,剩下的数据量仍然很大,暂存结果集,并进行排序的过程仍会很长。

我们现在优化索引,将ID加到STAT后面形成复合索引:KEY `stat` (`stat`,`id`)

再次执行SQL,运行的时间差不多。EXPLAIN的结果如下

| 1 | SIMPLE | sp_photo_ff | ref | pic_stat | pic_stat | 1 | const | 151906 | Using where |

因为用到了索引进行排序,所以FILESORT没了。那为什么速度仍然不快?我认为MYSQL仍然按上面的流程执行的。。。所以在进行取数据和排序时的时间消耗仍然很大。

当我们最终改为两条SQL实现这个,第一条,即只根据条件和排序取出ID,第二条,通过ID进行准确条件查询。第一条SQL是个covering index,即并没有真的从表中出数据,而是通过索引即完成了查询操作,速度当然是最快的,第二条,通过主键进行,速度也是最快的。所以虽然是执行了两条SQL,但速度反而无可比。最早在看老王的这篇文章时,我没能明白,现在才真弄表白了

在写这篇博文时,要用事实说话,我发现我昨天的想法仍然有错。昨天我认为,当取出的字段不在索引的字段范围中时,MYSQL会先把WHERE过滤的记录暂存起来,再进行排序,因为他要保证对不同的排序此方法都适用。事实是,这个想法是错的 ,上面看到了,两种索引情况下,EXPLAIN的结果中少了一个FILESORT。所以MYSQL还是足够聪明的,它先进行了排序,然后才暂存了记录集。是否真的是这样?那只能去MYSQL内部找答案了。

分享到:
评论

相关推荐

    MySQL大数据量分页查询方法及其优化

    MySQL大数据量分页查询方法及其优化

    大数据量翻页查询的一点经验

    我的系统为:每天新增一张表,每张表的数据量为1000万条记。一共有十个字段,有四个字段需要排序,每个字段都可能出现在查询条件中,每次查询所有的字段必须都查询出来,可以查询三天之内的数据,没有和其他表的连接...

    MySQL百万级数据量分页查询方法及其优化建议

    主要介绍了MySQL百万级数据量分页查询方法及其优化建议,帮助大家更好的处理MySQL数据库,感兴趣的朋友可以了解下

    mysql分页查询优化,大数据量优化

    传统的mysql分页查询 ...特别是上线后数据量积累比较快,必须重视SQL优化,否则影响系统运行和用户使用体验 性能实验 直接用limit start, count分页语句, 也是我程序中用的方法: select * from table lim

    海量数据库的查询优化及分页算法方案

    海量数据库的查询优化及分页算法方案 总结了一下,一定要将聚集索引建立在: 1、您最频繁使用的、用以缩小查询范围的字段上; 2、您最频繁使用的、需要排序的字段上。

    SQLServer海量数据库的查询优化及分页算法方案

    SQLServer海量数据库的查询优化及分页算法方案

    详细讲解MySQL大数据量分页SQL语句优化

    分页程序原理很简单,这里就不多说了,本篇文章主要说的是在数据表记录量比较大的情况下,如何将分页SQL做到更优化,让MySQL执行的更快的方法。

    大量数据库的查询优化及分页算法方案

    大量数据库的查询优化及分页算法方案--如何实现快速地从这些超大容量的数据库中提取数据(查询)、分析、统计以及提取数据后进行数据分页已成为各地系统管理员和数据库管理员亟待解决的难题。

    海量数据库查询优化及分页算法方案

    海量数据库查询优化及分页算法方案,很不错

    Java海量数据分页Bean

    Java海量数据分页Bean, 适用于Oracle(适当修改,适用于任何数据库).功能描述:传入到达页码(具有容错性)、每页记录数、Select查询语句,返回该页所有的记录(整页是List集合,每条记录是一个 HashMap)、总行数、总...

    mysql分页之limit优化技巧

    本文档针对mysql分页之limit慢的问题,使用联合索引在大数据量的情况下优化limit分页的性能

    SQLServer2005一千万条以上记录分页数据库优化经验总结

    资源名称:SQL Server 2005 一千万条以上记录分页数据库优化经验总结 资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    Postgres查询优化方案

    上亿数据的select怎么整?不仅仅是分页的问题。请看附件方案

    海量数据库的查询优化及分页算法方案.

    这种数据主要适用于在大型项目,多数据处理,如大OA项目中公文的查询,区政府机构一般有几十个委办局,每个委办局每天可能都发文,这样算起来,要是过个一年两年,数据会达到上百万的数据量,然而如果你不用算法,...

    千万级数据分页操作方法

    数据库优化操作实现数据分页,数据量在千万级分页效果依然很流畅,该文件已经在实际项目中应用,并且效果很不错的!

    MySQL百万级数据分页查询优化方案

    当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询。对于数据库分页查询,也有很多种方法和优化的点。下面简单说一下我知道的一些...

    MySQL 亿级数据分页的优化

    domain、module 和 method 都是化名,代表接口的域、模块和实例方法名,后面的offset和limit代表分页操作的偏移量和每页的数量,也就是说该同学是在 翻第(1800000/500+1=3601)页。初步捞了一下日志,发现 有8000多...

    mysql千万级数据分页查询性能优化

    mysql数据量大时使用limit分页,随着页码的增大,查询效率越低下。 实验 1.直接使用用limit start, count分页语句: select * from order limit start, count 当起始页较小时,查询没有性能问题,我们分别看下从10,...

    MySQL优化教程之超大分页查询

    但是一旦数据量起来了,其实LIMIT的效率会极其的低,这一篇文章就来讲一下LIMIT子句优化的。 LIMIT优化 很多业务场景都需要用到分页这个功能,基本上都是用LIMIT来实现。 建表并且插入200万条数据: # 新建一张t5表...

Global site tag (gtag.js) - Google Analytics