Mysql 当另一个表变得更满时,sql查询非常慢
我有下面的查询,但是在一段时间之后,当用户开始在“ci_falsepositives”表中输入越来越多的项时,它变得非常慢。 ci_误报表包含ci_地址簿中的一个参考字段和ci_匹配的另一个参考字段 如何创建一个新查询,但仍然能够对每个字段进行排序。 例如,我仍然可以按“点击数”或“匹配数”排序Mysql 当另一个表变得更满时,sql查询非常慢,mysql,sql,Mysql,Sql,我有下面的查询,但是在一段时间之后,当用户开始在“ci_falsepositives”表中输入越来越多的项时,它变得非常慢。 ci_误报表包含ci_地址簿中的一个参考字段和ci_匹配的另一个参考字段 如何创建一个新查询,但仍然能够对每个字段进行排序。 例如,我仍然可以按“点击数”或“匹配数”排序 问题必须是ci_误报子查询中的选择计数(*)。该子查询可以使用ci\u误报和ci\u匹配之间的内部联接编写,但优化器可能会为您这样做。不过,我认为您需要做的是在“next query out”(即,SE
问题必须是ci_误报子查询中的
选择计数(*)。该子查询可以使用ci\u误报
和ci\u匹配
之间的内部联接编写,但优化器可能会为您这样做。不过,我认为您需要做的是在“next query out”(即,SELECT c.*,
)的FROM子句中将该子查询变成一个单独的查询。很可能,该查询被评估了多次——这就是人们在ci\u误报中添加记录时对您造成的伤害。您应该仔细研究查询计划
也许这个查询会更好:
SELECT *, matches - falsepositives AS hits
FROM (SELECT c.*, IFNULL(p.total, 0) AS matches, f.falsepositives
FROM ci_address_book AS c
JOIN (SELECT n.addressbook_id, COUNT(*) AS falsepositives
FROM ci_falsepositives AS n
JOIN ci_matched_sanctions AS m
ON n.sanction_key = m.sanction_key
GROUP BY n.addressbook_id
) AS f
ON c.reference = f.addressbook_id
LEFT JOIN
(SELECT addressbook_id, COUNT(match_id) AS total
FROM ci_matched_sanctions
GROUP BY addressbook_id) AS p
ON c.id = p.addressbook_id
) AS s
ORDER BY folder asc, wholename ASC
LIMIT 0, 15
您是否考虑过添加一些索引?每个表都有一个id字段,它是主索引What数据库和哪个版本??SQL只是结构化查询语言-一种被许多数据库系统使用的语言-SQL不是数据库产品。。。像这样与性能相关的东西通常是特定于供应商的-所以我们真的需要知道您使用的是什么数据库系统…mysql-myisam(我也尝试过innodb,没有区别,innodb稍微慢一点)-1请求查询优化帮助,而不包括表结构、索引或查询计划。(或者,最初,甚至是相关的RDBMS。)这已经不起作用了。。。当在另一个字段(例如匹配或命中)上排序时,我的结果将消失。我只得到了一些结果,而不是所有的结果。而且似乎数字计算已经不复存在了。。我得到了表中没有的“误报”。它说我有93个,但没有。我对你的模式或样本数据没有足够的把握。您有三个表,您没有真正为我们提供模式,其中外键特别重要。可能是我完全误解了最初的疑问。总的想法是正确的——详细的SQL不正确并不完全让我感到惊讶。要调试它:(1)单独测试以f结尾的子查询,并确保它生成合理的答案;(2) 验证作为c
和作为f
之间的联接。我不清楚为什么一个连接使用p.addressbook\u id
连接c.id
,而另一个连接使用n.addressbook\u id
连接原始查询中的n.addressbook\u id
。谢谢,我会试试看。如果我仍然无法理解,我将在原始问题中添加模式。
SELECT *, matches - falsepositives AS hits
FROM (SELECT c.*, IFNULL(p.total, 0) AS matches, f.falsepositives
FROM ci_address_book AS c
JOIN (SELECT n.addressbook_id, COUNT(*) AS falsepositives
FROM ci_falsepositives AS n
JOIN ci_matched_sanctions AS m
ON n.sanction_key = m.sanction_key
GROUP BY n.addressbook_id
) AS f
ON c.reference = f.addressbook_id
LEFT JOIN
(SELECT addressbook_id, COUNT(match_id) AS total
FROM ci_matched_sanctions
GROUP BY addressbook_id) AS p
ON c.id = p.addressbook_id
) AS s
ORDER BY folder asc, wholename ASC
LIMIT 0, 15