【问题标题】:MySQL slow query joining two tables with fulltext condition on eachMySQL慢查询连接两个表,每个表都有全文条件
【发布时间】:2021-03-08 12:09:25
【问题描述】:

我需要连接两个表(分别为 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 ;

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

两个条件下查询时间都超过100万。

只有这两个条件之一,查询时间在1秒以下。

如何优化这个查询?

【问题讨论】:

    标签: mysql full-text-search


    【解决方案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 性能优势。

    【讨论】:

    • 嗨!谢谢你的建议。我都试过了,但查询速度更慢,可能是因为它不能再使用 company_index 上的索引来进行连接。
    • 你用的是什么mysql版本?
    • 其实它的 mariadb 10.3
    猜你喜欢
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多