1. 程式人生 > >Mysql索引優化1

Mysql索引優化1

兩種 空間 結果 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