【发布时间】:2010-12-04 00:37:02
【问题描述】:
查询很大,并且在 WHERE 子句中包含一长串 'LIKE' 测试,例如 ...SELECT colA FROM t WHERE (colX LIKE 'word1%word2%' OR colX LIKE 'word3%word4%'或者...);
colX 有一个索引。 mysql 使用索引,因为比较不是以“%”开头的。通过使用 EXPLAIN 检查,我看到当 SQL 字符串变大时,mysql 停止使用索引并开始进行全表扫描。这似乎与 where 子句中“LIKE”测试的数量有关。在阈值处,我可以再添加一个“LIKE”,它会停止使用索引,并且比没有额外“LIKE”的时间长 10 倍。
是否有一些 mysql 变量可以控制这样的行为?
【问题讨论】:
-
如果您将查询重写为
UNIONs 而不是ORs,您仍然会得到相同的行为吗? -
拆分为 UNION 会导致使用索引。我不得不将长长的 LIKE 列表分成四等份,以使其使用索引,因此它似乎与 LIKE 的数量有关。性能现在明显更好。知道为什么如果有很多 LIKE,优化器会表现得如此糟糕吗?
标签: mysql performance sql-like