1. 程式人生 > 其它 >MySQL --- 讀書筆記 --- 索引(1)

MySQL --- 讀書筆記 --- 索引(1)

索引的分類

  1. 普通索引
  2. 主鍵索引
  3. 唯一索引
  4. 聯合索引

建立索引

  • 建立表時建立索引
CREATE TABLE table_name [col_name data_type]
[UNIQUE] INDEX index_name (col_name) [ASC | DESC]
  • 已建立表時建立索引
ALTER TABLE table_name ADD [INDEX | UNIQUE] index_name(col_name)

刪除索引

ALTER TABLE table_name DROP INDEX index_name
DROP INDEX index_name ON table_name

MySQL8.0索引

  • 支援降序索引
  • 隱藏索引,設定索引為隱藏後,SQL的執行將不會使用這個索引,在確定系統不受影響之後,就可以徹底刪除,設定隱藏是一種軟刪除

索引的設計原則

一、哪些情況適合建立索引

1. 欄位的數值有唯一性的限制

  • 當表中某一個數據在業務上具有唯一性的特徵時,應該為其建立唯一性索引或者主鍵索引
  • 即使是組合欄位,只要是業務上具有唯一性,也應該為其建立唯一索引
  • 新增唯一索引會影響插入的速度,但是這個損耗相對查詢速度的提升,是可以忽略的

2. 頻繁作為WHERE查詢條件的欄位

  • 當一個欄位經常在查詢條件中出現,那麼就應該考慮為其新增索引

3. 經常出現在GROUP BYORDER BY
中的欄位

  • 索引就是讓資料以某種順序有序地儲存並檢索,那麼使用GROUP BY或者ORDER BY檢索時,就需要對這個欄位進行索引,如果有多個欄位,那麼可以考慮聯合索引

  • GROUP BY是對相同的值進行分組,那麼索引的欄位本身就是相同的值會在一起,那麼欄位建立索引後,分組檢索速度會提升

  • ORDER BY是對某欄位排序,欄位索引後,本身就是有序的,那麼會減少排序的時間,排序檢索速度會提升

4. UPDATEDELETEWHERE條件欄位

  • 如果進行更新的時候,更新欄位不是索引欄位,那麼效率會更高,因為不需要對索引欄位進行維護

5. DISTINCT欄位需要建立索引

  • 索引後的欄位,相同的值都會放在一起,去重就更高效率

6. 多表JOIN操作時,建立索引注意事項

  1. 連線表的數量儘量不超過3,因為每增加一張表,相當於增加一次巢狀迴圈,時間呈指數級別增加
  2. WHERE條件欄位索引,因為WHERE是對資料的過濾,如果資料量很大的時候,沒有過濾的資料是非常大的
  3. 對用於連線的欄位建立索引,並且該欄位在兩張表中的型別必須一致,因為當型別不一致的時候,系統會隱式呼叫函式對欄位進行轉換,一旦使用函式,索引就會失效

7. 使用列的型別小的建立索引

  • 型別小指的是型別表示的資料範圍小
  • 對於資料類型範圍更小的列,它所佔的空間越小,那麼頁中儲存的資料也就更多,那麼磁碟I/O次數也就更少
  • 資料型別越小,查詢時的比較操作越快
  • 對於主鍵來說更是如此,因為主鍵不僅僅在聚簇索引中,二級索引中也有存有主鍵,主鍵更小,也就能節省更多的儲存空間以及更高效的I/O

8. 使用字串的字首建立索引

當字串很長時,它需要佔用比較大的儲存空間,當為其建立索引的時候,需要記錄完整的字串,更費時,索引佔用的空間越大,而且在做比較時耗時更多

可以通過擷取字串一部分內容建立索引,叫做字首索引。這樣在檢索時,雖然不能精確定位到記錄,但是可以定位到記錄的字首位置,然後再回表查詢。這樣既節約了空間,又減少了字串比較的時間,還大體能解決排序的問題

如何選擇擷取的長度呢,長了達不到節約空間的目的,短了資料重複性太高,資料的選擇性會降低

  • 可以計算一下欄位在表中的選擇度是多少
select count(distinct left(address_name, num)) / count(*) from table_name;

通過擷取不同的長度,比較它們之間的選擇度,越大,代表選擇度越高

9. 區分度(雜湊性)高的列適合做索引

10. 使用最頻繁的列放在聯合索引的左側

11. 在多個欄位都要建立索引的時候,聯合索引優於單值索引

  • 這樣可以較少建立索引,同時,由於“最左字首原則”,提高聯合索引的使用率

二、限制索引的數目

在實際中,索引的數量不是越多越好,建議每張表的索引不超過6個

  • 因為每個索引都需要佔用空間
  • 索引會影響增刪改的效能
  • 優化器在優化查詢時,會對每一個可以用到的索引進行評估,如果有多個索引都可以選擇,那麼在生成執行計劃時消耗時間也就多

三、哪些情況下不能建立索引

1. 在WHERE中使用不到的欄位,不要設定索引

  • 包括在GROUP BYORDER BY中用不到的

2. 資料量少的表最好不要設定索引

  • 表的資料量太少,比如少於1000條記錄,那麼是不需要建立索引的;記錄太少,是否建立索引對查詢效率的影響並不大,甚至說,查詢花費的時間可能比遍歷索引的時間還要短

3. 有大量重複資料的列不要建立索引

  • 區分度太低,不但不會提高查詢效率,反而會嚴重降低資料更新的速度

4. 避免對經常更新的表建立過多的索引

5. 不建議用無序的值作為索引

6. 刪除不再使用或者很少使用的索引

7. 不要定義重複或者冗餘的索引