動態

詳情 返回 返回

SQL 不走索引的常見情況 - 動態 詳情


SQL 不走索引的常見情況

在 SQL 查詢中,即使表上有索引,某些情況下數據庫優化器也可能決定不使用索引。以下是常見的不走索引的情況:

1. 使用否定操作符

  • NOT IN
  • !=<>
  • NOT EXISTS
  • NOT LIKE

2. 對索引列使用函數或運算

-- 不走索引
SELECT * FROM users WHERE YEAR(create_time) = 2023;
SELECT * FROM products WHERE price * 1.1 > 100;
-- 走索引
SELECT * FROM users WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31';

3. 隱式類型轉換

-- 假設 user_id 是字符串類型
SELECT * FROM users WHERE user_id = 123;  -- 不走索引(數字轉字符串)

4. 使用前導通配符的 LIKE 查詢

SELECT * FROM users WHERE name LIKE '%張';  -- 不走索引
SELECT * FROM users WHERE name LIKE '張%';  -- 走索引

5. OR 條件不當使用

-- 如果 age 或 name 中有一個沒有索引,可能全表掃描
SELECT * FROM users WHERE age = 20 OR name = '張三';

6. 複合索引未遵循最左前綴原則

-- 假設有複合索引 (a, b, c)
SELECT * FROM table WHERE b = 2 AND c = 3;  -- 不走索引

7. 數據量過小

  • 當表中數據量很少時,全表掃描可能比使用索引更快。

8. 索引選擇性低

  • 當列的值重複率很高(如性別字段),數據庫可能選擇全表掃描。

9. 使用了 IS NULL 或 IS NOT NULL

SELECT * FROM users WHERE phone IS NULL; -- 可能不走索引

10. 查詢返回大量數據

  • 當查詢需要返回表中大部分數據時(如超過20-30%),優化器可能選擇全表掃描。

11. 統計信息過時

  • 數據庫的統計信息沒有及時更新,導致優化器做出錯誤判斷。

12. 強制類型轉換

SELECT * FROM users WHERE CAST(age AS CHAR) = '25'; -- 不走索引

13. 使用 ORDER BY 非索引列

  • 當排序字段沒有索引時,可能導致全表掃描。

Add a new 評論

Some HTML is okay.