Skip to content

索引失效 ​

来源:语雀原文 | 整理日期:2026-09-22

sql
-- 创建示例表

CREATE TABLE employees (

    id INT PRIMARY KEY,

    first_name VARCHAR(50),

    last_name VARCHAR(50),

    age INT,

    salary DECIMAL(10, 2)

);

-- 创建索引

CREATE INDEX idx_last_name ON employees(last_name);

CREATE INDEX idx_age_salary ON employees(age, salary);

-- 插入示例数据

INSERT INTO employees (id, first_name, last_name, age, salary) VALUES

(1, 'John', 'Doe', 28, 50000),

(2, 'Jane', 'Smith', 34, 60000),

(3, 'Mike', 'Brown', 40, 75000),

(4, 'Sara', 'Davis', 30, 52000);

1. 使用函数进行查询 ​

sql
-- 使用函数,索引失效
EXPLAIN SELECT * FROM employees WHERE UPPER(last_name) = 'DOE';

2. 隐式转换 ​

sql
-- 整数被隐式转换为字符串,索引失效
EXPLAIN SELECT * FROM employees WHERE last_name = 123;

3. 不等操作 ​

sql
-- 使用 != 导致索引失效
EXPLAIN SELECT * FROM employees WHERE last_name != 'Smith';

4. 通配符位置 ​

sql
-- 通配符在开头,索引失效
EXPLAIN SELECT * FROM employees WHERE last_name LIKE '%mith';

5. OR 条件 ​

sql
-- OR 条件,索引失效
EXPLAIN SELECT * FROM employees WHERE last_name = 'Doe' OR age = 28;

6. 复合索引的最左前缀规则 (走索引) ​

sql
-- 复合索引的最左前缀规则未遵循
EXPLAIN SELECT * FROM employees WHERE salary = 50000 AND age = 28;

7. 范围条件 ​

sql
-- 范围查询后索引无法用于后面的列
EXPLAIN SELECT * FROM employees WHERE age > 30 AND salary = 52000;

假设index(a,b,c)

where语句索引是否被使用
where a =3Y, 使用到a
where a =3 and b =5Y,使用到a,b
where a =3 and b =5 and c=4Y,使用到a,b,c
where b = 3 或者 where b =3 and c=4 或者 where c=4N
where a =3 and c =5使用到a ,但是c不可以,b中间断了
where a=3 and b > 4 and c=5使用到a和b,c不能用在范围之后,b断了
where a=3 and b like 'kk%' and c=4Y,使用到a,b,c
where a=3 and b like '%kk' and c=4Y,只用到a
where a=3 and b like '%kk%' and c=4Y,只用到a
where a=3 and b like 'k%kk%' and c=4Y,使用到a,b,c

like kk%相当于=常量,%kk和%kk%相当于范围