索引如書目錄,加速資料檢索。建立於表的一或多欄,儲存於 B+ 樹或雜湊表。InnoDB/MyISAM 支援 BTREE,MEMORY 支援 HASH。
CREATE INDEXALTER TABLE ADD INDEX-- 建表時
CREATE TABLE t (
col TYPE,
INDEX idx_name (col [(len)] [ASC|DESC])
);
-- 既有表
CREATE INDEX idx_name ON t (col [(len)] [ASC|DESC]);
ALTER TABLE t ADD INDEX idx_name (col [(len)] [ASC|DESC]);
-- 建表時
CREATE TABLE t (
col TYPE,
UNIQUE INDEX uk_name (col [(len)] [ASC|DESC])
);
-- 既有表
CREATE UNIQUE INDEX uk_name ON t (col [(len)] [ASC|DESC]);
ALTER TABLE t ADD UNIQUE INDEX uk_name (col [(len)] [ASC|DESC]);
適用 CHAR/VARCHAR/TEXT,MyISAM/InnoDB 5.6+ 支援。
-- 建表時
CREATE TABLE t (
col TYPE,
FULLTEXT INDEX ft_name (col)
);
-- 既有表
CREATE FULLTEXT INDEX ft_name ON t (col);
ALTER TABLE t ADD FULLTEXT INDEX ft_name (col);
-- 查詢語法
SELECT * FROM t WHERE MATCH(col1, col2) AGAINST('word1', 'word2');
遵循最左前綴原則:INDEX(a,b,c) 可作為 a、(a,b) 索引,不可單獨作為 b、c、(b,c)。
-- 建表時
CREATE TABLE t (
a TYPE, b TYPE, c TYPE,
INDEX idx_abc (a, b, c)
);
-- 既有表
CREATE INDEX idx_abc ON t (a, b, c);
ALTER TABLE t ADD INDEX idx_abc (a, b, c);
適用空間資料類型(GEOMETRY 等),MyISAM/InnoDB 支援,較少使用,此處略。
DROP INDEX idx_name ON table_name;
SHOW INDEX FROM table_name;
COUNT(DISTINCT col)/COUNT(*) 越高越適合建索引。