mysql索引學習筆記

什麼是索引?
所謂索引就是對數據庫表中的一列或多列的值進行排列的一種數據結構,好比BTREE或哈希排序算法,本質是經過不斷的縮小獲取數據的範圍來篩選出最終想要的結果。
索引也是一張表,該表保存了主鍵與索引字段,及全部記錄的引用指針。
mysql


索引的類型
UNIQUE惟一索引

索引列的值必須惟一,能夠有NULL值。用於保證表中每一行數據的惟一性。
INDEX普通索引
容許定義索引列的值出現重複值和空值。用於加快數據的檢索速度。
PRIMARY KEY主鍵索引
不容許出現相同的值,且不能爲NULL值。一個表只有一個主鍵。
fulltext index 全文索引
在MySQL5.6如下,只有MyISAM表支持全文檢索。在MySQL5.6以上Innodb引擎表也提供支持全文檢索,但只適用於CHAR、VARCHAR和TEXT類型的字段,MySQL不支持中文全文索引
算法

按包含的列數又分爲
1,單列索引

只包含單個列,一個表可有多個單列索引。
若where條件只有一個,用單列索引查詢速度較快。
如有多個組合列,不要試圖分別基於單個列創建多個單列索引,由於儘管每一個列都有索引,mysql只會用其中最有效率的列,即那個得到結果集記錄最少的列。
2,複合索引
包含多個字段,只有在查詢條件中使用了這些字段最左邊的字段時,索引纔會被應用。
只要列中包含null值就不會包含在索引中,聯合索引中只要有一列含有null值,那麼這一列的對於符合索引就是無效,也正是表設計時不要讓字段默認值爲null的緣由。
對於一張表來講,若是有一個複合索引,就不必同時創建對應的單列索引。
sql

索引不會被引用的狀況數據庫

1.若mysql估計使用全表掃描要比使用索引快時,則不使用索引
2.索引列參與數學運算和函數運算不會被引用
3.含null值列的複合索引不會被引用
4.先後都有通配符的查詢內容,索引不會被引用
5.Mysql查詢只使用一個索引,若where子句已使用索引,那麼order by中的列不會使用索引
6.用or分割的條件,若or前的條件中的列有索引,而or後面的列沒有索引,那麼涉及的全部索引都不會被用到
7.以%開頭的like查詢不會用到索引
數據結構

索引的弊端
索引並非越多越好。索引可提升查詢效率,但會下降寫數據的效率,增大IO壓力,索引佔用磁盤空間是成倍增長的,且很差的索引還會下降查詢效率。
函數

1,隨着數據量的增長,建立和維護索引要耗費時間也會增長。
2,索引須要佔用磁盤空間,如有大量索引,索引文件可能比數據文件還大。
3,當對錶中的數據進行增長、刪除和修改時,索引也要動態更新,會增大IO壓力。
spa

建立索引的技巧
1.不要在低基數的列上創建索引。count(distinct)/count(*)>0.6
2.對where,group by,order by 中出現的列創建索引。
3.爲較長的字符串使用前綴索引,即索引字段應儘量的小。
4.不要在頻繁更新的表創建過多的索引。
5.數據量小的表最好不要使用索引。
6.當惟一性是某列數據自己的特徵時,可創建惟一索引。
7.儘可能使用短索引,即索引列字段值較短、索引字段數少於5個。
8. 在建立複合索引時,where子句中不重複值最多的一列放在最左邊。
9.對字符串列創建前綴索引,適用於字符串自己較長,且前幾個字符就開始不一樣的狀況(即前幾個字符的選擇性接近於全字段索引的選擇性)。
設計

ALTER TABLE tablename ADD KEY(column_name(prefix_length))指針

前綴索引能有效減少索引文件的大小,提升索引速度。但mysql沒法使用前綴索引作ORDER BY和GROUP BY,也沒法使用前綴索引作覆蓋索引(covering index)。排序

10.Covering index覆蓋索引,即一個索引包含全部須要查詢字段的列。
Select a from tablename where b=…
創建一個複合索引「b,a」

explain的extra字段值爲using index說明使用的是covering index

建立索引的準備
用explain來解釋select語句,查看執行計劃是否用到了索引。Update、insert語句可拿出where子句轉換爲select語句。

explain重要參數介紹

1,id字段數字越大越先執行 2,table是表名 3,type是指本數據表與其餘數據表間的關係      1)all即全表掃描數據表      2)eq_ref引用了惟一索引或主鍵      3)const引用了惟一索引或主鍵      4)index索引被所有掃描 4,key查詢真正使用的索引名 5,rows執行計劃中估計的掃描行數 6,extra額外信息,常見值有using where/using filesort/using temporary,見到後面兩者趕忙建索引  

相關文章
相關標籤/搜索