mysql的索引和執行計劃

1、mysql的索引mysql

  索引是幫助mysql高效獲取數據的數據結構。本質:索引是數據結構sql

  1:索引分類數據結構

    普通索引:一個索引只包含單個列,一個表能夠有多個單列索引。優化

    惟一索引:索引列的值必須惟一 ,但容許有空值。遞歸

    複合索引:一個索引包含多個列。索引

    彙集索引:並非一種單獨的索引類型,而是一種數據存儲方式。innodb磁盤存儲,.ibd數據和索引放在一個文件夾下。io

    非彙集索引:不是彙集索引的,就是非彙集索引。innodb

  2:語法table

    查看索引        show index from table;select

    建立索引  

      create [unique] index indexname on table(columnname(length));

      alter table 表名 add [unique] index [indexname] on (columnname(length));  

    刪除索引  drop index [indexName] on table;

  3:適合建索引

    某一列相對來講惟一

    常常用來查詢顯示的列

    常常用來關聯的列 where 條件中用到的列,以及join on 用到的列

2、mysql的執行計劃

  使用explan關鍵字能夠知道mysql是如何處理SQL語句的。 

  id:相同,都不相同,不所有相同。

    相同:獲取select的執行順序。執行順序由上到下。

    都不相同:若是是子查詢,id序號會遞增,id值越大優先級越高,越先被執行。 

    不所有相同:id相同的認爲一組,從上往下順序執行。在全部組中,id值越大,優先級越高,越先被執行。

  select_type:查詢的類型

    simple:簡單的SQL語句,不包含union或者子查詢。 

    primary:查詢中包含任何的子查詢,最外層查詢被標記。

    subquery:在select和where中,查詢的任何子查詢。

    derived:在from列表中包含子查詢會被標記爲derived,mysql會遞歸執行這些子查詢,把結果放到臨時表。

    union:若第二個select出如今union以後,則標記爲UNION;若UNION包含在from子句的子查詢中,外層select將被標記爲derived。

    union result:從union表獲取結果的select。

  table:查詢來自那張表

  type:訪問的類型,重要的一個指標,結果從最好到最壞。

    system》const》eq_ref>ref>range>index>all,最好達到ref或者range

    system:表中只有一條記錄(等於系統表),這是const類型的特例,平時不會出現,這個能夠忽略不計。

    const:表示經過索引一次就找到了。用於primary或unique索引。由於只匹配一行數據。

    eq_ref:惟一索引掃描,對於每一個索引建,表中只有一條記錄匹配。常見於主鍵或惟一索引掃描。 

    ref:非惟一索引掃描,返回匹配某個單獨值的全部行。

    rang:只檢索給定範圍內的行,使用一個索引來選擇行。key列顯示使用那個索引,通常就是在你的where語句中出現between、<、>、in查詢中。

    index:當查詢的結果全爲索引列的時候。也是全表掃描的一種。只不過掃描的所有索引。

    all:全表掃描。

    注:當出現index和all的時候,就應該去優化SQL語句。

  key:實際所用的索引。若是爲null,則沒有使用索引。

  possible_key:可能用到的key。possible_key有數據,可是不必定會使用key。key有數據,可是不必定會使用possible_key。這二者比必定都同時出現。

  key_len:表示索引使用的字節數,經過該列查詢使用索引的長度。在不損失精確性的狀況下,長度越短越好。

  ref:顯示索引的哪一列被使用了,若是可能得話,是一個常數。

  rows:根據表的以及索引選用的狀況,大體估算出須要讀取的行數。掃描的行數越少越好。

  extra:包含不適合在其餘列中顯示,但重要的額外信息。

相關文章
相關標籤/搜索