找回密码
 立即注册
首页 业界区 安全 SQL 不走索引的常见情况

SQL 不走索引的常见情况

柴古香 2025-9-26 10:39:45
SQL 不走索引的常见情况

在 SQL 查询中,即使表上有索引,某些情况下数据库优化器也可能决定不使用索引。以下是常见的不走索引的情况:
1. 使用否定操作符


  • NOT IN
  • != 或
  • NOT EXISTS
  • NOT LIKE
2. 对索引列使用函数或运算
  1. -- 不走索引
  2. SELECT * FROM users WHERE YEAR(create_time) = 2023;
  3. SELECT * FROM products WHERE price * 1.1 > 100;
  4. -- 走索引
  5. SELECT * FROM users WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31';
复制代码
3. 隐式类型转换
  1. -- 假设 user_id 是字符串类型
  2. SELECT * FROM users WHERE user_id = 123;  -- 不走索引(数字转字符串)
复制代码
4. 使用前导通配符的 LIKE 查询
  1. SELECT * FROM users WHERE name LIKE '%张';  -- 不走索引
  2. SELECT * FROM users WHERE name LIKE '张%';  -- 走索引
复制代码
5. OR 条件不当使用
  1. -- 如果 age 或 name 中有一个没有索引,可能全表扫描
  2. SELECT * FROM users WHERE age = 20 OR name = '张三';
复制代码
6. 复合索引未遵循最左前缀原则
  1. -- 假设有复合索引 (a, b, c)
  2. SELECT * FROM table WHERE b = 2 AND c = 3;  -- 不走索引
复制代码
7. 数据量过小


  • 当表中数据量很少时,全表扫描可能比使用索引更快。
8. 索引选择性低


  • 当列的值重复率很高(如性别字段),数据库可能选择全表扫描。
9. 使用了 IS NULL 或 IS NOT NULL
  1. SELECT * FROM users WHERE phone IS NULL; -- 可能不走索引
复制代码
10. 查询返回大量数据


  • 当查询需要返回表中大部分数据时(如超过20-30%),优化器可能选择全表扫描。
11. 统计信息过时


  • 数据库的统计信息没有及时更新,导致优化器做出错误判断。
12. 强制类型转换
  1. SELECT * FROM users WHERE CAST(age AS CHAR) = '25'; -- 不走索引
复制代码
13. 使用 ORDER BY 非索引列


  • 当排序字段没有索引时,可能导致全表扫描。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册