处理少于50行的小数据集,以下查询可以正常工作。在对此进行扩展并在大约5000行的数据集上运行相同查询时,此查询大约需要3-6秒才能运行,这对于实时环境来说太慢了。
可以采取哪些措施来改善此查询的效果?
SELECT table1.ID, table1.CompanyName,
(SELECT CompanyIDBeingFollowed FROM table2 WHERE PersonID = ? )
FROM table1
JOIN table3 ON table1.ID = table3.ID
WHERE table1.Status = 'Live' AND ( MATCH(table3.Content) AGAINST( '+search +term' IN BOOLEAN MODE ) )
GROUP BY table1.CompanyID
LIMIT 10;
本质上,上面的查询是搜索大型数据集以使用MySQL FullText对结果进行排名,以便返回最相关的结果,即具有最高MySQL FullText得分的结果。然后根据匹配的内容从其他两个表中获取一些信息,用于在页面上填充用户的有用内容。
思想?
我意识到大约5000行的当前数据集将在短时间内增长到数十万,所以我宁愿看看如何最好地优化这个查询而不是以后。
在开发环境中,查询会立即运行,因为它位于大约50行的数据集上。
更新
我刚刚更新了上面的SQL,使其更容易阅读和理解。下表摘要供参考。
Table 1 - Companies
- ID
- CompanyName
Table 2 - People Following Companies
- CompanyIDBeingFollowed
- PersonID
Table 3 - Pages On Company Website
- ID (Unique)
- CompanyID (Non-Unique)
- Content
答案 0 :(得分:0)
很难回答你的问题,但如果我在你所在的地方,我会尝试这样做:
group by
order by
而且,也可能是,当用户按一个单词过滤数据时,可以使用“喜欢”搜索而不是全文搜索。
答案 1 :(得分:0)
这需要大约3-6秒才能运行(来自原始问题的代码);
SELECT table1.ID, table1.CompanyName,
(SELECT CompanyIDBeingFollowed FROM table2 WHERE PersonID = ? )
FROM table1
JOIN table3 ON table1.ID = table3.ID
WHERE table1.Status = 'Live' AND ( MATCH(table3.Content) AGAINST( '+search +term' IN BOOLEAN MODE ) )
GROUP BY table1.CompanyID
LIMIT 10;
这段代码运行时间不到1秒(正如预期的那样) - 删除GROUP BY并改为使用DISTINCT;
SELECT DISTINCT(table1.ID), table1.CompanyName,
(SELECT CompanyIDBeingFollowed FROM table2 WHERE PersonID = ? )
FROM table1
JOIN table3 ON table1.ID = table3.ID
WHERE table1.Status = 'Live' AND ( MATCH(table3.Content) AGAINST( '+search +term' IN BOOLEAN MODE ) )
LIMIT 10;
我不知道为什么在这种情况下会出现这种情况,但它确实有效。如果有人知道为什么会出现这种情况的更多技术方面并且我会更新答案,那将会很棒。
感谢所有指针。