在MySQL布尔搜索中对关键字进行排序有哪些规则?

Tot*_*oto 6 mysql optimization full-text-search

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

使用MyISAM表对MySQL 5.6.33进行概要分析,ft_min_word_len=2并将其description_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
Run Code Online (Sandbox Code Playgroud)

结果:

Total count: 12
Key_read_requests: 2384607
Creating sort index: 7.950430 sec (!)
Duration: 8.851252 sec
Run Code Online (Sandbox Code Playgroud)
# 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
Run Code Online (Sandbox Code Playgroud)

结果:

Total count: 12
Key_read_requests: 415
Creating sort index: 0.003449
Duration: 0.004054 sec
Run Code Online (Sandbox Code Playgroud)

每个关键字的总记录:

tz*: 135092
tz: 25596
house*: 12
Run Code Online (Sandbox Code Playgroud)

两个查询的解释是相同的:

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
Run Code Online (Sandbox Code Playgroud)

只有Key_read_requestsCreating sort index是2个查询之间的不同.

看起来:

  1. 关键字顺序的顺序是关键性能因素
  2. 关键字以相反的顺序使用
  3. 在最后拥有最具辨别力的关键字可以提高性能.

问题:

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

edl*_*erd -1

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