如何使用多个全文匹配优化 mysql 查询

Posted

技术标签:

【中文标题】如何使用多个全文匹配优化 mysql 查询【英文标题】:How to optimize mysql query with multiple fulltext matches 【发布时间】:2011-07-14 17:26:49 【问题描述】:

这是我的查询:

    SELECT heading FROM table_a, table_b as m1, table_b as m2 WHERE (m1.join_id = '69' AND MATCH(m1.content) AGAINST('Harry' IN BOOLEAN MODE)) AND (m2.join_id = '71' AND MATCH(m2.content) AGAINST('+Highway +Design' IN BOOLEAN MODE)) AND m1.webid = table_a.id AND m2.webid = table_a.id

现在大约需要 3 秒。如果我拿出这样的条件之一:

    SELECT heading FROM table_a, table_b as m2 WHERE (m2.join_id = '71' AND MATCH(m2.content) AGAINST('+Highway +Design' IN BOOLEAN MODE)) AND m2.webid = table_a.id

大约需要 0.05 秒。

我在“内容”列上有一个全文索引。

另外,在第一个查询中,如果我要搜索“Highway Design”(没有像 + 或“”这样的运算符),大约需要 30 秒。

这是我的解释查询:

    d   select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
    1   SIMPLE  m1  fulltext    id_index,content_ft     content_ft 0        1   Using where
    1   SIMPLE  table_a     eq_ref  PRIMARY     PRIMARY     4   user.m1.id  1    
    1   SIMPLE  m2  fulltext    id_index,content_ft     content_ft  0       1   Using where

我还能做些什么来加快速度吗?

为了解释我的表格, table_a 是具有标题和内容字段的主表 table_b 是我table_a 中行的属性表,这样table_a 中的行可以有额外的属性。

如果我需要更好地解释这一点,请告诉我。

谢谢!

这里的UPDATE是快速查询的解释:

    id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
    1   SIMPLE  m2  fulltext    id_index,content_ft     content_ft  0       1   Using where
    1   SIMPLE  table_a     eq_ref  PRIMARY     PRIMARY     4   user.m2.webid   1    

另一个更新 - 表定义: 表_b

    id  int(11)             No  None    AUTO_INCREMENT
join_id     int(11)             No  None
webid   int(11)             No  None
content     text    utf8_general_ci         No  None

内容表_b的索引

    PRIMARY BTREE   Yes No  id  2723702 A       
    content BTREE   No  No  content (333)   226975  A       
    id_index    BTREE   No  No  webid   151316  A       
    content_ft  FULLTEXT    No  No  content 118421  

表_a

    id  int(11)             No  None    AUTO_INCREMENT  
    heading     text    utf8_general_ci         Yes     NULL

表索引

    PRIMARY BTREE   Yes No  id  179154  A       
    heading BTREE   No  No  heading (300)   89577   A   YES 

【问题讨论】:

显示第二个快速查询的解释 刚刚做了,如果您需要任何其他信息,请告诉我。谢谢! 我认为表定义也会很有用。 好的,让我快速抓住那些真正的东西 很抱歉,一次尝试做太多事情,我有table_a_id,应该是webid,我刚刚在上面修复了。 【参考方案1】:

好的,我的第一个意见是将全文搜索更改为LIKE 子句。为此,最好在 webid 上建立一个索引,或者在 (webid, join_id) 上建立一个 composite 索引更好。这应该有助于更一致的表连接。

【讨论】:

好的太好了,我试试看,我想问题是哪个应该像,哪个应该是全文? @Gerry 最好测试一下,因为我对你的数据了解不多。 仅供参考-我需要几个小时才能对此进行测试,我会尽快将您的答案标记为正确 :) @Gerry 我的回答并不意味着它一定是正确的。首先进行测试,然后我们将看到 :) 在没有使用LIKE 的复合索引的情况下查询有多快? 啊,不要卖空自己。我刚刚被其他一些东西淹没了,直到明天我才能做到这一点,但我会在测试时发回这里。

以上是关于如何使用多个全文匹配优化 mysql 查询的主要内容,如果未能解决你的问题,请参考以下文章

mysql全文匹配搜索字串中含圆括号()怎么办?

php+mysql 如何优化千万级数据模糊查询加快

如何提高sql2000全文检索搜索效率

优化 MySQL 全文搜索查询?

mysql中文全文检索从入门到放弃

如何使用 MySQL 连接语句选择与链接表中的多个值匹配的记录?