大分页查询说的是分页中比较靠后的查询,小白可能觉得在mysql 中查询第 1 页和第 100000 页没有什么不同,其实不然。分页越靠后,mysql 需要花费大量的时间扫描那些需要跳过的数据,简单查询的效率只会更低。
现在有一张表A ,共 65 列,数据行有 350w+ ,我们按照时间排序后分页,时间列上建有索引,常见简单的小分页查询如下
SELECT * FROM A ORDER BY CreateTime LIMIT 0,10;
这种经典的小分页查询效率极高,不到 0.01s 即可完成。那如果我们需要查询的是从第 10w 行开始的 10 条数据,当然,还可以写成下面这样
SELECT * FROM A ORDER BY CreateTime LIMIT 100000,10;
间隔测试几次,发现分别用时 6.691s, 8.606s,8.726s ,这肯定是不可接受的!
如何优化呢?这里我们可以先覆盖索引再关联,也就是延迟关联的方式,如下所示
SELECT * FROM A sa INNER JOIN ( SELECT id FROM A ORDER BY CreateTime LIMIT 100000, 10 ) a ON sa.id= a.id
右表直接通过覆盖索引的方式获取目标行的主键列,然后再关联获取目标行的所有列。间隔测试发现用时都不到 0.05s
实际中,可能并不会存在这样大分页查询第 1w 页数据的变态业务,即使有,也可以通过预先计算或者缓存。
另外,覆盖索引是mysql 查询的神器,当用则用。
标签:10,分页,查询,索引,LIMIT,SELECT 来源: https://www.cnblogs.com/yuan404/p/16220364.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。