mysql分页优化实测效果明显

mysql分页优化实测效果明显

ID:35786145

大小:26.97 KB

页数:8页

时间:2019-04-18

mysql分页优化实测效果明显_第1页
mysql分页优化实测效果明显_第2页
mysql分页优化实测效果明显_第3页
mysql分页优化实测效果明显_第4页
mysql分页优化实测效果明显_第5页
资源描述:

《mysql分页优化实测效果明显》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、MySQL分页优化通常,我们会采用ORDERBYLIMITstart,offset的方式来进行分页查询。例如下面这个SQL:SELECT*FROM`t1`WHEREftype=1ORDERBYidDESCLIMIT100,10;或者像下面这个不带任何条件的分页SQL:SELECT*FROM`t1`ORDERBYidDESCLIMIT100,10;一般而言,分页SQL的耗时随着start值的增加而急剧增加,我们来看下面这2个不同起始值的分页SQL执行耗时:yejr@imysql.com>SELECT*FROM`t1`WHEREftype=1ORDE

2、RBYidDESCLIMIT500,10;⋯10rowsinset(0.05sec)yejr@imysql.com>SELECT*FROM`t1`WHEREftype=6ORDERBYidDESCLIMIT935500,10;⋯10rowsinset(2.39sec)可以看到,随着分页数量的增加,SQL查询耗时也有数十倍增加,显然不科学。今天我们就来分析下,如何能优化这个分页方案。一般滴,想要优化分页的终极方案就是:没有分页,哈哈哈~~~,不要说我讲废话,确实如此,可以把分页算法交给Sphinx、Lucence等第三方解决方案,没必要让MySQL

3、来做它不擅长的事情。当然了,有小伙伴说,用第三方太麻烦了,我们就想用MySQL来做这个分页,咋办呢?莫急,且待我们慢慢分析,先看下表DDL、数据量、查询SQL的执行计划等信息:yejr@imysql.com>SHOWCREATETABLE`t1`;CREATETABLE`t1`(`id`int(10)unsignedNOTNULLAUTO_INCREMENT,...`ftype`tinyint(3)unsignedNOTNULL,http://baozhuang.downme.com...PRIMARYKEY(`id`))ENGINE=InnoD

4、BDEFAULTCHARSET=utf8;yejr@imysql.com>selectcount(*)fromt1;+----------+

5、count(*)

6、+----------+

7、994584

8、+----------+yejr@imysql.com>EXPLAINSELECT*FROM`t1`WHEREftype=1ORDERBYidDESCLIMIT500,10G***************************1.row***************************id:1select_type:SIMPLEtable:t

9、1type:indexpossible_keys:NULLkey:PRIMARYkey_len:4ref:NULLrows:510Extra:Usingwhereyejr@imysql.com>EXPLAINSELECT*FROM`t1`WHEREftype=1ORDERBYidDESCLIMIT935500,10G***************************1.row***************************id:1select_type:SIMPLEtable:t1type:indexpossible_keys:NUL

10、Lkey:PRIMARYkey_len:4ref:NULLrows:935510Extra:Usingwhere可以看到,虽然通过主键索引进行扫描了,但第二个SQL需要扫描的记录数太大了,而且需要先扫描约935510条记录,然后再根据排序结果取10条记录,这肯定是非常慢了。针对这种情况,我们的优化思路就比较清晰了,有两点:http://baozhuang.downme.com1、尽可能从索引中直接获取数据,避免或减少直接扫描行数据的频率2、尽可能减少扫描的记录数,也就是先确定起始的范围,再往后取N条记录即可据此,我们有两种相应的改写方法:子查询、

11、表连接,即下面这样的:#采用子查询的方式优化,在子查询里先从索引获取到最大id,然后倒序排,再取10行结果集#注意这里采用了2次倒序排,因此在取LIMIT的start值时,比原来的值加了10,即935510,否则结果将和原来的不一致yejr@imysql.com>EXPLAINSELECT*FROM(SELECT*FROM`t1`WHEREid>(SELECTidFROM`t1`WHEREftype=1ORDERBYidDESCLIMIT935510,1)LIMIT10)tORDERBYidDESCG**********************

12、*****1.row***************************id:1select_type:PRIMARYtable:

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。