Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 当另一个表变得更满时,sql查询非常慢_Mysql_Sql - Fatal编程技术网

Mysql 当另一个表变得更满时,sql查询非常慢

Mysql 当另一个表变得更满时,sql查询非常慢,mysql,sql,Mysql,Sql,我有下面的查询,但是在一段时间之后,当用户开始在“ci_falsepositives”表中输入越来越多的项时,它变得非常慢。 ci_误报表包含ci_地址簿中的一个参考字段和ci_匹配的另一个参考字段 如何创建一个新查询,但仍然能够对每个字段进行排序。 例如,我仍然可以按“点击数”或“匹配数”排序 问题必须是ci_误报子查询中的选择计数(*)。该子查询可以使用ci\u误报和ci\u匹配之间的内部联接编写,但优化器可能会为您这样做。不过,我认为您需要做的是在“next query out”(即,SE

我有下面的查询,但是在一段时间之后,当用户开始在“ci_falsepositives”表中输入越来越多的项时,它变得非常慢。 ci_误报表包含ci_地址簿中的一个参考字段和ci_匹配的另一个参考字段

如何创建一个新查询,但仍然能够对每个字段进行排序。 例如,我仍然可以按“点击数”或“匹配数”排序


问题必须是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