MySQL中索引的介紹與使用查看
阿新 • • 發佈:2019-02-17
需要 from 簡單 key 引擎 實現 記錄 () range MySQL中的索引:
基本法則:索引應該構建在被用作查詢條件的字段上; 索引類型: B+ Tree索引:順序存儲,每一個葉子節點到根結點的距離是相同的;左前綴索引,適合查詢範圍類的數據; 可以使用B-Tree索引的查詢類型:全鍵值、鍵值範圍或鍵前綴查找; 全值匹配:精確某個值, "Jinjiao King"; 匹配最左前綴:只精確匹配起頭部分,"Jin%" 匹配範圍值: 精確匹配某一列並範圍匹配另一列: 只訪問索引的查詢 不適合使用B-Tree索引的場景: 如果不從最左列開始,索引無效; (Age,Name) 不能跳過索引中的列;(StuID,Name,Age) 如果查詢中某個列是為範圍查詢,那麽其右側的列都無法再使用索引優化查詢;(StuID,Name) Hash索引:基於哈希表實現,特別適用於精確匹配索引中的所有列; 註意:只有Memory存儲引擎支持顯式hash索引; 適用場景: 只支持等值比較查詢,包括=, IN(), <=>; 不適合使用hash索引的場景: 存儲的非為值的順序,因此,不適用於順序查詢; 不支持模糊匹配; 空間索引(R-Tree): MyISAM支持空間索引; 全文索引(FULLTEXT): 在文本中查找關鍵詞; 索引優點: 索引可以降低服務需要掃描的數據量,減少了IO次數; 索引可以幫助服務器避免排序和使用臨時表; 索引可以幫助將隨機I/O轉為順序I/O; 高性能索引策略: 獨立使用列,盡量避免其參與運算; 左前綴索引:索引構建於字段的左側的多少個字符,要通過索引選擇性來評估 索引選擇性:不重復的索引值和數據表的記錄總數的比值; 多列索引: AND操作時更適合使用多列索引; 選擇合適的索引列次序:將選擇性最高放左側; 冗余和重復索引: 不好的索引使用策略 通過EXPLAIN來分析索引的有效性: EXPLAIN SELECT clause 獲取查詢執行計劃信息,用來查看查詢優化器如何執行查詢; mysql> EXPLAIN SELECT name from student WHERE id>10\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: student type: range possible_keys: PRIMARY key: PRIMARY key_len: 4 ref: NULL rows: 8 Extra: Using where 1 row in set (0.00 sec) 輸出: 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: 直接返回單個行; NULL:類似於覆蓋查詢 possible_keys:查詢可能會用到的索引; key: 查詢中使用了的索引; key_len: 在索引使用的字節數; ref: 在利用key字段所表示的索引完成查詢時所有的列或某常量值;const表示固定值 rows:MySQL估計為找所有的目標行而需要讀取的行數; Extra:額外信息 Using index:MySQL將會使用覆蓋索引,以避免訪問表; Using where:MySQL服務器將在存儲引擎檢索後,再進行一次過濾; Using temporary:MySQL對結果排序時會使用臨時表; Using filesort:對結果使用一個外部索引排序;
MySQL中索引的介紹與使用查看