【问题标题】:What are the rules to order the keywords in a MySQL boolean search?在 MySQL 布尔搜索中排序关键字的规则是什么?
【发布时间】:2017-01-31 00:16:13
【问题描述】:

当我在布尔搜索中更改关键字的顺序时,我得到了相同的结果,但性能结果却大不相同。

在 MySQL 5.6.33 上使用 MyISAM 表 ft_min_word_len=2description_index 作为 FULLTEXT 索引在 titledescription 上的分析返回:

# Query 1
SELECT id
FROM archive, topic
WHERE topic.type=0 AND archive.status=2
AND MATCH(title, description) AGAINST ('+house* +tz*' IN BOOLEAN MODE)
AND archive.topicId = topic.id
ORDER BY archive.featured DESC, archive.submissionDate DESC LIMIT 0,20

结果:

Total count: 12
Key_read_requests: 2384607
Creating sort index: 7.950430 sec (!)
Duration: 8.851252 sec

# Query 2
SELECT id
FROM archive, topic
WHERE topic.type=0 AND archive.status=2
AND MATCH(title, description) AGAINST ('+tz* +house*' IN BOOLEAN MODE)
AND archive.topicId = topic.id
ORDER BY archive.featured DESC, archive.submissionDate DESC LIMIT 0,20

结果:

Total count: 12
Key_read_requests: 415
Creating sort index: 0.003449
Duration: 0.004054 sec

每个关键字的总记录数:

tz*: 135092
tz: 25596
house*: 12

两个查询的解释是一样的:

id | select_type | Table   | Type     | Key               | Key len | Ref             | Rows | Extra
1  | SIMPLE      | archive | fulltext | description_index | 0       |                 | 1    | Using where; Using filesort
1  | SIMPLE      | topic   | eq_ref   | PRIMARY           | 3       | archive.topicId | 1    | Using where

这两个查询之间只有 Key_read_requestsCreating sort index 不同。

看来:

  1. 关键字顺序是一个关键的性能因素
  2. 关键字以相反的顺序使用
  3. 在末尾添加最具辨别力的关键字可以提高性能。

问题:

  • 造成这种巨大性能差异的原因是什么?
  • 什么是规则/最佳实践? (我在 mysql 的文档中找不到任何东西)。

【问题讨论】:

  • MyISAM 即将消失;看看你用 InnoDB 的 FULLTEXT 变体得到了什么。
  • @RickJames MyISAM 在某些情况下(我们的案例)仍然更好。我们正在等待似乎具有出色 innodb 性能的 mysql 8。在那之前,我们需要解决和理解这个问题。 :) percona.com/blog/2016/10/11/mysql-8-0-end-myisam
  • 您能否为这两个查询发布EXPLAIN 的输出?
  • 你有FULLTEXT 索引吗?如果有,它的定义是什么?
  • @Stoleg 似乎这个问题与全文如何以布尔模式分析字符串有关。我已经更新了这个问题。请注意,除了Key_read_requestsCreating sort index 的值之外,一切都是相同的(查询计划、值、解释等)。

标签: mysql optimization full-text-search


【解决方案1】:

在 OP 评论后编辑:
解决此查询时,我不确定确切的查询计划。
有时一个操作比另一个操作更昂贵,因此首先执行成本较低的操作可以整理出许多行,然后不必执行更昂贵的操作,从而减少运行时间。
(在您的示例中,其中一个匹配操作可能比另一个更昂贵,这会通过更改要匹配的字符串的顺序来增加和减少运行时间)。

【讨论】:

  • 我了解基数问题。 :) 真正的问题是:关键字 always 是否以相反的顺序搜索(在boolean mode 中)?因为,如果是这种情况,我必须重建查询以将关键字从不太分离到最多排序。
  • 对不起,我在我的问题中犯了一个严重的错误(现已修复)。这 3 个值不是基数,而是与关键字匹配的记录数。 :(
  • 好的,没问题。我重写了我的答案我也误解了你写的东西。
  • 实际上,在布尔模式下使用+ (AND) 进行全文搜索时,查询计划始终相同:每个关键字都以相反的顺序进行分析(我虽然会采取最有区别的第一个)。在我的问题中,我输入了完整的查询,但即使使用简化的查询(只有关节和布尔模式下的全文搜索),结果也是一样的。
  • 在您的示例中,必须同时存在两个关键字才能进行匹配。如果较快的搜索操作首先运行并消除记录,则将跳过该记录的较慢的搜索操作。这将节省时间,并且应该是性能差异的原因。
【解决方案2】:

您是否针对新启动的实例运行了这两个查询?由于第二次运行时缓存已满,您可能只是获得了性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 2011-10-09
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 2021-10-04
    相关资源
    最近更新 更多