后端与系统架构493 字
索引失效
·全库 373 / 611
《索引失效》共 0.0 万字,归在「后端与系统架构」这一层。
适合给 AI 系统搭底座、要管得住的人
目录骨架(7 节)
- 1. 使用函数进行查询
- 2. 隐式转换
- 3. 不等操作
- 4. 通配符位置
- 5. OR 条件
- 6. 复合索引的最左前缀规则 (走索引)
- 7. 范围条件
-- 创建示例表
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. 使用函数进行查询
-- 使用函数,索引失效
EXPLAIN SELECT * FROM employees WHERE UPPER(last_name) = 'DOE';
2. 隐式转换
-- 整数被隐式转换为字符串,索引失效
EXPLAIN SELECT * FROM employees WHERE last_name = 123;
3. 不等操作
-- 使用 != 导致索引失效
EXPLAIN SELECT * FROM employees WHERE last_name != 'Smith';
4. 通配符位置
-- 通配符在开头,索引失效
EXPLAIN SELECT * FROM employees WHERE last_name LIKE '%mith';
5. OR 条件
-- OR 条件,索引失效
EXPLAIN SELECT * FROM employees WHERE last_name = 'Doe' OR age = 28;
6. 复合索引的最左前缀规则 (走索引)
-- 复合索引的最左前缀规则未遵循
EXPLAIN SELECT * FROM employees WHERE salary = 50000 AND age = 28;
7. 范围条件
-- 范围查询后索引无法用于后面的列
EXPLAIN SELECT * FROM employees WHERE age > 30 AND salary = 52000;
假设index(a,b,c)
| where语句 | 索引是否被使用 |
|---|---|
| where a =3 | Y, 使用到a |
| where a =3 and b =5 | Y,使用到a,b |
| where a =3 and b =5 and c=4 | Y,使用到a,b,c |
| where b = 3 或者 where b =3 and c=4 或者 where c=4 | N |
| 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=4 | Y,使用到a,b,c |
| where a=3 and b like '%kk' and c=4 | Y,只用到a |
| where a=3 and b like '%kk%' and c=4 | Y,只用到a |
| where a=3 and b like 'k%kk%' and c=4 | Y,使用到a,b,c |
like kk%相当于=常量,%kk和%kk%相当于范围
