优化sql的时候,由于数据量比较大,一个简单的sql但执行速度特别慢
SELECT max(id) FROM log WHERE create_date <= "2022-08-03" GROUP BY code
试了这四种索引,create_date、code、(code,create_date)、(create_date,code)
网上查是说建立(create_date,code)组合索引,毕竟先执行where再执行groupby ,explain可以看到居然只使用到组合索引中的 create_date,没有使用到code,查询速度也没有变快
结果使用(code,create_date)组合索引是最快的,只需要1秒,explain命令查看索引的两列都用到了
为什么(code,create_date)是最快的,这到底是什么原理
补充一下:
建立create_date和code的单独索引用explain看到只走了code索引
这要是组合索引(code,create_date)中也只走了code我还好理解些,偏偏组合索引(code,create_date)中两个索引都走了
而组合索引(create_date,code)中只走了create_date
对于group by,大多数传统的方式都是扫描全表,然后建临时表来进行group操作和聚合操作
group by使用索引的前置条件,是“”所有的group by中的列,必须在同一个索引里面”,但这只是前提条件,最终是不是使用索引还会受where条件和聚合函数的影响
所以,建立索引,要根据实际情况去建立,你这个还是单表的,如果是连表时还会更复杂点
主要是要看执行顺序吧。where是把数据进行了一次筛选,然后使用groupby将筛选的数据进行分组操作。
如果要分析代码的执行效率,你可以使用explain +SQL 代码,执行后可以看到执行的效率,是否使用到对应的索引、是否全表扫描等。
索引存在的必要条件,就有点类似于书本的目录一样,不是越细越好,太细的话分的太多,导致目录过大。查找也不方便。索引是根据需要来建立的。
where一般命中索引,都是按照顺序从左到右来的。你可以把优先命中的索引放到左边。聚合函数和> <这些会对索引有影响
我看到了题主的这个问题,我也挺感兴趣的`
(create_date,code)组合索引,毕竟先执行where再执行groupby ,explain可以看到只使用到组合索引中的 create_date,没有使用到code
这个大概是因为索引失效条件中的一个即复合索引中范围条件右侧的索引不会被使用。没有对MySQL做过深入研究,如果也有执行计划可以根据执行计划给出的执行顺序建立索引
建立联合索引要注意联合索引的原则,最左原则,最左边的一定要有数据,不然就会失效
一个sql中 只用一个索引,如果你where里面用的索引列 尽量也得是group by的列
https://blog.csdn.net/gaohuijie521/article/details/126014040?spm=1001.2014.3001.5502