0


mysql你可能误以为走索引的慢查询sql

有时候,开发人员或数据库管理员可能会假设他们的SQL查询将利用索引来提高性能,但实际上由于某些原因,查询并未使用索引。下面是一些常见情况,这些情况可能导致SQL查询没有如预期那样使用索引:

1. 使用了函数或计算

如果在索引列上使用了函数或任何计算,那么即使该列上有索引,查询也可能不会使用该索引。

SELECT * FROM users WHERE YEAR(birthdate) = 1990; 

在这个例子中,即使

birthdate

列上有索引,

YEAR()

函数的使用也可能阻止了索引的使用。

2. 使用了类型不匹配的比较

数据类型不匹配也会导致索引失效。

SELECT * FROM orders WHERE customer_id = '123'; -- 假设 customer_id 是 INT 类型 

即使

customer_id

列上有索引,将整数与字符串进行比较也可能导致不使用索引。

3. 使用了前导模糊查询

在使用

LIKE

操作符进行模糊查询时,如果模式的开始部分包含了通配符,索引将不会被使用。

SELECT * FROM products WHERE name LIKE '%iPhone%'; 

这里,即使

name

列上有索引,但是因为

LIKE

查询以

%

开头,索引可能不会被使用。

4. 复合索引未按顺序使用

在复合索引中,如果查询没有遵循索引列的顺序,那么索引可能不会被有效地使用。

-- 假设有一个索引是 (first_name, last_name) 
SELECT * FROM users WHERE last_name = 'Smith'; 

在这个例子中,查询仅使用了复合索引的第二个列,可能导致索引不被使用,或者不被有效利用。

5. 使用了 OR 条件

在某些情况下,使用

OR

条件可能会导致索引不被使用,尤其是当

OR

条件连接的列不都有索引时。

SELECT * FROM users WHERE last_name = 'Smith' OR age = 25; 

如果

last_name

age

列不都有索引,这个查询可能不会使用索引。

6. 索引列包含 NULL 值

某些数据库系统中,如果索引列包含大量的 NULL 值,查询可能不会使用该索引。

SELECT * FROM users WHERE profile_picture IS NULL; 

如果有很多用户没有

profile_picture

,那么即使这列上有索引,查询也可能不会使用索引。

7. 选择性不高的列

如果索引列的选择性(唯一值的比例)非常低,查询优化器可能会决定不使用索引,因为扫描全表可能更高效。

SELECT * FROM users WHERE gender = 'M'; 

如果

gender

列的值非常倾斜(例如,分布在 'M' 和 'F' 之间),那么这个查询可能不会使用索引。

如何验证查询是否使用索引

为了验证查询是否实际上使用了索引,可以在执行查询前使用

EXPLAIN

(在某些数据库中可能是

EXPLAIN PLAN

)来查看查询的执行计划。

EXPLAIN SELECT * FROM users WHERE last_name = 'Smith'; 

执行计划将告诉你是否有索引被使用,以及查询是如何执行的。基于这些信息,你可以调整查询或索引策略以优化性能。

标签: 数据库 sql

本文转载自: https://blog.csdn.net/hebtu666/article/details/140939139
版权归原作者 兔老大RabbitMQ 所有, 如有侵权,请联系我们删除。

“mysql你可能误以为走索引的慢查询sql”的评论:

还没有评论