面試中必問的Mysql性能優化

前言:今天主要給大家剖析Mysql性能優化中最重要的優化方式——索引優化

        主要包括索引的基本使用,索引的失效情況分析,複合索引的使用原則等等

1.什麼是索引

索引是用來快速查詢滿足條件的記錄,就像我們的樓層標記幾樓,我們就能很快的定位到自己想去的樓層,而不需要從一層一層的往上找到自己想要的樓層,小表中我們通常看不出對性能的影響。但是大數據下,將會產生質變。Mysql中索引原理採用B+樹的算法。索引記錄會保存在數據庫文件中

2.幾種常用的索引

主鍵索引 通常我們創建表的主鍵ID 就是主鍵索引,因此根據主鍵ID查詢記錄往往數據性能較好

唯一索引 在某個表中記錄值唯一存在

普通索引 通過create index 創建 

3. 創建索引方式

create INDEX indx_name on table_name(`clo_name`)

indx_name 是索引名稱 table_name 是表名 clo_name 是字段名

 

4. 查看索引

show index from table_name;

查詢表 table_name 

比如我們在表 my_test 的 name 字段上加上了所以indx_name 採用上面語句查看索引結構如下:

 

5.使用索引

索引的使用必須就先創建索引了,創建的索引也不是隨意創建,創建的原則是我們經常來查詢的字段,而不是修改的字段,因爲索引的創建也會消耗性能,而修改的話也要修改索引庫。

下面我們來測試 500萬條數據的單表查詢

這個是我的表結構

 

數據錄入採用存儲結構批量生成

我們查詢 學生編號爲 student_no=28100 的數據記錄

沒建立索引時的查詢情況爲:

 

可以看到我們500萬條數據查詢花費了3秒多,一般正常情況是幾十秒到幾百秒就算比較高性能的。達到幾秒以上就屬於long_sql,這樣我們必須進行優化處理。在查詢較多的字段 student_no 上加索引。

 

看到我們創建索引都花費了 13.8秒 因爲索引要寫文件。現在我們再次執行上次的查詢語句看看效果。

 

只花費了0.003毫秒,性能提升顯而易見。

這就是最簡單的索引優化方式。

 

6.用Explain 分析sql語句是否使用到了索引。

在查詢語句前加上 explain 就可以查看該語句的索引使用情況

比如:EXPLAIN SELECT * from student where student_no=28100;

 

執行後可以查看效果如下:

由此可以看到使用到了索引。

7.索引失效之like模糊匹配

like模糊匹配導致索引失效

在上表情況下,我們建立 學生名的索引 根據學生名來查詢學生記錄

固定值查詢匹配肯定使用到索引,我們來看 "%" 的模糊查

7.1>前置% 導致索引失效

EXPLAIN SELECT * from student where student_name like '%IuZMN';

 

我們可以看到 key 爲null 說明沒用使用到索引,執行結果也花費了3秒多。

7.2> 後置% 索引有效

EXPLAIN SELECT * from student where student_name like 'IuZ%';

可以看到 type 變成了 range 此時已經不是全表掃描了

 

7.3> 前後都是 % 

如果是 select * 肯定 沒用使用到索引 但是 select student_name 此時使用到了覆蓋索引 效果如下:

在索引中我們切記勿使用 is null 字段類型和查詢不匹配等等,都會導致索引失效,這邊我就不帶着大家一一測試了。大家可以自行下去測試。

 

8.索引失效之複合索引(複合索引遵循最左原則)

爲了避免受到影響我們刪除上面創建的兩個索引,來創建一個複合索引:

create index idx_name_no on student(student_name,student_no);

SELECT * from student where student_no=5675;

 

我們發現並沒有使用到索引 因爲 建立索引的順序 是 student_name,no

此時我們只查詢了最右側的student_no 但是未使用到 student_name

會導致索引失效

我們在根據student_name 查詢

 

 

發現我們使用到了索引。

再看sql :

EXPLAIN SELECT * from student where student_name like 'IuZ%' and student_no=1413819;

 

我們發現key_len 的長度變成了66 比單獨查詢 student_name 多出了4個單位,因此此時兩個字段都使用到了索引。由此可知,最左原則順序 與sql中的字段順序無關,而是指建立sql索引的順序。

group by order 等等同樣遵循這樣的原則,由於篇幅有限,就不一 一舉例了。大家可以自行測試。

9.關聯查詢索引建立原則

假如有a,b兩表 sql如下:

我在a表上建立了索引,用explain分析發現索引無效

我在b表上建立索引 create index idx_bid on b(b_id);

 

發現使用到了索引

right連接不再演示,直接給出結論:

左連接右表關聯字段必須加索引,右連接左表必須加索引

 

10.關聯查詢之小表驅動大表

 

sql子查詢中 我們儘量遵循子查詢的結果數量儘量較少。(面試經典題)Exist 和 in 在使用時

如果in中的查詢數據較少 則使用in 否則使用Exist。

11.總結

  1. 建立索引的字段類型和查詢必須匹配否則索引失效

  2. 索引列不要做任何函數操作,否則索引失效

  3. 使用 is null is not null 索引失效  != 時候索引失效

  4. 以%開頭的模糊查詢索引失效

  5. or會導致索引失效

  6. 複合索引遵循最左原則,左側索引必須使用到

     

關注公衆號 微笑碼 回覆mysql 獲取mysql優化視頻

 

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