美文网首页数据库干货铺
ORDER BY导致索引使用不理想

ORDER BY导致索引使用不理想

作者: July_geng | 来源:发表于2020-03-21 11:15 被阅读0次

MySQL中经常出现未按照理想情况使用索引的情况,今天记录一种Order by语句的使用导致未按预期使用索引的情况。

1.  问题现象

1.1 SQL语句:

SELECT DISTINCT p.*FROM tb_name p WHERE1=1AND p.createDate>='2019-10-23'AND p.createDate<='2019-11-20 24:00:00'AND p.status='1'AND p.areaName LIKE'%上海%'ORDER BY p.payDate DESC LIMIT0,15

1.2 执行计划如下:

1.3 表中索引信息如下:

运行此SQL耗时约5.7s。从SQL及索引情况来看,使用createDate字段的索引应该会更好才对,为验证此情况,使用force index来强制使用createDate索引运行一次查看结果。

SQL改为如下:

修改后执行计划如下:

实际运行该SQL耗时约为0.15s,相差约50倍的差距。

1.5 简单分析

从执行计划情况对比来看,使用createDate会进行额外的排序(Using filesort),这个不难理解。

2  各种不太合理尝试

2.1 强制使用索引

使用force  index (createDate)是可以解决的,此方式上面已经测试过了

2.2  忽略不理想的索引

类似于force index,可以使用IGNORE INDEX ,其实目的也在于使用上createDate 索引,例如:

其效果和force index 一致,运行耗时也在0.15s左右。

2.3 添加组合索引

将payDate 及createDate 添加为组合索引,但是此举不是一个好办法,执行计划也未按理想情况运行。

3.  相对合理的方式

无论使用force  index  还是 ignore index都会影响MySQL优化器自身的执行情况。例如createDate 如果范围很大,那么其实走payDate 的索引取前15条记录会更快,为了让应用改动最少且不会因为其他条件的变化而导致未能走合理的索引,选择另一种优化方案,将SQL改为如下情况:

此时执行执行计划如下:

调整createDate 之后,执行执行计划:

也按预期的情况正常。由此看来此方式相对之前的方案更佳理想的。

相关文章

  • ORDER BY导致索引使用不理想

    在MySQL中经常出现未按照理想情况使用索引的情况,今天记录一种Order by语句的使用导致未按预期使用索引的情...

  • MySQL ORDER BY是如何执行的

    本文问题 order by是否可以使用索引,在什么情况下使用索引? 在哪些情况下,order by无法使用索引执行...

  • 为order by使用索引

    此篇文章主要是解决Order by带来Using filesort的问题 1、创建表 2、看如下几组SQL:(一)...

  • mysql的索引优化问题

    1、order by 和limit导致索引失效问题 表中设置了三个索引:end_time,execute_stat...

  • 开发提问03索引

    索引优化的方案 使用explain分析语句针对常用的where , order by 字段添加索引不要使用超过3个...

  • Geomesa学习2 - 索引机制

    GeoMesa一共有两大类索引,分别是普通属性索引、时空索引。 Geomesa时空索引使用了基于Z-order填充...

  • sql优化总结

    1.在where和order by 涉及的列上建立索引2.where中对null(空值)判断,否则导致引擎放弃索引...

  • MySQL优化:order by和limit

    1. 对order by使用复合索引 order by和limit一起使用,避免引起全表扫描和数据排序是非常重要的...

  • MySQL优化:order by和limit

    1. 对order by使用复合索引 order by和limit一起使用,避免引起全表扫描和数据排序是非常重要的...

  • MySQL最佳实践

    索引使用策略及优化 创建索引 在经常查询而不经常增删改操作的字段加索引。 order by与 group by 后...

网友评论

    本文标题:ORDER BY导致索引使用不理想

    本文链接:https://www.haomeiwen.com/subject/rfkyyhtx.html