一個簡單的表
CREATE TABLE `t_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`username` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`gender` int(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`address` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `age` (`age`),
KEY `username` (`username`(191))
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8mb4;
# 查看索引
show keys from users
explain select * from t_user where username = 'admin'
- type列,連接類型。一個好的SQL語句至少要達到range級別。杜絕出現all級別。range的包含範圍有一定的閾值,超過會進行全文掃描
- key列,使用到的索引名。如果沒有選擇索引,值是NULL。可以採取強制索引方式。
- key_len列,索引長度。
- rows列,掃描行數。該值是個預估值。
- extra列,詳細說明。注意,常見的不太友好的值,如下:Using filesort,Using temporary。
1.索引列參與計算,不走索引!
SELECT `username` FROM `t_user` WHERE age=20;-- 會使用索引
SELECT `username` FROM `t_user` WHERE age+10=30;-- 不會使用索引!!因爲所有索引列參與了計算
SELECT `username` FROM `t_user` WHERE age=30-10;-- 會使用索引
2.索引列使用了函數,不走索引!
-- 不會使用索引,因爲使用了函數運算,原理與上面相同
SELECT username FROM t_user WHERE concat(username,'1') ='admin1';
-- 會使用索引
SELECT username FROM t_user WHERE username =concat('admin','1');
3.索引列使用了Like %XXX,不走索引!
like 模糊查詢 前模糊或者 全模糊不走索引
select * from user where username like '%mysql測試'
4.隱式轉換——字符串列與數字直接比較,不走索引!
SELECT * FROM t_user WHERE `age`='23' -- 走索引
5.儘量避免 OR 操作,只要有一個字段沒有索引,改語句就不走索引,不走索引!
select * from t_user where username = 'mysql測試' or password ='123456'
6.where id !=2 或者 where id <> 2,不走索引!
select * from t_user where username <> 'mysql測試'
7. is null,is not null也無法使用索引,不走索引!
select * from t_user where username is not null --is not null 不走索引