MySQL補充(一)——MySQL查詢不走索引的情況

一個簡單的表

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 不走索引

8.複合索引a-b-c,a用到,b用不到,c用不到,ab有效,ba有效,a or b無效,ac有效,bc無效,abc有效 ,不走索引!

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