MYSQL索引

什麼是索引?

舉個例子:新華字典,有目錄,有正文內容。索引就至關於目錄,正文內容就至關於數據。

索引有什麼用?

索引用於快速查找在某列中有一特定值的行。

一條查詢語句,若是沒有索引,將對全表進行掃描。函數

若是全部的數據頁面都不在內存中,則須要從硬盤上讀取這些頁面,從而產生大量的I/O,每次I/O都會消耗必定時間。code

最終,總的查詢時間,會大的驚人。索引

使用索引

若此時查詢列有個索引,MYSQL 就能快速定位到具體位置,找出相關列,將指定數據頁面讀入內存,I/O 就會大大下降。內存

以字典爲例,查找字母爲 Z 開頭的某個單詞,先經過索引定位 Z 開頭的單詞的起始位置,從這裏開始查詢,從而節省了大量的時間。

一次查詢能使用多個索引嗎?

一次查詢只能使用一個索引。

哪些常見狀況不能用索引?

like 「%xxx」

 not in , !=

 對列進行函數運算的狀況(如 where avg(age) = 「20」)

如何分析是否正確用到索引?

explain select ...

聯合索引的問題

假設,你有一個三列聯合的索引:(col1, col2, col3)。字符串

那麼你將擁有三種索引使用方式:效率

(col1)

 (col1, col2)

 (col1, col2, col3)

上述說的就是最左前綴 - leftmost prefix。select

So,當你有多列查詢需求時,你能夠考慮建一個合適的聯合索引。引用

關於like查詢

like 的參數不以非通配符 % 開頭的字符常量,就能使用索引。數據

SELECT * FROM tbl_name WHERE key_col LIKE 'something%';        //匹配以something開頭的字符串
SELECT * FROM tbl_name WHERE key_col LIKE '%something%';       //不使用索引
SELECT * FROM tbl_name WHERE key_col LIKE 'something';         //精確匹配,等效於 「 = 」 運算符

假如,你在看一本成語詞典,目錄是按成語拼音順序創建。查詢

查詢需求是:你想找以 「一」 字開頭的成語(「一%」),和你想找包含一字的成語(「%一%」)。

你以爲哪一個會更快呢?

索引越多越好?

大多數狀況下,索引都能大幅度提升查詢效率。

數據的增、刪、改操做都須要維護索引,索引一多,意味着維護成本高了。

更多的索引須要更多的存儲空間。好比:20頁的書,有15頁的目錄?這就不合理了。

小表建索引,每每拔苗助長。好比:讀個2頁的宣傳手冊,你還先去找目錄?

什麼樣的字段不適合建索引?

更新很是頻繁的列

列的值惟一性過小,好比性別,Enum 類型的字段等

太長的列
相關文章
相關標籤/搜索