[英]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.