mysql order by limit slow 慢查询

来源:互联网 发布:免费的crm软件 编辑:程序博客网 时间:2024/06/05 17:42

最近项目中遇到很奇怪的事情 言简意赅: 背景:数据量大约在300万左右, id为主键,有一个有好几个字段的索引, INDEX_1(f1,f2,f3,f4) , sql 查询条件为 f1=1, w5=xx,w6=zz.....,order by id desc limit 10; 加上where条件之后总的查询结果集才3条, 查询时间在 7秒左右,但是去掉order by id desc ,查询就变成0.3 秒。突然很困惑查询只要0.3秒的sql,并且查询结果才3条记录,然后加一个order by id desc limit 10 查询时间就变成7s了??


 解决方案去掉  INDEX_1(f1,f2,f3,f4) , 加上索引 INDEX_2(f1)


原因: 在分析的时候被先执行where 条件后再执行order by 这个规则误导了很久,其实这个规则是对的,但是order by 也会影响执行计划,order by id 会使得sql优化器把 id的索引优先级调的非常高,索引INDEX_1(f1,f2,f3,f4) 在查询条件为 f1=1, w5=xx,w6=zz.....,的时候确实能用上但是加了order by id 之后,优化器会会觉得INDEX_1 索引只用到了f1 ,效率没有主键索引高,所以在查询的时候会使用主键查询而不使用INDEX_1,所以单独新建一个索引INDEX_F1(f1) 使得编译器 在有主键索引的时候也选择INDEX_F1 这个索引(网上说的使用强制索引,也能解决 问题,但个人觉得在项目中使用不靠谱,不推荐使用,优化索引才是正解),想更深入的了解,可以学习b+树,和索引原理。这里只是记录下大概解决方案。


当然如果你用的是阿里云的mysql,貌似不会出现这个问题,用阿里云还出现order by 慢查询问题的,可以不用看这个帖子了!

原创粉丝点击