Mysql索引優化1
阿新 • • 發佈:2018-03-18
兩種 空間 結果 from toc AD btree 存儲 address
Btree索引和哈希索引(索引是一種數據結構,提高查詢,排序,分組速度)
- Btree索引的數據結構是平衡二叉樹,時間復雜度為lgN
- 哈希索引的數據結構是一個Hash函數,時間復雜度為O(1),數據輸入Hash函數,輸出一個數據行Address
- 劣勢:內存空間會有冗余不一定是緊密排列的;不利於範圍查詢;哈希地址沖突的問題(拉鏈算法)
常用聯合索引的規則
- 聯合索引的創建並不是憑空的而是需要調研的
- 假設index(a, b, c), 順序很重要
- where a = 1 and b = 2 and c = 4 (a,b,c都能用到索引)
- where a = 3 and b = 4 (a,b能用到索引)
- where b = 4 and a = 3 (a,b能用到索引)
- where b = 5 and c = 4 (用不到索引)
- where a = 1 and b like ‘hello%‘ and c = 4 (a,b能用到索引c用不到)
- where a = 1 and b like ‘%hello‘ (a能用到索引,b用不到索引)
- group by b, c (b, c用到索引)
- group by c, b (用不到索引)
- 假設a,b,c三個字段對應三塊木板,from a to b, ‘hello%‘走了木板的左半部分,所以用到了索引,‘%hello‘走了木板的右半部分,所以不走索引,這個又稱為索引的左前綴原則
- where條件中如果有多個獨立的索引,只能用上一個?
非聚簇索引和聚簇索引
- 非聚簇索引對應myisam, 數據和索引二叉樹是獨立的文件,查數據先到索引二叉樹,再到數據,索引指向行在磁盤上的位置,又稱為回行
- 聚簇索引對應innodb,數據和索引二叉樹有關聯,主鍵索引的葉子節點就直接放了數據本身,次級索引的葉子節點指向對主鍵的索引
聚簇索引導致的頁分裂
- 當insert的data主鍵毫無規律時,由於葉子節點存儲著數據本身,會導致主鍵索引樹節點變動較大,稱為頁分裂
- 考慮一下兩種情況,亂序插入myisam引擎,和亂序插入innodb引擎,當使用select * from t1時,innodb引擎對應的數據表查詢結果會按順序輸出,雖然插入數據是無需的,但索引樹本身是有序的;myisam引擎對應的數據表,因為沒有使用where條件,所以怎麽插入的就怎麽輸出,依然是亂序
非聚簇索引中的索引覆蓋
- 當要查詢的列本身就是索引的一部分時,就不需要經過回行這個步驟了,又稱之為索引覆蓋;比如定義聯合索引index(id, name), 執行select name from t1 where id = 1,則會using index
Mysql索引優化1