繁体   English   中英

MySQL 慢速查询连接两个表,每个表都有全文条件

[英]MySQL slow query joining two tables with fulltext condition on each

我需要加入两个表(分别为 1M 行和 10M 行)

每个表都使用全文匹配条件进行过滤:

SELECT SQL_NO_CACHE c.company_index
    
FROM dw.companies c INNER JOIN dw.people p 
ON c.company_index = p.company_index
    
WHERE MATCH ( c.tag ) AGAINST ( 'ecommerce' IN BOOLEAN MODE )
AND MATCH ( p.title ) AGAINST ( 'director' IN BOOLEAN MODE )
    
ORDER BY c.company_index DESC ;

两个表都有全文索引(在“标签”和“标题”上)

两种情况下查询时间均超过 1 百万。

只有这两个条件之一,查询时间低于 1 秒。

我怎样才能优化这个查询?

我认为问题在于如果可以执行 FULLTEXT 非常快,但如果不能执行则非常慢。 对于原始查询中的两个测试,一个 MATCH 可以是第一个,但另一个不能。

这是关于如何解决该问题的混乱想法。

SELECT c.company_index
    FROM ( SELECT company_index FROM companies WHERE MATCH... ) AS c
    JOIN ( SELECT company_index FROM people    WHERE MATCH... ) AS p
       ON c.company_index
        = p.company_index
    ORDER BY ...

您使用的是什么版本的 MySQL? 较新的版本将自动在“派生”表之一上创建索引,从而使JOIN非常有效。

这是另一种方法:

SELECT c.company_index
    FROM ( SELECT company_index FROM companies WHERE MATCH... ) AS c
    WHERE EXISTS ( SELECT 1 FROM people WHERE MATCH...
                      AND company_index = c.company_index )
    ORDER BY ...

在这两种情况下(我希望)一个SELECT将使用一个 FT 索引; 另一个将使用另一个,从而获得 FT 性能优势。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM