目錄mysql
是什麼: 排好序的快速查找數據結構sql
兩個主要的索引結構: B+tree 索引和哈希索引。數據庫
如何建: 1. ALTER TABLE table_name ADD INDEX index_name (column_list); 2. CREATE INDEX index_name ON table_name (column_list);緩存
優勢: 相似大學圖書館建書目索引,提升了檢索效率,下降了數據庫IO,同時還能夠經過索引進行排序,下降數據排序的成本,下降了CPU的消耗數據結構
缺點: 雖然索引大大提升了查詢速度,同時卻會下降更新表的速度,如對錶進行 insert
、update
和delete
,由於更新表時不只要保存數據,還要保存一下索引文件每次更新添加了索引列的字段。性能
1.主鍵索引:主鍵是一種惟一性索引,但它必須指定爲PRIMARY KEY
,每一個表只能有一個主鍵優化
ALTER TABLE table_name ADD PRIMARY KEY (column_list)
2.惟一索引:索引列的全部值都只能出現一次,即必須 惟一,值能夠爲 空code
ALTER TABLE table_name ADD UNIQUE (column_list)
3.普通索引:基本的索引類型,值能夠爲空,沒有惟一性的限制blog
ALTER TABLE table_name ADD INDEX index_name (column_list);
4.全文索引: 全文索引的索引類型爲 FULLTEXT,全文索引只能建立在CHAR、VARCHAR、TEXT類型的字段上。查詢數據量較大的字符串類型字段時,使用全文索引能夠提升查詢速度排序
ALTER TABLE table_name ADD FULLTEXT INDEX index_name(column_list);
對於MySQL的索引建立,咱們常常有疑慮,那麼何時該建何時不應建呢?
哪些狀況須要建立索引
主鍵自動建立惟一索引
頻繁做爲查詢條件的字段應該建立索引
查詢中與其它表關聯的字段,外鍵關係創建索引
查詢中排序的字段,排序字段若經過索引去訪問將大大提升排序速度
查詢中統計或者分組字段
哪些狀況不須要建索引
where
條件用不到的字段不適合建立索引
Explain簡稱執行計劃,使用Explain關鍵字能夠模擬優化器執行SQL查詢語句
用法:explain + SQL
① id 相同執行順序由上至下
② id 不一樣,若是是子查詢,id的序號會遞增,id值越大優先級越高,越先被執行
③ id相同不相同,不相同
注:id若是相同,能夠認爲是一組,從上往下順序執行;在全部組中,id值越大,優先級越高,越先執行
select
查詢,查詢中不包含子查詢或者 union
select
或where
列表中包含了子查詢from
列表中包含的子查詢被標記爲 derived(衍生)select
出如今以後,則被標記爲 union
(若union
包含from
子句的子查詢中,外層select
將被標記爲:derived)union
表獲取結果的 select
從好到壞,system > const > eq_ref > ref > range > index > all
where
語句中出現了 between、<、>、in等的查詢
查詢中若使用了覆蓋索引,則該索引與查詢的select字段重疊
注:由key_len
可知t1
表的idx_col1_col2
被充分使用,col1
匹配t2
表的col1
,col2
匹配了一個常量,即 'ac'
order by
和分組查詢 group by
select
操做中使用了覆蓋索引(Covering Index),避免訪問了表的數據行,效率不錯!where
過濾where
子句的值老是false,不能用來獲取任何數據
select
操做已經優化到不能再優化了(MySQL根本沒有遍歷表或索引就返回數據了distinc
關鍵字心法:
針對explain命令生成的執行計劃,這裏有一個查看心法。咱們能夠先從查詢類型type列開始查看,若是出現all關鍵字,後面的內容就均可以不用看了,表明全表掃描。再看key列,看是否使用了索引,null表明沒有使用索引。而後看rows列,該列用來表示在SQL執行過程當中被掃描的行數,該數值越大,意味着須要掃描的行數越多,相應的耗時越長,最後看Extra列,在這列中要觀察是否有Using filesort 或者Using temporary 這樣的關鍵字出現,這些是很影響數據庫性能的。