索引: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,這就要看是先過濾再排序划算,仍是先排序再過濾划算。