mysql高階(一)——索引和explain介紹
阿新 • • 發佈:2019-02-11
什麼是索引?
可以理解為排好序的快速查詢資料結構
優勢:
1.類似大學圖書館建書目索引,提高資料檢索的效率,降低資料庫的IO成本
2.通過索引對資料進行排序,降低資料排序的成本,降低了CPU的消耗
劣勢:
1.實際上索引也是一張表,儲存了主鍵和索引欄位,並指向實體表的記錄,所以索引也是要佔用空間的
2.雖然索引提高了查詢速度,但同時卻降低了更新表的速度,因為每次更新表,mysql不僅要更新資料。每次更新添加了索引列的欄位,都會調整因為更新帶來的鍵值變化後的索引資訊
3.索引只是提高效率的一個因素,如果mysql有大量的資料表,就需要研究建立最優索引,或優化查詢
索引的分類
- 單值索引:一個索引只包含單個列,一個表可以有多個單列索引
- 唯一索引:索引列的值必須唯一,但允許空值(CREATE UNIQUE INDEX indexName ON mytable(colName))
- 複合索引:即一個索引包含多個列
基本語法
- 建立:CREATE [UNIQUE] INDEX indexName ON mytable(colName)
ALTER TABLE mytable ADD [UNIQUE] INDEX indexName(colName) - 刪除:DROP INDEX [indexName] ON mytable
- 檢視:SHOW INDEX FROM table_name
索引結構
BTree索引
- Hash索引
- full-text全文索引
- R-Tree索引
哪些情況需要建立索引
- 主鍵自動建立唯一索引
- 頻繁作為查詢條件的欄位應該建立索引
- 查詢中與其他表關聯的欄位,外來鍵關係建立索引
- 頻繁更新的欄位不適合建立索引
- Where條件裡用不到的欄位不建立索引
- 高併發下傾向於建立組合索引
- 查詢中排序的欄位,排序欄位若通過索引去訪問將大大提高排序速度
- 查詢中統計或者分組的欄位
SQL效能分析
EXPLAIN
使用EXPLAIN關鍵字可以模擬優化器執行SQL查詢語句,從而知道Mysql是如何處理你的SQL語句的。分析你的查詢語句或是表結構的效能瓶頸。
下面我們就來分析表頭的這些欄位代表什麼。
id
id相同:
id不同:
id相同又不同:
select_type
常見的有:
SIMPLE、PRIMARY、SUBQUERY、DERIVED、UNION、UNION RESULT
- type
- possible_keys key
- key_len
- ref
顯示索引的哪一列被使用了,如果可能的話,是一個常數。哪些列或者常量被用於查詢索引列上的值。
- rows
根據表統計資訊及索引選用的情況,大致估算出找到所需的記錄所需要讀取的行數
- Extra
根包含不適合在其他列中顯示但十分重要的額外資訊