1. 程式人生 > >從頭開始學MySQL-------效能優化

從頭開始學MySQL-------效能優化

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關鍵字前後兩個條件中的列都是索引的時候,才會使用索引。