標籤:範圍 type 避免 mysq nod range sort ffline 表示
MySQL索引
索引:是一種特殊的檔案(InnoDB 資料表上的索引是資料表空間的一個組成部分),它們包含著對資料表裡所有記錄的引用指標。其可以加快資料讀操作,但會使資料寫操作變慢;應該構建在被用作查詢條件的欄位上。
MySQL中的索引類型:
1.B+TREE索引
Balance Tree(平衡樹),是一種資料結構,由於其綜合效率較高,顯著減少定位記錄時所經曆的中間過程,從而加快存取速度。
可用來查詢的類型:
(1)全值匹配
(2)匹配最左首碼
(3)匹配列首碼
(4)匹配範圍值
但也有一些限制:
(1)必須從最左側開始查詢
(2)不能跳過某一索引
(3)如果查詢中某個列為範圍查詢,那麼其右側的列都無法再使用索引最佳化查詢;(精確範圍放左側,範圍查詢放右側即可;反之,右側將無法再使用索引查詢。)
2.Hash索引
基於雜湊表,適合精確匹配索引中的所有列;但只有Memory儲存引擎支援顯式hash索引;不支援模糊比對,不適用於順序查詢;
3.空間索引(R-TREE):
在MySQL中僅MyISAM儲存引擎支援空間索引;
4.全文索引(FULLTEXT):
在文本中尋找關鍵詞,類似於搜尋引擎;
MySQL中索引的管理:
/*建立索引*/CREATE INDEX index_name ON tbl_name(col1,col2,...);/*刪除索引*/DROP [ONLINE|OFFLINE] INDEX index_name ON tbl_name;/*查看索引*/SHOW {INDEX|INDEXES|KEYS} {FORM|IN} tbl_name [{FROM|IN} db_name] [WHERE expression];
如何分析索引有效性?
EXPLAIN SELECT Clause...
其輸出結果為:
各項指標的解釋如下:
id:當前查詢中SELECT語句的編號
select_type:查詢類型
/*相關的類型*/SIMPLE //簡單查詢SUBQUERY //簡單子查詢DERIVED //用於FROM的子查詢;UNION //UNION語句中UNION後的第一個SELECT語句UNION RESULT //UNION之後的總體臨時虛表
table:查詢關聯到的表
type:關聯類別型,即MySQL查詢表的方式
/*相關的類型*/ALL //全表掃描index //根據索引的次序進行全表掃描;如果在Extra中出現了“USING index”則表示使用了覆蓋索引,而非全表掃描range //有限制的根據索引實現的範圍掃描ref //根據索引返回表中匹配某單個值的所有行eq_ref //僅返回一行,但需要額外與某個參考值作比較const,system //直接返回單個行;此類型為最佳查詢;
possible_keys:查詢中可能會用到的索引
key:查詢中使用的索引
key_len:使用索引的位元組數
ref:在利用key所表示的索引完成查詢時所有的列或某常量值
row:MySQL找到目標所讀取的行數
Extra:額外資訊
/*額外資訊*/Using index //MySQL將會使用覆蓋索引,以避免訪問表;Using where //MySQL伺服器將在儲存引擎檢索後,再進行一次過濾;Using temporary //MySQL對結果排序時會使用暫存資料表;Using filesort //對結果使用一個外部索引排序(效能低下);
MySQL的索引