背景:當在某列建立索引,並且在查詢條件中使用like '%xxx%' 這樣的語句時,會使得索引失效。當時實際的環境必須使用 like '%xxx%' 這樣的條件,那麼應該如何解決這個問題。
答:使用覆蓋索引避免這個問題。即:在要查詢的列和其他的列之間建立一個複合索引,然後查詢時同時查詢和複合索引有關的列即可避免全表掃描。
create table user_info(
id int PRIMARY key auto_increment,
name varchar(16) default '',
age tinyint default 0,
address varchar(32) default ''
);
insert into user_info(name,age,address)
values
('1a1',1,'beijing'),
('2b2',2,'shanghai'),
('3c3',3,'tianjin'),
('4a4',4,'chongqi'),
('5b5',5,'guangzhou'),
('6c6',6,'shenzhen');
#創建複合索引
create index idx_n_a on user_info(name,age);
explain select name from user_info where name like '%a%';
1 SIMPLE user_info index idx_n_a 53 6 16.67 Using where; Using index
explain select name,age from user_info where name like '%a%';
1 SIMPLE user_info index idx_n_a 53 6 16.67 Using where; Using index
以下兩個例子是查詢了不在複合索引中的列進而造成全表掃描
explain select name,age,address from user_info where name like '%a%';
1 SIMPLE user_info ALL 6 16.67 Using where
explain select * from user_info where name like '%a%';
1 SIMPLE user_info ALL 6 16.67 Using where