一、 ?索引的基礎
索引類似于書籍的目錄,要想找到一本書的某個特定主題,需要先查找書的目錄,定位對應的頁碼。
存儲引擎使用類似的方式進行數據查詢,先去索引當中找到對應的值,然后根據匹配的索引找到對應的數據行
二、 索引對性能的影響
優點:
1.大大減少服務器需要掃描的數據量
2.幫助服務器避免排序和臨時表
3.將隨機 I/O 變順序 I/O
4.大大提高查詢速度
缺點:
5.降低寫的速度(在執行寫操作時,會額外操作一遍索引)
6.占用磁盤
三、索引的使用場景
1.對于非常小的表,大部分情況下全表掃描效率會更高
2.對于中大型表來說,索引非常有效
3.特大型的表(上千萬,上億條數據),建立和使用索引的代價將會隨之增長,可以使用分區技術來解決
四、索引的類型
1.普通索引:最基本的索引,沒有任何限制
2.唯一索引:與普通索引類似,但是具有唯一性約束
3.主鍵索引:特殊的唯一索引,不允許有空值
4.組合索引:將多個列組合在一起創建索引,可以覆蓋多個列
5.外鍵索引:只有InnoDB的表才可以使用外鍵索引,保證數據的一致性,完整性,和實現級聯操作
6.全文索引:Mysql自帶的全文索引只能用于MYISAM,并且只能對英文進行全文檢索
主鍵索引和唯一索引的區別:
1.主鍵索引一定是唯一索引,但唯一索引不一定是主鍵索引
2.一個表只能有一個主鍵索引,但可能有多個唯一索引
3.主鍵可以與外鍵構成參照完整性約束,防止數據不一致
五、Mysql索引的創建原則
1.表的主鍵、外鍵必須有索引
2.主鍵盡可能選擇較短的數據類型,可以有效減少磁盤的占用,提高查詢效率(比如int)
3.經常與其他表進行連接的表,在連接字段上應該建立索引
4.經常出現在Where子句中的字段,特別是大表的字段,應該建立索引
5.索引應該建在小字段上,對于大的文本字段甚至超長字段,不要建索引
6.頻繁進行數據操作的表,不要建立太多的索引
7.避免創建過多索引,索引會額外占用磁盤空間,降低寫操作效率
8.對字符串進行索引,應該制定一個前綴長度,可以節省大量的索引空間
9.復合索引的建立需要進行仔細分析;盡量考慮用單字段索引代替
----復合索引建立原則:
1)復合索引的幾個字段是否經常同時以AND方式出現在Where子句中?單字段查詢是否極少甚至沒有?如果是,則可以建立復合索引;否則考慮單字段索引
2)如果復合索引中包含的字段經常單獨出現在Where子句中,則分解為多個單字段索引
3)如果復合索引所包含的字段超過3個,那么仔細考慮其必要性,考慮減少復合的字段
六、一般選擇在這樣的列上創建索引
1.在經常需要搜索查詢的列上創建索引,可以加快搜索的速度
2.在作為主鍵的列上創建索引,強制該列的唯一性和組織表中數據的排列結構
3.在經常用在連接的列上創建索引,這些列主要是一些外鍵,可以加快連接的速度
4.在經常需要根據范圍進行搜索的列上創建索引,因為索引已經排序,其指定的范圍是連續的
5.在經常需要排序的列上創建索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間
6.在經常使用在Where子句中的列上面創建索引,加快條件的判斷速度
7.為經常出現在關鍵字order by、group by、distinct后面的字段,建立索引
七、Mysql索引的注意事項
1.?限制表上的索引數目。對一個存在大量更新操作的表,所建索引的數目一般不要超過3個,最多不要超過5個。索引雖說提高了訪問速度,但太多索引會影響數據的更新操作
2.?刪除不再使用,或者很少被使用的索引。表中的數據被大量更新,或者數據的使用方式被改變后,原有的一些索引可能不再被需要。數據庫管理員應當定期找出這些索引,將它們刪除,從而減少索引對更新操作的影響
3.對復合索引,按照字段在查詢條件中出現的頻度建立索引。在復合索引中,記錄首先按照第一個字段排序。對于在第一個字段上取值相同的記錄,系統再按照第二個字段的取值排序,以此類推。因此只有復合索引的第一個字段出現在查詢條件中,該索引才可能被使用。因此將應用頻度高的字段,放置在復合索引的前面,會使系統最大可能地使用此索引,發揮索引的作用。
4.like查詢,%不能在前,否則索引會失效
一般情況下不鼓勵使用like操作,如果非使用不可,如何使用也是一個問題。like “%aaa%” 不會使用索引而like “aaa%”可以使用索引
5.索引不會包含有NULL值的列
只要列中包含有NULL值都將不會被包含在索引中,復合索引中只要有一列含有NULL值,那么這一列對于此復合索引就是無效的。所以我們在數據庫設計時不要讓字段的默認值為NULL。