1. 程式人生 > >mysql索引詳解

mysql索引詳解

保存數據 關系 銀行卡號 訪問 問題 客戶 數據讀取 col 幫助

索引的定義
  MySQL官方對索引的定義為:索引(Index)是幫助MySQL高效獲取數據的數據結構.可以得出索引的本質就是數據結構
  你可以簡單理解為"排序好的快速查找數據結構"
  在數據之外,數據庫還維護著滿足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據,這樣就可以在這些數據結構的基礎上實現高級查找算法,這種數據結構就是索引
  一般來說索引本身很大,不適合全部存儲在內存中,因此索引往往以索引文件的形式存儲在磁盤上
  我們平常所說的索引,如果沒有特別指明,都是指B樹(多路搜索樹,並不一定是二叉的)結構組織的索引,其中聚集索引,次要索引,覆蓋索引
  復合索引,前綴索引,唯一索引默認都是使用B+樹索引,統稱索引.當然,除了B+樹這種類型的索引之外,還有哈稀索引(hash index)等

優勢


  類似大學圖書館建書目錄索引,提高數據檢索的效率,降低數據庫的IO成本
  通過索引列對數據進行排序,降低數據排序成本,降低了CPU的消耗
劣勢
  實際上索引也是一張表,該表保存了主鍵與索引字段,並指向實體表的記錄,所以索引也是要占內存空間的
  雖然索引大大提高了查詢速度,同時都會降低更新表的速度,如對表進行insert,update和delete
  因為更新表時,MySQL不僅要保存數據,還要保存一下索引文件每次更新添加了索引的字段,都會調整因為更新所帶來的鍵值變化後的索引信息
  索引只是高效的一個因素,如果你的MySQL有大數據量的表,就需要花時間研究建立最優秀的索引,或優化查詢方法

索引的分類

  單值索引:即一個索引只包含單個列,一個表不\可以有多個單列索引
  唯一索引:索引列的值必須唯一,但允許有控制,例如手機號,銀行卡號等值必須是唯一
  復合索引:即一個索引包含多個列,例如手機號和銀行卡號一起
基本語法
  創建:create [unique] index indexName on tbname(columnname(lenght))
  更改:alter table tbname add [unique] index [indexName] on (columnname(lenght))
  更改:alter table tbname add [unique] fulltext [indexName] on (columnname(lenght))#指定索引為fulltext,用於全文索引
  刪除:drop index [indexName] on tbname;
  查看:show index from tbname\G;

索引結構

  BTree索引
  Hash索引
  full-text全文索引
  R-Tree索引


哪種情況需要創建索引
  1.主鍵自動建立唯一索引
  2.頻繁作為查詢條件的字段應該創建索引
  3.查詢中與其他表關聯的字段,外鍵關系建立索引
  4.頻繁更新的字段不適合創建索引,因為每次更新不單單是更新數據還會更新索引
  5.Where條件裏用得到的字段適合創建索引
  6.單鍵/組合索引的選擇問題,在高並發下傾向創建組合索引
  7.查詢中排序的字段,排序字段若通過索引去訪問將大大提高排序速度
  8.查詢中統計或者分組字段
哪種情況不需要建索引
  1.表記錄太少(一般生產環境下,三百萬條記錄性能就可能開始下降,官方說的是五百萬到八百萬)
  2.經常增刪改的表
  3.某個數據列的值包含許多重復的內容

性能分析

1.MySQL Query Optimizer(查詢優化器)
  1.1MySQL中有專門負責優化select語句的優化器模塊,主要功能:通過計算分析系統中收集到的統計信息,為客戶端請求的query提供它認為最有的執行計劃(它認為最優的數據檢索方式,但不見得是DBA認為是最優的,這部分是最耗時間的)
  1.2當客戶端向MySQL請求一條query,命令解析其模塊完成請求分類,區別是select並轉發給MySQL Query Optimizer時,MySQL Query Optimizer首先會對整條Query進行優化,處理掉一些常量表達式的預算,直接轉換成常量值,並對query中的查詢條件進行簡化和轉換,如去掉一些無用或顯而易見的條件,結構調整等,然後分析query中的Hint信息(如果有),看顯示Hint信息是否可以完全確定該query的執行計劃,如果沒有Hint或Hint信息不足以完全確定執行計劃,則會讀取所涉及對象的統計信息,根據query進行寫相應的計算分析,然後再得出最後的執行計劃。

2.MySQL常見瓶頸
  CPU:CPU在飽和的時候一般發生在數據裝入內存或從磁盤讀取數據時候
  IO:磁盤IO瓶頸發生在裝入數據遠大於內存容量的時候
  服務器硬件的性能瓶頸,top,free,iostat和vmstat來查看系統的性能狀態

3.Explain
3.1能幹什麽
  表的讀取順序
  數據讀取操作的操作類型
  哪些索引可以使用
  哪些索引被實際使用
  表之間的引用
  每張表有多少被優化器查詢
3.2怎麽用
  explain+SQL語句
  執行計劃包含以下的信息
  id>select_type>table>type>possible_keys>key>key_len>ref>rows>extra

mysql索引詳解