神奇了,当 MySQL l查询条件为“>=”时,竟然不走索引?
我们都知道在数据库查询时,>=索引可以极大地提高查询效率。神奇时竟通常在使用的询条时候,都会针对频繁查询的走索关键字段建立索引。
比如,>=当以交易日期(trans_date)来查询交易记录时,神奇时竟通常会对该字段添加索引,询条以便在大量数据的走索情况下提升查询效率。
针对trans_date字段,>=创建union_idx_query索引,神奇时竟那么在下面以trans_date为查询条件的询条语句中,毫无疑问是走索会走索引的:
select count(1) from A; // 40000
EXPLAIN select * from A where trans_date = 20220222;

索引1
此时,我们会想当然地以为,>=只要创建了索引,神奇时竟其他情况的询条使用同样会走索引。比如下面的查询语句:
select count(1) from t_trans_log_info where trans_date > 20220122; //11200
EXPLAIN select * from t_trans_log_info where trans_date > 20220122;
上面的查询语句使用了”>“来进行范围的源码库查询,而且trans_date字段同样创建了索引,那么上述SQL语句是否会走索引呢?答案是不一定。

索引2
explain上述SQL语句,发现的确走了索引。
但当换一个查询参数时:
select count(1) from t_trans_log_info where trans_date > 20220222; //1120
EXPLAIN select * from t_trans_log_info where trans_date > 20120222;
explain的结果显示没有走索引,而是进行了全表扫描:

索引3
为什么同样的查询语句,只是查询的参数值不同,却会出现一个走索引,一个不走索引的情况呢?
答案很简单:上述索引失效是因为DBMS发现全表扫描比走索引效率更高,因此就放弃了走索引。
也就是说,当Mysql发现通过索引扫描的亿华云计算行记录数超过全表的10%-30%时,优化器可能会放弃走索引,自动变成全表扫描。某些场景下即便强制SQL语句走索引,也同样会失效。
类似的问题,在进行范围查询(比如>、< 、>=、<=、in等条件)时往往会出现上述情况,而上面提到的临界值根据场景不同也会有所不同。
所以,如果你在项目中采用了上述方式的查询,又希望它能够走索引,就需要特别注意了。通常需要添加一些其他的限制条件或用其他方式来保证索引的有效性。
免费信息发布网相关文章
解决电脑上Xbox游戏安装错误的有效方法(遇到电脑上Xbox游戏安装错误?快来学习解决办法!)
摘要:随着电脑成为我们日常娱乐的重要工具之一,许多玩家选择在电脑上安装并玩Xbox游戏。然而,有时候在安装过程中可能会遇到一些错误,这给玩家带来了困扰。本文将为大家介绍解决电脑上Xbox...2025-11-04
注册.cyou域名时,用户需要注意一些关键事项,以确保选择到合适且有效的域名。以下是一些建议和注意事项:一、注册.cyou域名的注意事项1. 选择可靠的注册商在选择注册商时,确保其信誉良好,提供安全的2025-11-04
面试官:This 和Super 有什么区别?This 能调用到父类吗?
this 和 super 都是 Java 中常见的关键字,虽然二者在很多情况下都可以被省略,但它们在 Java 中所起的作用是不可磨灭的。它们都是用来起指代作用的,每个类在实例化的时候之所以能调用到2025-11-04
GCC 12 编译器带来了一个小改动:支持使用 Mold 链接器(Mold linker)。作为高速链接器的 Mold 1.0 于上周发布,它可以提供比 GNU 旧的 Gold 链接器,甚至 LLVM2025-11-04如何解决在苹果电脑上安装JDK路径错误问题(正确设置JDK路径,让开发环境无忧)
摘要:在使用苹果电脑进行Java开发时,经常会遇到安装JDK时路径错误的问题,这会导致开发环境无法正常配置和运行。本文将详细介绍如何解决这个问题,让您的苹果电脑顺利安装和使用JDK。...2025-11-04
关于Java线程的状态,有的人可能会说有4种状态,有的会说有5种,6种,总之各种各样的说法可能都有。造成这种情况的原因是:有很多的书上常常把操作系统进程状态,线程状态与Java线程状态混在一起谈。下面2025-11-04

最新评论