【发布时间】:2023-03-03 04:55:22
【问题描述】:
处理少于 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
【问题讨论】:
-
能否请您发布一个实际查询的实例,其中不包含所有这些引号和 + 参数已被限制的符号
-
并发布 table1 和 table2 的结构。添加解释。
-
@e4c5 更新问题
-
"您能否发布一个实际查询的实例,没有所有这些引号和 + 符号,其中参数已被限制"并且
show create table的结果对我们来说会更有用,并且为您减少打字次数 -
整个表格中有很多与这个问题无关的无用信息,因此我没有包括在内以使事情更容易理解(希望是这样的)无论如何:-))
标签: mysql full-text-search full-text-indexing