【MySQL索引】如何使模糊查詢索引不失效,且使得字段兩邊都能加上%

當我們使用模糊查詢的時候對SQL加索引,應該加在字段的右邊,而不在字段左邊或者兩邊,因爲這樣做會導致所以的失效,那麼如何能做到加在兩邊呢?

先上一個例子:
下圖是數據庫表

CREATE TABLE `tbl_user`(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) DEFAULT NULL,
`age`INT(11) DEFAULT NULL,
`email` VARCHAR(20) DEFAULT NULL,
PRIMARY KEY(`id`)
)ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

INSERT INTO tbl_user(`name`,`age`,`email`)VALUES('1aa1',21,'[email protected]');
INSERT INTO tbl_user(`name`,`age`,`email`)VALUES('2bb2',23,'[email protected]');
INSERT INTO tbl_user(`name`,`age`,`email`)VALUES('3cc3',24,'[email protected]');
INSERT INTO tbl_user(`name`,`age`,`email`)VALUES('4dd4',26,'[email protected]');

給name和age字段添加索引:

CREATE INDEX idx_user_nameAge ON tbl_user(NAME,age)

接着我們使用explain進行測試:
測試一:查詢的*

EXPLAIN SELECT * FROM tbl_user WHERE NAME LIKE '%aa%';

在這裏插入圖片描述
測試二:覆蓋索引

EXPLAIN SELECT id,NAME,age FROM tbl_user WHERE NAME LIKE '%aa%';

在這裏插入圖片描述
這裏我們可以看到索引沒失效,使用上述三個字段的部分字段也不會引起失效
測試三:加上其他字段,這裏我們並沒給email加上索引

EXPLAIN SELECT id,NAME,age,email FROM tbl_user WHERE NAME LIKE '%aa%';

在這裏插入圖片描述
我們可以看到索引失效了

所以,要解決模糊查詢的時候兩邊都加上%且索引不失效,那我們查詢的時候要覆蓋索引即可,即如上述的測試2,所以我們儘量給需要查詢的字段加上索引,然後再使用覆蓋索引就不會引起索引失效了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章