示例
示例
ALTER TABLE orders ADD INDEX idx_abc (user_id, status, created_at);
-- 能用到:a / a+b / a+b+c
SELECT * FROM orders WHERE user_id = 100;
SELECT * FROM orders WHERE user_id = 100 AND status = 'paid';
SELECT * FROM orders WHERE user_id = 100 AND status = 'paid' AND created_at > '2024-01-01';
-- 不能高效用到(未从 a 开始)
SELECT * FROM orders WHERE status = 'paid';
-- 中间列范围:created_at 条件仍可过滤,但不会再进入索引查找
SELECT * FROM orders WHERE user_id = 100 AND status > 'p' AND created_at > '2024-01-01';| 等值优先 | 设计索引时把等值条件列放前面、范围列放后面 |
|---|---|
| 范围截断 | 某列用范围后,后续列无法继续用于索引定位(可能靠 ICP 过滤) |
| 验证 | 用 key_len 推断实际用到前几列 |