MySQL重溫筆記-索引

  mysql分客戶端、服務層、存儲引擎層,而索引的實現就是在存儲引擎層,所以各個不一樣的存儲引擎之間的索引都有細微的差異。mysql

【B-Tree索引】sql

  

  • MyIsam使用前綴壓縮技術使得索引更小,Innodb則按照原數據格式進行存儲
  • MyIsam索引經過數據的物理位置引用被索引的行,Innodb則根據主鍵引用被索引的行。
  • 索引樹中的節點是有序的,因此索引適合全鍵值、鍵值範圍或鍵前綴查找(最左)。由於是順序的,因此也適合排序。
  • 聯合索引的索引順序很重要

 

【哈希索引】服務器

  • 基於哈希實現。
  • 只有Memory引擎顯式支持哈希索引
  • 哈希索引只包含哈希值和行指針,而不存儲字段值
  • 哈希索引數據並非按照索引值順序存儲的
  • 哈希索引不支持部分索引列匹配查找,哈希索引值是使用索引列所有內容來計算哈希值的
  • 哈希索引只支持等值比較查詢
  • 訪問哈希索引的數據比較快,可是有多哈希值衝突的風險。

 

【全文索引】搜索引擎

  查找匹配的是文本中的關鍵詞,相似於搜索引擎spa


 

【索引的優勢】指針

  • 減小表數據的掃描數量,不用全表掃描了
  • 避免排序和臨時表【索引按順序的,節省了排序時間】。
  • 將隨機I/O變爲順序I/O

【重點】【高效實用索引的技巧】code

  1. 在索引列不要進行計算,例以下
    select student_id from student where student_id + 1 =5;

     

  2. 給text類型添加索引時,可使用前綴索引,就是將值的內容截取一部分做爲索引。blog

  3.  聯合索引(多列索引)要注意列順序。通常是考慮的因素是,使用率最高的列放到索引前列,避免隨機IO,排序。排序

  4. 聚簇索引,表示數據行和相鄰的鍵值緊湊的存儲在一塊兒。innodb默認會拿主鍵做爲聚簇索引,若沒有主鍵,就是用非空索引,主鍵爲順序的整數更加有利。
  5. 表中的索引越多,插入的速度越慢,準確的說是insert  update delete 
  6. 索引可讓查詢鎖定更少的行
  7. 確保任何group by和order by中的表達式只涉及到一個表中的列。
  8. 除非確實須要服務器小蟲重複的行,不然必定要使用union all,mysql是經過建立臨時表的方式來執行union查詢。

 

【MySQL可以使用三種方式應用WHERE條件,從好到壞的順序爲】索引

  1. 在索引中使用where條件來過濾不匹配的記錄,在存儲引擎層完成
  2. 使用索引覆蓋掃描來返回記錄,直接從索引中過濾不須要的記錄並返回命中的結果,在服務器層完成的
  3. 從數據表返回數據。

 


 

【查詢的執行流程】

  

相關文章
相關標籤/搜索