索引是查詢效能的核心。本文深度解析 B-Tree/Hash/空間/全文索引原理、最左前綴原則、覆蓋索引、排序優化、InnoDB 鎖與索引關係,並提供大量 EXPLAIN 實戰案例。
INT (4B) < BIGINT (8B) < CHAR(10) (10B)DATETIME/TIMESTAMP,IP 用 INT UNSIGNED(INET_ATON())AUTO_INCREMENTBIGINT AUTO_INCREMENT 代理主鍵,業務欄位加 UNIQUE 索引支援:全鍵值匹配、最左前綴匹配、列前綴匹配、範圍查詢、精確+範圍混合、覆蓋索引、ORDER BY 優化
限制:必須從最左列開始;不能跳過列;範圍條件右側列無法使用索引
=, IN, <=>)MyISAM 支援,GEOMETRY 類型,地理空間查詢
MyISAM/InnoDB 5.6+,自然語言搜尋,MATCH AGAINST
Extra: Using indexfilesort:雙遍歷(舊)或單遍歷(新,max_length_for_sort_data 控制)WHERE id < 4 AND id <> 1 FOR UPDATE → 只用 id < 4 索引範圍掃描,鎖住 id=1,2,3 即使 id=1 不滿足條件
CREATE TABLE `actor` (
`actor_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(16) NOT NULL DEFAULT '',
`password` VARCHAR(16) NOT NULL DEFAULT '',
PRIMARY KEY (`actor_id`),
KEY `idx_name` (`name`)
) ENGINE=InnoDB;
EXPLAIN SELECT actor_id FROM actor ORDER BY actor_id;
-- type=index, key=PRIMARY, Extra=Using index ✅ 覆蓋索引+索引排序
EXPLAIN SELECT actor_id FROM actor ORDER BY password;
-- type=ALL, key=NULL, Extra=Using filesort ❌ 全表掃描+filesort
EXPLAIN SELECT actor_id FROM actor ORDER BY name;
-- type=index, key=idx_name, Extra=Using index ✅
-- sakila.actor 有 idx_last_name (last_name)
EXPLAIN SELECT actor_id, last_name FROM actor WHERE last_name = 'HOPPER';
-- type=ref, key=idx_last_name, Extra=Using where; Using index ✅
-- 索引 (last_name, first_name, dob)
EXPLAIN SELECT * FROM people WHERE last_name='Smith' AND first_name LIKE 'J%' AND dob='1976-12-23';
-- 僅用前兩列索引,LIKE 是範圍查詢
EXPLAIN 驗證?SELECT *?ANALYZE TABLE 更新統計?