學習筆記-mysql_索引

索引:mysql

myisam 和 innodb 存儲引擎 只支持 btree 索引sql

memory 和 heap 存儲引擎 能夠支持 hash 和 btree 索引服務器


索引的分類:ide

1.普通索引和惟一索引性能

2.單列索引和組合索引優化

3.全文索引  (只要myisam 才支持)spa

4.空間索引  (只對空間數據類型的字段創建索引  geometry  point linestring polygon)排序


查看建立表中的索引:索引


show index from table;文檔


Table 表的名稱。

Non_unique 若是索引不能包括重複詞,則爲0。若是能夠,則爲1。

Key_name 索引的名稱。

Seq_in_index 索引中的列序列號,從1開始。

Column_name 列名稱。

Collation 列以什麼方式存儲在索引中。在MySQL中,有值‘A’(升序)或NULL(無分類)。

Cardinality 索引中惟一值的數目的估計值。經過運行ANALYZE TABLE或myisamchk -a能夠更新。基數根據被存儲爲整數的統計數據來計數,因此即便對於小型表,該值也沒有必要是精確的。基數越大,當進行聯合時,MySQL使用該索引的機會就越大。

Sub_part 若是列只是被部分地編入索引,則爲被編入索引的字符的數目。若是整列被編入索引,則爲NULL。

Packed 指示關鍵字如何被壓縮。若是沒有被壓縮,則爲NULL。

Null 若是列含有NULL,則含有YES。若是沒有,則該列含有NO。

Index_type 用過的索引方法(BTREE, FULLTEXT, HASH, RTREE)。

Comment 多種評註。


建立表的時候建立索引


create table table_name [col_name data_type]

[unique|fulltext|spatial][index|key][index_name](col_name[length],...)[asc|desc]


unique fulltext spatial 建立索引  分別表示 惟一索引  全文索引  和空間索引

index與key爲同義詞,二者做用相同 用來指定建立索引:col_name 爲須要建立索引的字段列  index_name 爲索引名稱 爲可選參數

length爲可選參數 表示索引的長度(只有字符類型的字段才能指定索引長度)

asc 或 desc 指定升序或者降序的索引值存儲


更改表建立索引


alter table table_name add [unique|fulltext|spatial] [index|key]

[index_name](col_name(length),...)[asc|desc]


使用create index 建立索引


create [unique|fulltext|spatial] index [index_name]

on table_name (col_name(length),...) [asc|desc]


刪除索引經過alter


alter table table_name drop index index_name;


刪除索引使用drop index


drop index index_name on table_name;


explain 語句查看全部是否正在使用索引:


id :select查詢的序列號


select_type:select查詢的類型,主要是區別普通查詢和聯合查詢、子查詢之類的複雜查詢。

a.SIMPLE:查詢中不包含子查詢或者UNION

b.查詢中若包含任何複雜的子部分,最外層查詢則被標記爲:PRIMARY

c.在SELECT或WHERE列表中包含了子查詢,該子查詢被標記爲:SUBQUERY

d.在FROM列表中包含的子查詢被標記爲:DERIVED(衍生)

e.若第二個SELECT出如今UNION以後,則被標記爲UNION;若UNION包含在 FROM子句的子查詢中,外層SELECT將被標記爲:DERIVED

f.從UNION表獲取結果的SELECT被標記爲:UNION RESULT


table :輸出的行所引用的表。


type :聯合查詢所使用的類型,表示MySQL在表中找到所需行的方式,又稱「訪問類型」。

type顯示的是訪問類型,是較爲重要的一個指標,結果值從好到壞依次是: 

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL ,通常來講,得保證查詢至少達到range級別,最好能達到ref。

ALL: 掃描全表

index: 掃描所有索引樹

range: 掃描部分索引,索引範圍掃描,對索引的掃描開始於某一點,返回匹配值域的行,常見於between、<、>等的查詢

ref: 非惟一性索引掃描,返回匹配某個單獨值的全部行。常見於使用非惟一索引即惟一索引的非惟一前綴進行的查找

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

const, system: 當MySQL對查詢某部分進行優化,並轉換爲一個常量時,使用這些類型訪問。如將主鍵置於where列表中,MySQL就能將該查詢轉換爲一個常量。system是const類型的特例,當查詢的表只有一行的狀況下, 使用system。

NULL: MySQL在優化過程當中分解語句,執行時甚至不用訪問表或索引。


possible_keys:指出MySQL能使用哪一個索引在該表中找到行。查詢涉及到的字段上若存在索引,則該索引將被列出,但不必定被查詢使用。若是是空的,沒有相關的索引。這時要提升性能,可經過檢驗WHERE子句,看是否引用某些字段,或者檢查字段不是適合索引。 


key :顯示MySQL實際決定使用的鍵。若是沒有索引被選擇,鍵是NULL。

 

key_len:顯示MySQL決定使用的鍵長度。表示索引中使用的字節數,可經過該列計算查詢中使用的索引的長度。若是鍵是NULL,長度就是NULL。文檔提示特別注意這個值能夠得出一個多重主鍵裏mysql實際使用了哪一部分。

 注:key_len顯示的值爲索引字段的最大可能長度,並不是實際使用長度,即key_len是根據表定義計算而得,不是經過表內檢索出的。


ref:顯示哪一個字段或常數與key一塊兒被使用。

 

rows:這個數表示mysql要遍歷多少數據才能找到,表示MySQL根據表統計信息及索引選用狀況,估算的找到所需的記錄所須要讀取的行數,在innodb上多是不許確的。

 

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

Only index,這意味着信息只用索引樹中的信息檢索出的,這比掃描整個表要快。 

using where是使用上了where限制,表示MySQL服務器在存儲引擎受到記錄後進行「後過濾」(Post-filter),若是查詢未能使用索引,Using where的做用只是提醒咱們MySQL將用where子句來過濾結果集。

impossible where 表示用不着where,通常就是沒查出來啥。 

Using filesort(MySQL中沒法利用索引完成的排序操做稱爲「文件排序」)當咱們試圖對一個沒有索引的字段進行排序時,就是filesoft。它跟文件沒有任何關係,其實是內部的一個快速排序。 

Using temporary(表示MySQL須要使用臨時表來存儲結果集,常見於排序和分組查詢),使用filesort和temporary的話會很吃力,WHERE和ORDER BY的索引常常沒法兼顧,若是按照WHERE來肯定索引,那麼在ORDER BY時,就必然會引發Using filesort,這就要看是先過濾再排序划算,仍是先排序再過濾划算。

相關文章
相關標籤/搜索