索引到底對查詢速度有什麼影響?

2020-07-16 10:05:26
索引是資料庫優化中最常用也是最重要的手段之一,通過索引可以幫助使用者解決大多數的 SQL 效能問題。

多數情況下,查詢速度很慢時,加上索引便能解決問題。但也並非總是如此,因為優化不是件簡單的事情。但是如果你不使用索引,在許多情況下,嘗試通過其它途徑來提高效能都純粹是在浪費時間。應該首先使用索引來最大程度的改善效能,然後再看看是否還有其它有用的技術。

索引提供了高效存取資料的方法,能夠快速的定位表中的某條記錄,加快資料庫查詢的速度,從而提高資料庫的效能。

如果查詢時不使用索引,那麼查詢語句將查詢表中的所有欄位。這樣查詢的速度會很慢。使用索引進行查詢,查詢語句不必讀完表中的所有記錄,而只查詢索引欄位。這樣可以減少查詢的記錄數,達到提高查詢速度的目的。

下面通過對比使用索引和不使用索引來分析索引對查詢速度的影響。

例 1

為了便於讀者更好的理解,分析之前,我們先查詢一下 tb_students_info 資料表中的記錄,SQL 語句和執行結果如下:
mysql> SELECT * FROM tb_students_info;
+----+------+
| id | name |
+----+------+
|  1 | 張三 |
|  2 | 李四 |
|  3 | 王五 |
|  4 | 趙六 |
|  5 | 週七 |
|  6 | 吳八 |
|  7 | 朱九 |
|  8 | 蘇十 |
+----+------+
8 rows in set (0.02 sec)
使用 EXPLAIN 分析未使用索引時的查詢情況,SQL 語句和執行結果如下:
mysql> EXPLAIN SELECT * FROM tb_students_info WHERE name='張三' G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tb_students_info
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 8
     filtered: 12.50
        Extra: Using where
1 row in set, 1 warning (0.00 sec)
由結果可以看到,rows 列的值是 8,說明查詢語句掃描了表中的 8 條記錄。

沒有索引的表就相當於一組無序的行,如果我們想找到某條記錄就必須檢查表的每一行,看看它是否與那個期望值相匹配。這是一個全表掃描操作,其效率很低,如果表很大,而且僅有少數幾條記錄與搜尋條件相匹配,那麼整個掃描過程的效率將會超級低。

在 tb_students_info 表的 name 欄位新增索引,SQL 語句和執行結果如下:
mysql> CREATE INDEX index_name ON tb_students_info(name);
Query OK, 8 rows affected (0.14 sec)
使用 EXPLAIN 再次執行上面的查詢語句,SQL 語句和執行結果如下:
mysql> EXPLAIN SELECT * FROM tb_students_info WHERE name='張三' G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tb_students_info
   partitions: NULL
         type: ref
possible_keys: index_name
          key: index_name
      key_len: 63
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)
結果顯示,rows 列的值為 1,表示這個查詢語句只掃描了表中的 1 條記錄。建立索引後存取的行由 8 行減少到 1 行,其查詢速度自然比掃描 8 條記錄快。而且 possible_keys 和 key 的值都是 index_name,這說明查詢時使用了 index_name 索引。所以,在查詢操作中,使用索引不僅能自動優化查詢效率,還會降低伺服器的開銷。

注意:由於 tb_students_info 表中記錄較少,所以在這沒有分析執行時間。表中記錄多時,執行時間的差異也會體現出索引對查詢速度的影響。