一、概述
二叉樹——>索引文件:效率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 :輸出結果集的表
type 表示MYSQL 在表中找到所需行的方式。或者叫訪問類型。
常見的類型有以下幾種;
all
index
range
ref
eq_ref
const,system
null
從上到下呢,性能有最差到最好。
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)
2、如果profile是關閉的,可以通過set語句在session級別開啓profile
set profiling = 1;
3、執行完畢之後,可以通過show profiles語句,查看當前SQL的queryID。
4、通過show profile for query queryID