当前位置: 首页 > 科技观察

奇怪,MySQLl的查询条件是“-=”的时候,竟然没有使用索引?

时间:2023-03-15 11:04:27 科技观察

我们都知道在查询数据库的时候索引可以大大提高查询效率。通常在使用的时候,会针对经常查询的关键字段建立索引。比如按交易日期(trans_date)查询交易记录,在数据量大的情况下,通常会在该字段上加一个索引,以提高查询效率。对于trans_date字段,创建一个union_idx_query索引,那么在下面以trans_date为查询条件的语句中,毫无疑问会用到该索引:selectcount(1)fromA;//40000EXPLAINselect*fromAwheretrans_date='20220222';索引1此时,我们会想当然地认为只要创建了索引,其他使用情况也会使用到索引。例如下面的查询语句:selectcount(1)fromt_trans_log_infowheretrans_date>'20220122';//11200EXPLAINselect*fromt_trans_log_infowheretrans_date>'20220122';上面的查询语句使用了“>”进行范围查询,并且trans_date字段也创建了索引,那么上面的SQL语句会不会使用索引呢?答案不一定。索引2解释上面的SQL语句,发现索引确实没有了。但是当更改查询参数时:selectcount(1)fromt_trans_log_infowheretrans_date>'20220222';//1120EXPLAINselect*fromt_trans_log_infowheretrans_date>'20120222';explain的结果显示没有使用索引,而是全表Scanning:index3为什么是同一条查询语句,但是查询参数值不同,但是一个会用索引,一个不会用指数?答案很简单:上面提到的索引失败是因为DBMS发现全表扫描的效率比索引高,所以放弃了索引。也就是说,当Mysql发现通过索引扫描的行数超过全表的10%-30%时,优化器可能会放弃索引,自动转为全表扫描。在某些场景下,即使强制SQL语句使用索引,也会失败。在进行范围查询(如>、<、>=、<=、in等)时经常会出现类似的问题,而上面提到的临界值会根据不同的场景而有所不同。因此,如果你在项目中使用了上述查询方式,并希望对其进行索引,则需要特别注意。通常需要添加一些其他限制或使用其他方法来确保索引的有效性。