CREATE INDEX idx_name_age_city ON users(name, age, city);
-- 最左前缀原则 -- ✓ WHERE name = 'Alice' -- ✓ WHERE name = 'Alice' AND age = 25 -- ✓ WHERE name = 'Alice' AND age = 25 AND city = 'Beijing' -- ✗ WHERE age = 25 (不走索引) -- ✗ WHERE city = 'Beijing' (不走索引)
三、索引优化
3.1 索引选择性
1 2 3 4
-- 计算选择性:不重复值数量 / 总数量 SELECTCOUNT(DISTINCTcolumn) /COUNT(*) FROM table_name;
-- 选择性越高,索引效果越好
3.2 前缀索引
1 2 3 4 5 6 7 8 9
-- 对于长字符串,可以只索引前缀 CREATE INDEX idx_email_prefix ON users(email(10));
-- 选择合适的前缀长度 SELECT COUNT(DISTINCTLEFT(email, 5)) /COUNT(*) AS sel_5, COUNT(DISTINCTLEFT(email, 10)) /COUNT(*) AS sel_10, COUNT(DISTINCTLEFT(email, 15)) /COUNT(*) AS sel_15 FROM users;
3.3 覆盖索引
1 2 3 4 5
-- 索引包含所有查询字段,无需回表 CREATE INDEX idx_name_age ON users(name, age);
-- 覆盖索引查询 SELECT name, age FROM users WHERE name ='Alice';
3.4 索引下推(ICP)
1 2 3 4 5 6
-- MySQL 5.6+支持索引条件下推 CREATE INDEX idx_name_age ON users(name, age);
-- 索引下推 SELECT*FROM users WHERE name LIKE'A%'AND age >25; -- 在索引层过滤age条件,减少回表次数