后端与系统架构493 字

索引失效

·全库 373 / 611

《索引失效》共 0.0 万字,归在「后端与系统架构」这一层。

适合给 AI 系统搭底座、要管得住的人

目录骨架(7 节)
  1. 1. 使用函数进行查询
  2. 2. 隐式转换
  3. 3. 不等操作
  4. 4. 通配符位置
  5. 5. OR 条件
  6. 6. 复合索引的最左前缀规则 (走索引)
  7. 7. 范围条件
目录 · 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 =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%相当于范围

资料里没有你的场景?

把你手上的数据和想解决的那个环节发上来,我们按具体情况回,不复述方法论。

发布需求