無索引時,任何查詢都會觸發全表掃描。數據量大、結果集小時,性能災難性下降。但索引非越多越好:
查詢:SELECT * FROM users WHERE area='beijing' AND age=22;
(area, age, salary):等同於擁有 (area,age,salary)、(area,age)、(area) 三個索引 —— 這就是最佳左前綴特性。建立原則: 將區分度高、常用於 WHERE/JOIN/ORDER BY 的列放在最左,依次遞減。
NOT NULL DEFAULT '' 或 0,避免 NULL。對長字符串列(如 CHAR(255)),若前 10-20 字符區分度已高,可建前綴索引:
ALTER TABLE t ADD INDEX idx_name (name(10));
優勢:節省磁盤空間、減少 I/O、提升查詢速度。
WHERE 已用索引,ORDER BY 列通常無法再用索引(除非是覆蓋索引)。LIKE '%aaa%':不走索引(前導通配符)。LIKE 'aaa%':可走索引(後導通配符)。FULLTEXT 索引或 Elasticsearch。錯誤: WHERE YEAR(adddate) < 2007 → 全表掃描。
正確: WHERE adddate < '2007-01-01' → 走索引範圍掃描。
NOT IN → NOT EXISTS(子查詢可用索引)。id <> 3 → id > 3 OR id < 3(可走範圍索引)。查詢只需讀取索引即可滿足(不回表),EXPLAIN 顯示 Using index。設計複合索引時可包含 SELECT 列,實現覆蓋。
EXPLAIN、SHOW PROFILE)。ANALYZE TABLE 更新統計信息,必要時 OPTIMIZE TABLE 整理碎片。