一、概述
二元樹——>索引檔:效率log2N
檢索10次:2的10次方。 1024筆記錄。
索引帶來的開銷
查看資料的文件(安裝目錄下的data目錄),會發現三個文件,
.frm:表示表的結構
.myd:表示資料
.myi:表示索引的檔案
索引帶來的問題:會導致insert,update,delete的效率
更新頻繁的欄位不適合建立索引。
唯一性比較差的欄位不適合建立索引。例如人的性別只有男和女
滿足一下條件才會創建索引
1、肯定在where條件中經常使用到。
2、該場的變化不會太頻繁。
二、索引使用場景
1、快速尋找符合where條件的記錄。
2、快速確定候選集。若where條件使用了多個索引字段,則MySQL會優先使用能使候選集規模最小的那個索引,以便盡快淘汰不符合條件的記錄。
3、如果表中存在幾個字段構成的聯合索引,則查找記錄時,這個聯合索引的最左前綴匹配字段也會自動作為索引來加速查找。
例如:若為某張表創建了3個索引,(c1,c2,c3)構成的聯合索引,則(c1),(c1,c2),(c1,c2,c3)均會作為索引, (c2,c3)就不會被當作索引,而(c1,c3)其實只利用到c1索引。
4、多表做join操作時會使用索引(如果參與join的字段在這些表中均建立了索引的話)
5、若某個字段已建立索引,求該字段做sort或group操作時,MySQL會使用索引。
三、透過EXPLAIN分析執行低效SQL的執行計畫
如:
mysql> explain select * from taxgrouptaxes\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: taxgrouptaxes type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 1 Extra:
select_type :表示SELECT 的類型,
常見的取值有
SIMPLE:或簡單或簡單或簡單查詢。的
PRIMARY :主查詢,既外層的查詢
union :UNION 中的第二個或後面的查詢語句
SUBQUERY :子查詢中的第一個select .
table :輸出結果集的表子查詢中的第一個select .
table :輸出結果集的表子查詢
type 表示MYSQL 在表中找到所需行的方式。或叫訪問類型。
常見的類型有以下幾種;
all
index
range
ref
eq_ref
const,2到是最好有到最差嗎?
1:type=all 全表掃描。
2:type=index 索引掃面
3:type=tange 索引範圍掃描。常見於< <= > >= between 等操作
4:type=ref s使用費唯一索引掃描或唯一索引的前綴掃描。
5:type=eq_ref 類似ref 區別就在使用的索引是唯一索引,對於每個索引鍵值,表中只有一條記錄匹配。
6:type=const/system 單表中最多有一個符合行,查詢起來非常迅速。
7 : type=null MYSQL 不用存取表或索引。直接就能夠得到結果。
possible_keys: 表示查詢時可能使用的索引
key: 表示實際使用的索引
key_len: 使用到索引字段的長度
rows : 掃描行的數量
Extra 掃描。包含不適合的其他欄位中顯示單是對執行計畫非常重要 。
四、透過show profile分析SQL
1、先查看MySQL是否支援show profile
mysql> select @@have_profiling; +------------------+ | @@have_profiling | +------------------+ | YES | +------------------+ 1 row in set (0.00 sec)
set profiling = 1;
3、執行完畢之後,可以執行完畢之後,透過show profiles語句,查看目前SQL的queryID。
4、透過show profile for query queryID
以上就是MySQL高級十三-透過索引優化SQL的內容,更多相關內容請關注PHP中文網(m.sbmmt.com)!