【问题标题】:Why would a mysql SELECT with 'LIKE word%word2' in the where clause not use an index为什么在 where 子句中带有 'LIKE word%word2' 的 mysql SELECT 不使用索引
【发布时间】: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 变量可以控制这样的行为?

【问题讨论】:

  • 如果您将查询重写为 UNION s 而不是 OR s,您仍然会得到相同的行为吗?
  • 拆分为 UNION 会导致使用索引。我不得不将长长的 LIKE 列表分成四等份,以使其使用索引,因此它似乎与 LIKE 的数量有关。性能现在明显更好。知道为什么如果有很多 LIKE,优化器会表现得如此糟糕吗?

标签: mysql performance sql-like


【解决方案1】:

我相信如果你添加FORCE INDEX [index_name],无论如何它都会使用索引。另外,请检查Hint index documentationsysvar_max_seeks_for_key 的值也会影响索引是否被使用。也许将此值更改为较小的数字会有所帮助。

【讨论】:

    猜你喜欢
    • 2012-06-11
    • 2010-10-09
    • 2018-03-08
    • 2019-06-02
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 2013-06-27
    相关资源
    最近更新 更多