前言:今天主要給大家剖析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.總結
-
建立索引的字段類型和查詢必須匹配否則索引失效
-
索引列不要做任何函數操作,否則索引失效
-
使用 is null is not null 索引失效 != 時候索引失效
-
以%開頭的模糊查詢索引失效
-
or會導致索引失效
-
複合索引遵循最左原則,左側索引必須使用到
關注公衆號 微笑碼 回覆mysql 獲取mysql優化視頻