mysql的索引和執行計划


一、mysql的索引

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

  1:索引分類

    普通索引:一個索引只包含單個列,一個表可以有多個單列索引。

    唯一索引:索引列的值必須唯一 ,但允許有空值。

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

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

    非聚集索引:不是聚集索引的,就是非聚集索引。

  2:語法

    查看索引        show index from table;

    創建索引  

      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 用到的列

二、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:包含不適合在其他列中顯示,但重要的額外信息。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM