优化SELECT foo FROM bar WHERE baz LIKE 'ZOT%'
查询时,您希望索引长度至少与请求中的字符数匹配。
这是刚刚的一个真实的例子:
这是查询:
EXPLAIN SELECT COUNT(*) FROM client_detail cd
JOIN client_account ca ON cd.client_acct_id = ca.client_acct_id
WHERE cd.first_name LIKE 'XX%' AND cd.last_name_index LIKE 'YY%';
没有索引:
+-------+
| rows |
+-------+
| 13994 |
| 1 |
+-------+
所以首先尝试一个 4x 索引,
CREATE INDEX idx_last_first_4x4 on client_detail(last_name_index(4), first_name(4));
+------+
| rows |
+------+
| 7035 |
| 1 |
+------+
好一点,但 COUNT(*) 显示只有 102 个结果。所以现在让我们添加一个 2x 索引:
CREATE INDEX idx_last_first_2x2 on client_detail(last_name_index(2), first_name(2));
产量:
+------+
| rows |
+------+
| 102 |
| 1 |
+------+
此时两个索引仍然存在,并且 MySQL 为该查询选择了后一个索引 --- 但是,如果它更有效,它仍然会选择 4x4 查询。
索引排序可能很有用,在 4x4 之前尝试 2x2,反之亦然,看看它在您的环境中的表现如何。要重新排序索引,您必须删除并重新创建较早的索引。