mysql索引詳解
索引的定義
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索引詳解