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