关于MySQL where .... order by .... limit 1性能问题和解决办法

最近同学工作中遇到的问题,记录下,原文简书连接:https://www.jianshu.com/p/75b1827a2a0b

  小伙伴们估计遇到过在数据量超过几十万的时候使用where … order by … limit 1这样的语句,花费的时间比where … order by …还要慢,这是为什么呢?
  开始我也不知道为什么,网上找了很多,发现不少人遇到了这样的问题,按照我们正常的逻辑思维,这条语句执行应该是先使用order by 的索引,然后使用where 条件,最后在截取一条返回给我们是不是?然而并不是如此,下面我以项目中的数据来测试
关于MySQL where .... order by .... limit 1性能问题和解决办法_第1张图片
 我们数据在百万这个级别,OK我们使用where … order by … limit 1这样的语句来看看效果
关于MySQL where .... order by .... limit 1性能问题和解决办法_第2张图片
  这样一个查询花费了19秒,对于我们线上业务来说是不能够接受的,我们尝试去掉limit呢
  关于MySQL where .... order by .... limit 1性能问题和解决办法_第3张图片  一看吓一跳是不是,居然用了limit时间还多花费了几十倍,我们使用EXPLAIN(不知道这个的同学可以单独百度一下)来检查一下这两条sql
关于MySQL where .... order by .... limit 1性能问题和解决办法_第4张图片关于MySQL where .... order by .... limit 1性能问题和解决办法_第5张图片

EXPLAIN分析不使用limit

  区别很大是不是,使用limit虽然类型是index而且可能用到bookId索引,结果直接就是使用的where;而没使用limit的时候类型是ref,结果是使用了条件索引bookId和文件索引,具体的原因我没有深入去寻找答案,但是我猜测应该跟mysql内部优化算法有关系,不纠结这个,我们先说说怎么去解决这个问题,感兴趣的可以自行google

  不走索引?那我们就让他强制索引force index

关于MySQL where .... order by .... limit 1性能问题和解决办法_第6张图片关于MySQL where .... order by .... limit 1性能问题和解决办法_第7张图片
  哇塞效果很理想嘛,跟不使用limit的差不多,而且只返回一条,but难道以后我们都要自己去添加强制索引吗?然后捉摸着我找到了另外一种迂回的方式,如下

关于MySQL where .... order by .... limit 1性能问题和解决办法_第8张图片关于MySQL where .... order by .... limit 1性能问题和解决办法_第9张图片   看起来确实很迂回,但是我们确实不需要强制指定索引了,让mysql自己选择最好的索引吧 哈哈

你可能感兴趣的:(日常遇见)