以 1 萬筆測試資料為例,查詢 username='admin':
最基礎,無任何限制。建立方式三選一:
-- 獨立建立
CREATE INDEX idx_name ON mytable(username(10));
-- ALTER TABLE
ALTER TABLE mytable ADD INDEX idx_name (username(10));
-- 建表時指定
CREATE TABLE mytable (
id INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX idx_name (username(10))
);
刪除:DROP INDEX idx_name ON mytable;
值必須唯一,允許 NULL。組合唯一索引要求列組合唯一。語法同普通索引,加 UNIQUE 關鍵字。
特殊的唯一索引:不允許 NULL、每表僅一個。通常建表時指定:PRIMARY KEY (id)。
將多欄位建在同一索引:ALTER TABLE mytable ADD INDEX name_city_age (name(10), city, age);
上述索引等效於:(name,city,age)、(name,city)、(name) 三個索引。查詢必須從最左列開始才能用到組合索引。
| SQL | 是否用到索引 |
|---|---|
WHERE username='admin' AND city='鄭州' | ✅ 是 |
WHERE username='admin' | ✅ 是 |
WHERE age=20 AND city='鄭州' | ❌ 否(缺最左列) |
WHERE city='鄭州' | ❌ 否 |
WHERE、JOIN、ORDER BY、GROUP BY 的欄位<、<=、=、>、>=、BETWEEN、IN、LIKE 'prefix%'LIKE '%suffix'、LIKE '%mid%'、欄位上做運算(YEAR(date)<2007)、NOT IN、<>NOT NULL DEFAULT ''VARCHAR(255) 前 10-20 字元唯一性高 → INDEX(name(10)) 省空間又快WHERE 用了索引,ORDER BY 另一列不走索引 → 建組合索引 (where_col, order_col)LIKE 'abc%' 走索引,LIKE '%abc' 全掃WHERE YEAR(dt)<2007 → 改 WHERE dt<'2007-01-01'索引是效能倍增器,也是雙面刃。掌握類型特性、最左前綴、SARGable 查詢寫法、維護成本權衡,才能在大數據量下駕馭 MySQL。