從頭開始學MySQL-------效能優化
阿新 • • 發佈:2018-11-18
1.使用LIKE關鍵字可能觸發不了索引
首先執行下面的SQL,準備一些資料。
DROP TABLE IF EXISTS t_student;
CREATE TABLE `t_student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `nameIdx` (`name`(3)) -- 增加一列索引
)
DROP PROCEDURE IF EXISTS insertStu; DELIMITER // CREATE PROCEDURE insertStu(IN myCount INT(11)) BEGIN DECLARE id INT(11) DEFAULT 0; WHILE id < myCount DO SET id = id + 1; INSERT INTO t_student VALUES(NULL,CONCAT('大宇',''+id),id+22); END WHILE; -- END // DELIMITER ; CALL insertStu(10);
t_student表的資料
首先看這張表裡面的索引。
SHOW INDEX FROM t_student;
除了主鍵的唯一索引以外,在name這一列上添加了nameIdx索引。
再來看看使用模糊查詢,會不會影響索引的使用。
EXPLAIN SELECT * FROM t_student WHERE name LIKE '%大宇1';
從上述紅色方框裡面可知,沒有使用任何索引,並且查詢了10條資料,造成了全表掃描。原因是因為,只有"%"不在第一個位置的時候,索引才會被使用。
再來寫一個SQL來證明上述的結論。
EXPLAIN SELECT * FROM t_student WHERE name LIKE '大宇1%';
上述分析結果說明這次使用了名為'nameIdx'的索引,並且只掃描了2條記錄。索引的威力發揮了出來。
使用LIKE關鍵字可能不會觸發索引,因此,只有"%"不在第一個位置,索引才會發揮左右。
2.使用OR關鍵字的查詢語句
查詢語句中的查詢條件只有OR關鍵字,並且OR關鍵字前後兩個條件中的列都是索引的時候,才會使用索引。
SHOW INDEX FROM t_student;
在這張表裡面裡,共有三個列,分別為id、name、age,id使用的主鍵索引,name使用的是nameIdx索引,而age列上沒有索引。
EXPLAIN SELECT * FROM t_student WHERE id=1 OR name = 'test'
根據上述執行結果,在執行SQL過程中僅僅使用了OR關鍵字,並且過濾條件是id與name,在紅色方框裡面顯示了使用的索引。本次查詢掃描了掃描了2條記錄。
再執行下面的SQL,其中id有索引,age沒有索引,看看情況會是什麼樣子。
EXPLAIN SELECT * FROM t_student WHERE id=1 OR age = 22
possible_keys說明了可能用到id的主鍵索引,但是key欄位說明本次掃描實際沒有用到任何索引。因此,rows的值為10,說明出現了全表掃描。
結論:查詢語句中的查詢條件只有OR關鍵字,並且OR關鍵字前後兩個條件中的列都是索引的時候,才會使用索引。