【问题标题】:MySQL using OR with MATCH AGAINST slows query drasticallyMySQL 使用 OR 和 MATCH AGAINST 会大大降低查询速度
【发布时间】:2015-02-12 21:29:19
【问题描述】:

列被索引和全文。为什么“OR”会增加 5-8 秒?

SELECT * FROM exampleTable WHERE MATCH(someColumn) AGAINST('+testing123*' IN BOOLEAN MODE) 
// returns in .05 seconds
SELECT * FROM exampleTable WHERE someColumn LIKE 'testing123%' 
// returns in .003 seconds
SELECT * FROM exampleTable WHERE (MATCH(someColumn) AGAINST('+testing123*' IN BOOLEAN MODE) OR MATCH(someColumn) AGAINST('+testing123*' IN BOOLEAN MODE)) 
// returns in 5-8 seconds; yes, they are same MATCH statement...
SELECT * FROM exampleTable WHERE (MATCH(someColumn) AGAINST('+testing123*' IN BOOLEAN MODE)OR someOtherIndexedColumn LIKE 'testing123%' 
// returns in 5-8 seconds; ***** different columns this time*******

我觉得很奇怪,当它是相同的语句时,MySQL 如此缓慢。这就像导致语句 "SELECT * FROM tableName WHERE 1 OR 1 " 为 5 秒。列是否相同或不同对速度没有影响。

【问题讨论】:

  • 哪个版本的 MySQL 服务器?
  • Ver 14.14 Distrib 5.6.22,适用于使用 EditLine 包装器的 Linux (x86_64)

标签: mysql performance full-text-search sql-like full-text-indexing


【解决方案1】:

虽然 MySQL 5.0+ 现在支持Index Merge,但目前有这个限制:

索引合并不适用于全文索引。我们计划延长 它将在未来的 MySQL 版本中涵盖这些内容。

通常,您可以将这些重写为 UNION 查询:

SELECT * FROM exampleTable
WHERE MATCH(someColumn) AGAINST('+testing123*' IN BOOLEAN MODE)
UNION
SELECT * FROM exampleTable
WHERE MATCH(someColumn) AGAINST('+testing123*' IN BOOLEAN MODE)

【讨论】:

  • 谢谢马库斯。然后我将运行两个查询并自己合并结果:(
  • 以 UNION 为例。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2013-03-05
  • 2014-06-19
  • 2020-04-21
  • 2012-12-08
  • 1970-01-01
  • 2010-12-12
  • 2011-09-23
  • 1970-01-01
相关资源
最近更新 更多