概述
有如下sql:SELECT * FROM user WHERE name='abc' ORDER BY age LIMIT 10000,10。这个语句同时使用了order和limit,如果没有索引的话会很慢。那么可以加上如下索引(name,age)。但是加索引之后可能还是很慢,因为这个索引不是覆盖索引,查询字段为*,需要回表取索引之外的字段。因为这条语句实际上只需要10条数据,所以可以针对limit进行优化,优化方案有两种:
- 可以从业务上限制,禁止用户翻这么多页
- 如果必须从10000开始取数据,就可以用到延迟关联技术。将语句改成
SELECT * FROM user a JOIN (SELECT id FROM user WHERE name='abc' ORDER BY age LIMIT 10000,10) b ON a.id=b.id
优化原理:第一个语句根据索引查找name='abc‘的数据并排序,然后回表通过主键查找所有匹配行的其他字段,最后舍弃前10000条数据,只取10条。第二个语句也是根据索引查找name='abc‘的数据并排序,然后舍弃前10000个主键,只取10个主键,再连表通过这10个主键查找其他字段。可以看到全部匹配行回表查字段的过程被优化成了10条记录的回表。
最后
以上就是顺利中心为你收集整理的Mysql优化之延迟关联的全部内容,希望文章能够帮你解决Mysql优化之延迟关联所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复