【问题标题】:Optimizing search query优化搜索查询
【发布时间】:2018-02-23 08:49:50
【问题描述】:


这似乎是一个多余的问题,但我找不到这个问题的正确答案。
我有一个超过 50 列的 TableA。我正在实现一个搜索功能,用于在该表的大约 10 列中搜索查询。 TableA 包含超过一百万行
为此,我在这 10 列上创建了一个复合索引。
index (col1,col_2,col_3,col_4,col_5,col_6,col_7,col_8,col_9,col_10)
现在我正在使用空格作为正则表达式来拆分用户的查询。即
$search_words = $search_query.split(' ');
并在我的搜索查询中使用单个单词进行匹配。示例:

SELECT something FROM tableA 
WHERE ( MATCH ( col_1, col_2,col_3,col_4,col_5,col_6,col_7,col_8,col_9,col_10 )
AGAINST ( ' +word1* +word2* +word3* +word4* ' IN BOOLEAN MODE ) )

此查询适用于一般搜索,但如果用户在 A E I O Co. 等查询中搜索单个字母,则需要花费太多时间。在这种情况下,优化查询的最佳方式或执行搜索的其他方式是什么?

【问题讨论】:

  • 例如不要让他们搜索单个字符以进行 myisam 全文搜索。将ft_min_word_len 调整为 2,以便执行更好的全文搜索。如果您确实需要这样做,那么您应该考虑使用搜索引擎,例如 sphinxseelasticsearch.。 Mysql 不能很好的处理。
  • 使代码中的最小符号数。为什么不将数据拆分到其他表。你真的需要把所有这些放在很多列中吗?我将创建具有 3 列 id、pointer_to_item_or_product、search_word 的表,您在搜索中需要某种序列吗?
  • @abeyaz 不能限制搜索,因为它可以是有效搜索,并且现在不允许使用 lucene、elasticsearch 等搜索引擎,因为它将在一段时间后实施。但在那之前必须改进这个功能。
  • 那你应该听从@MatasLesinskas 的建议
  • 正如您已经意识到的那样,mysql 全文搜索对于查找稀有词非常有用,但如果您的查询将返回表的大部分,则效率会降低甚至无法使用。一种选择可能是不使用全文搜索,至少在边缘情况下(例如,如果输入包含 1 个字母的搜索词或您知道“慢”的词)。或者仅适用于实际上可以包含超过 1 个单词的列(如果有的话,并且您不只是想要“将所有列与所有术语进行比较”的快捷方式)。或 matas 词表。如果没有有关您的数据/搜索词/表格大小的详细信息,很难更具体。

标签: mysql search optimization query-optimization


【解决方案1】:

如果你向 InnoDB 的 FULLTEXT 提供一个太短的字符串,它会返回零个结果。所以...过滤掉任何比innodb_ft_min_token_size短的字符串。

如有必要,请使用 REGEXP '[[:<:]]A[[:>:]] 单独测试它们以查找 1 字母单词 A

或者把它们放在一起。这将检查仅有的 1 个字母的英文单词:REGEXP '[[:<:]][AI][[:>:]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-16
    • 2016-01-06
    • 2021-08-23
    • 2017-06-17
    • 2014-01-17
    • 2015-03-25
    相关资源
    最近更新 更多