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 索引。所以,在查詢操作中,使用索引不僅能自動優化查詢效率,還會降低伺服器的開銷。