MySQL系列:索引和Explain

1、MySQL索引mysql

  1.索引(數據結構)sql

    (1) 索引按特定數據結構存儲的數據基本法則:索引應該構建在被用做查詢條件的字段上;數據庫

    (2) 索引相似於目的效果,爲真實數據文件的指針,能夠是單獨的文件服務器

    (3) 能夠存在多級形式,須要屢次磁盤IO數據結構

    (4) 當更新表會對索引有觸動,數據的改變其索引可能需重建,反而會影響性能ide

 

  2.索引類型性能

      按照不一樣的換分原則,能夠將索引從不一樣的層面進行闡述和理解:優化

彙集索引、非彙集索引:數據是否與索引存儲在一塊兒;spa

主鍵索引、輔助索引:數據庫表中的字段劃分指針

稠密索引、稀疏索引:是否索引了每個數據項;

B+ TREE索引、HASH(鍵值索引:適合一對一)、R TREE(空間索引)、全文索引… ….

簡單索引、組合索引

左前綴索引

     部分類型索引介紹

       (1)B+ Tree索引

              其爲順序存儲,每個葉子節點到根結點的距離是相同的;只訪問索引的查詢;屬於一種左前綴索引,適合查詢範圍類的數據;

            1) 能夠使用B-Tree索引的查詢類型

         全值匹配(精確某個值)

         匹配最左前綴(只精確匹配起頭部分)

         匹配範圍值

         精確匹配某一列並範圍匹配另外一列:

2) 不適合使用B-Tree索引的場景:

若是不從最左列開始,索引無效; (Age,Name)

不能跳過索引中的列;(StuID,Name,Age)

若是查詢中某個列是爲範圍查詢,那麼其右側的列都沒法再使用索引優化查詢;(StuID,Name)

      (2)Hash索引

               基於哈希表實現,特別適用於精確匹配索引中的全部列;只有Memory存儲引擎支持顯式hash索引;

   適用場景:只支持等值比較查詢,包括=, IN(), <=>;

   不適合使用hash索引的場景:存儲的非爲值的順序,所以,不適用於順序查詢;不支持模糊匹配;

      (3)空間索引(R-Tree):MyISAM支持空間索引;

      (4)全文索引(FULLTEXT):在文本中查找關鍵詞;

 

  3.索引增刪查改

建立索引:建立表時直接指定;CREATE INDEX

建立或刪除索引:修改表的命令

刪除索引:DROP INDEX

查看錶上的索引:

        SHOW {INDEX | INDEXES | KEYS} {FROM | IN} tbl_name [{FROM | IN} db_name][WHERE exprEXPLAIN

 

  4.索引優勢

索引能夠下降服務須要掃描的數據量,減小了IO次數;

索引能夠幫助服務器避免排序和使用臨時表;

索引能夠幫助將隨機I/O轉爲順序I/O;

 

  5.高性能索引策略

獨立使用列,儘可能避免其參與運算;

左前綴索引:索引構建於字段的左側的多少個字符,要經過索引選擇性來評估

索引選擇性:不重複的索引值和數據表的記錄總數的比值;

多列索引:AND操做時更適合使用多列索引;

選擇合適的索引列次序:將選擇性最高放左側;

冗餘和重複索引:很差的索引使用策略

 

 

 

2、Explain概述

  1.explain基礎

         explain顯示了mysql如何使用索引來處理select語句以及鏈接表。能夠幫助選擇更好的索引和寫出更優化的查詢語句。在select語句前加上explain便可。

         獲取查詢執行計劃信息,用來查看查詢優化器如何執行查詢;

 

  2.經過EXPLAIN來分析索引的有效性

    (1) 語法格式:

  EXPLAIN SELECT  "條件語句"

    (2) 輸出結果展現

id當前查詢語句中,每一個SELECT語句的編號;

複雜類型的查詢有三種:簡單子查詢用於FROM中的子查詢聯合查詢:UNION;

注意:UNION查詢的分析結果會出現一外額外匿名臨時表;

select_type:

簡單查詢爲SIMPLE

複雜查詢:

SUBQUERY: 簡單子查詢;

DERIVED: 用於FROM中的子查詢;

UNION:UNION語句的第一個以後的SELECT語句;

UNION RESULT: 匿名臨時表;

table:SELECT語句關聯到的表;

type:關聯類型,或訪問類型,即MySQL決定的如何去查詢表中的行的方式;

ALL: 全表掃描;

index:根據索引的次序進行全表掃描;在Extra列出現「Using index」表示使用覆蓋索引,而非全表掃描;

range:有範圍限制的根據索引實現範圍掃描;掃描位置始於索引中的某一點,結束於另外一點;

ref: 根據索引返回表中匹配某單個值的全部行;

eq_ref:僅返回一個行,但與須要額外與某個參考值作比較;

const, system: 直接返回單個行;

possible_keys:查詢可能會用到的索引;

key: 查詢中使用了的索引;

key_len: 在索引使用的字節數;

ref: 在利用key字段所表示的索引完成查詢時全部的列或某常量值;

rows:MySQL估計爲找全部的目標行而須要讀取的行數;

Extra:額外信息

Using index:MySQL將會使用覆蓋索引,以免訪問表;

Using where:MySQL服務器將在存儲引擎檢索後,再進行一次過濾;

Using temporary:MySQL對結果排序時會使用臨時表;

Using filesort:對結果使用一個外部索引排序;

相關文章
相關標籤/搜索