舉個例子:新華字典,有目錄,有正文內容。索引就至關於目錄,正文內容就至關於數據。
索引用於快速查找在某列中有一特定值的行。
一條查詢語句,若是沒有索引,將對全表進行掃描。函數
若是全部的數據頁面都不在內存中,則須要從硬盤上讀取這些頁面,從而產生大量的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 的參數不以非通配符 % 開頭的字符常量,就能使用索引。數據
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 類型的字段等 太長的列