mysql主键查询慢(mysql查询表主键)

mysql主键查询慢(mysql查询表主键)今天遇到个奇葩的问题 应用主键排序速度奇慢无比 经过不懈的努力 终于找到了问题的原因 一 错误现象 template 表 索引 索引名随便起的 O O 哈哈 查询语句 select t template id from template t ORDER BY t template id desc 数据库中数据 7w 多条 查询耗时在 8s 以上 二 错误现象分析

大家好,我是讯享网,很高兴认识大家。



今天遇到个奇葩的问题,应用主键排序速度奇慢无比,经过不懈的努力,终于找到了问题的原因。

一、错误现象

template表:

b7cbc1ee396667f9ccbf2f906a54fd1f.png
讯享网

索引:索引名随便起的,O(∩_∩)O哈哈~

af83605490f03908d6afa2ce1e4473b3.png

查询语句:

select t.template_id from template t ORDER BY t.template_id desc数据库中数据7w多条,查询耗时在8s以上。

二、错误现象分析

首先我们对这条sql执行查询计划:

ef68d806e9c8db5043efeff05d4a9b84.png

发现这条语句应用的索引居然是key_sync_status,而不是主键,这就是问题的关键所在了!

为了进一步确定,再对下面的sql语句执行查询计划:发现使用where条件后,索引变成了主键。

1f6069d30e0f4d2cdf1d7a7a38eb21f2.png

通过以上的情况可以看出,MySQL默认的查询(没有where条件),不一定使用主键,由于MySQL的每一条简单查询只应用一个索引,所以,这个时候使用order by 主键,主键的索引功能失效。

三、解决方案

1、order by 索引(where条件中引用的索引)。

2、强制使用主键:FORCE INDEX(PRI),如果想强制使用索引,则用FORCE INDEX(索引名)。

select t.template_id from template t FORCE INDEX(pri) ORDER BY t.template_id desc四、其他order by 索引失效的原因分析

1、MySQL每天一条简单语句只应用一个索引,所以order by的字段要在索引之中,并且和where条件可以合并成组合索引。

例如:下面情况会应用组合索引。

117171ecb36df830c6f59ba3866be1bc.png

2、select的字段,必须是索引字段。(主键查询除外)

例如:下面情况不会应用组合索引。

347925be1fad6b26e0cab28eff4f9fc7.png

3、如果sql语句为复合语句,包含子查询等,可以把语句分解成简单查询来分析。

以上。

小讯
上一篇 2025-06-15 20:58
下一篇 2025-04-21 21:35

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/144338.html