索引是資料庫效能調校的核心。MySQL 主要支援四大類索引:普通索引、唯一索引、主鍵索引、組合索引。本文將逐一說明其特性、建立語法與適用場景,助您做出最佳選擇。
最基本的索引類型,無任何限制,允許重複值與 NULL 值。
-- 單獨建立
CREATE INDEX idx_username ON mytable(username(10));
-- ALTER TABLE 新增
ALTER TABLE mytable ADD INDEX idx_username (username(10));
-- 建表時指定
CREATE TABLE mytable (
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX idx_username (username(10))
);
DROP INDEX idx_username ON mytable;
提示:CHAR/VARCHAR 可指定前綴長度;BLOB/TEXT 必須指定長度。
索引欄位值必須唯一,但允許 NULL 值 (多筆 NULL 視為不重複)。組合唯一索引則要求欄位組合唯一。
CREATE UNIQUE INDEX uk_email ON mytable(email(20));
ALTER TABLE mytable ADD UNIQUE uk_email (email(20));
CREATE TABLE mytable (
ID INT NOT NULL,
email VARCHAR(100) NOT NULL,
UNIQUE uk_email (email(20))
);
特殊的唯一索引:不允許 NULL、一張表僅能有一個。通常在建表時同步建立。
CREATE TABLE mytable (
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
PRIMARY KEY (ID)
);
-- 或事後新增
ALTER TABLE mytable ADD PRIMARY KEY (ID);
將多個欄位組合成單一索引,遵循最左前綴原則。例如 INDEX idx_a_b_c (a, b, c) 等同於擁有 (a)、(a,b)、(a,b,c) 三個索引。
ALTER TABLE mytable ADD INDEX idx_name_city_age (name(10), city, age);
查詢 WHERE name='A' AND city='B' 可用到索引;WHERE city='B' 則無法使用。
WHERE、JOIN、ORDER BY 的欄位優先建索引。