我们经常会遇到两种情况:
- 明明在某个字段上加了索引,但实际上并没有生效。
- 索引有时候生效了,有时候没有生效。
索引失效的场景汇总如下:
- 使用
select *
- 索引列上有计算操作
- 索引列上有函数操作
- 字段类型不同
- like左边包含
%
- 进行索引的列对比
not in
和not exist
准备数据
CREATE TABLE example
(
id int NOT NULL AUTO_INCREMENT,
code varchar(20) DEFAULT NULL,
age int DEFAULT 0,
name varchar(30) DEFAULT NULL,
height int DEFAULT 0,
PRIMARY KEY (id),
KEY idx_code_age_name (code, age, name),
KEY idx_height (height)
);
INSERT INTO example (id, code, age, name, height, address)
VALUES (1, '10', 21, '张三', 175, '北京');
INSERT INTO example(id, code, age, name, height, address)
VALUES (2, '11', 18, '李四', 173, '上海');
INSERT INTO example (id, code, age, name, height, address)
VALUES (3, '12', 23, '王武', 174, '广州');
INSERT INTO example (id, code, age, name, height, address)
VALUES (4, '13', 22, '马六', 154, '重庆');
创建了三个索引
- id:数据库的主键
- idx_code_age_name:由code、age和name三个字段组成的联合索引
- idx_height:普通索引
查看执行计划,可以使用explain
关键字,例如:
explain select * from example where id=1;
执行结果:
从图中可以看出,由于id字段是主键,该SQL语句用到了主键索引
使用select *
案例SQL
explain
select * from example where name='苏三'