Mysql优化之延迟关联

有如下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条记录的回表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值