MySQL系列:索引

1 索引

MySQL索引是一種數據結構,提高數據查詢速度,降低數據庫I/O成本,MySQL在300萬行數據左右性能開始逐漸下降.

1.0 爲什麼使用索引

提高數據查詢速度.

1.2 SQL執行慢的原因

序號 描述
1 硬件問題,網絡速度慢,內存不足,I/O吞吐量小,磁盤空間已滿等
2 沒有索引或索引失效
3 數據過多(分庫分表)
4 服務器未調優及各參數配置

2 索引優缺點

2.1 優點

序號 描述
1 大大減少服務器需要掃描的數據量,如B-Tree索引,不會掃描全表
2 幫助服務器避免排序和臨時表,B-Tree索引順序存儲數據,使用即排序
3 將隨機I/O變成順序I/O,B-Tree索引順序存儲數據
4 通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性
5 大大提高數據檢索速度
6 加速表和表之間的連接
7 使用分組和排序語句進行數據檢索時,索引可顯著減小查詢中分析和排序時間
8 查詢過程中,使用優化隱藏器,提高系統性能

InnoDB引擎所有MySQL列類型(字段類型)都可以被索引,也可以給任意字段設置索引;
結果:加快數據查詢速度;

2.2 缺點

序號 描述
1 創建和維護索引耗費時間,且隨着數據量的增加,創建和維護成本增加
2 索引佔用磁盤空間,數據表中的數據有最大上限設置,若有大量索引,索引文件可能比數據更快達到上限值
3 當對錶中的數據進行增刪改時,索引需要動態維護,降低數據維護速度

3 使用原則

序號 場景 使用索引 部分索引 不使用索引 備註
數據表經常更新 避免過多索引,僅對經常查詢的字段創建索引
表數據量小 數據量較小,查詢全部數據花費的時間可能比遍歷索引的時間短,此時的索引不起優化作用
字段數據類型少的列 如性別字段,只有兩種數據,不建索引,若值種類較多,使用索引

4 索引種類

4.1 單列索引

每個索引中只包含一個列(字段),一個表中可以有多個單列索引;

序號 索引 描述
1 普通索引 基本索引類型,基本無限制,允許在定義索引的列中插入重複的值或空值,爲了提高查詢速度
2 唯一索引 索引列中的值必須是唯一的,允許空值
3 主鍵索引 特殊的唯一索引,不允許有空值,MySQL中主鍵爲默認索引

4.2 組合索引

數據表中多個列上創建索引,順序使用,從左到右,不可跳着使用索引,最左前綴規則,如多個索引(id,name,sex),順序依次爲id,name和sex,查詢走索引:(id,name,sex)和(id,name),查詢不走索引:(id,sex),sex,(sex,name).

4.3 全文索引

只有MyISAM存儲引擎可用,只能在CHAR,VARCHAR和TEXT類型字段上使用全文索引,全文索引,即在某段文字中,通過關鍵字查詢該行數據.

4.4空間索引

對空間數據類型字段建立的索引,MySQL中空間數據類型有四種:GEOMETRY,POINT,LINESTRING和POLYGON,創建空間索引時,使用SPATIAL關鍵字,MyISAM引擎創建空間索引的列,爲NOT NULL.

5 索引方式

5.1 聚簇索引

索引項的排序方式和數據表中數據記錄排序方式一致(如字典拼音目錄按照A~ Z排序,漢字也是按照A~Z的拼音排列),每張表只能有一個聚簇索引(聚簇索引葉子頁包含索引項和整個行數據).
聚簇索引不是單獨的索引類型,而是一種數據存儲方式,即BTree索引+記錄的數據行.

  • 優點
序號 描述
1 將相關數據保存在一起,減少磁盤I/O
2 數據訪問更快,避免全表掃描
3 使用覆蓋索引掃描的查詢可以直接使用葉結點中的主鍵值
  • 缺點
序號 描述
1 最大限度地提高了I/O密集型應用的性能,但如果數據全放內存中,訪問順序就沒有那麼重要了,聚簇索引也沒有特別的優勢了
2 插入速度嚴重依賴插入順序
3 更新聚簇索引的代價很高
4 插入新行或主鍵更新需要移動時,可能面臨頁分裂,當行的主鍵要求必須插入到某個已滿的頁中時,存儲已經會將該頁分裂成兩個頁面來容納該行,這是一次頁分裂操作,頁分裂會導致數據表佔用更多的磁片空間
5 二級索引即普通索引,在其葉子節點包含了引用行的主鍵列

5.2 非聚簇索引(輔助索引)

非聚簇索引也稱輔助索引,非聚簇索引的邏輯順序與磁盤上的物理存儲順序不同,一個數據表中可以有多個非聚簇索引,葉子頁不包含行記錄的所有數據,葉子頁除了包含鍵值,還存儲指向行數據的聚簇索引鍵的標籤(存儲的爲行號),非聚簇索引搜索兩次,通過鍵值查詢到行號,通過行號定位行數據.

6 索引失效的情況

序號 索引失效
1 like以%開頭無效,以%結尾有效
2 or語句前後沒有同時使用索引,當or左右查詢字段只有一個是索引,索引失效
3 組合索引,不是第一列索引,跳列查詢
4 數據類型出現隱式轉化,如varchar不加單引號可能自動轉換爲int型,使用索引無效,全表掃描
5 在索引列上使用IS NULL或IS NOT NULL,索引是不會索引空值的
6 索引字段上使用not,<>,!=
7 對索引字段進行計算操作,字段上使用函數
8 全表掃描速度比索引速度快時,mysql會使用全表掃描,索引無效

7 索引分析工具

EXPLAIN


參考文獻
[1]https://blog.csdn.net/qq_36906627/article/details/86634518
[2]https://blog.csdn.net/Xin_101/article/details/102580278
[3]https://www.jianshu.com/p/0d6c828d3c70
[4]https://www.cnblogs.com/Aiapple/p/5693239.html
[5]https://www.cnblogs.com/nov5026/p/11210078.html
[6]https://blog.csdn.net/u013308490/article/details/83001060
[7]https://www.cnblogs.com/wdss/p/11186411.html
[8]https://www.cnblogs.com/qixidi/p/10260180.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章