Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.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计数查询花费的时间太长_Mysql_Mysql Workbench - Fatal编程技术网

MySQL计数查询花费的时间太长

MySQL计数查询花费的时间太长,mysql,mysql-workbench,Mysql,Mysql Workbench,我正在通过workbench运行一个非常简单的MySQL查询,以便统计表中的条目数: 从数据库表中选择COUNT(*) 表中约有300万个条目,但计算条目数需要10分钟以上。如果这有帮助的话,我可以在机器上添加额外的处理器和服务器,但在这一点上,我只是想弄明白为什么要花这么长时间来计算300万行 有什么办法可以让查询运行得更快吗?对于一个只有300万行的表来说,10分钟是荒谬的。我估计最多只需要几秒钟。同一台服务器上必须有大量其他负载,否则服务器功率不足 这是InnoDB存储引擎的一大弱点:SE

我正在通过workbench运行一个非常简单的MySQL查询,以便统计表中的条目数:

从数据库表中选择COUNT(*)

表中约有300万个条目,但计算条目数需要10分钟以上。如果这有帮助的话,我可以在机器上添加额外的处理器和服务器,但在这一点上,我只是想弄明白为什么要花这么长时间来计算300万行


有什么办法可以让查询运行得更快吗?

对于一个只有300万行的表来说,10分钟是荒谬的。我估计最多只需要几秒钟。同一台服务器上必须有大量其他负载,否则服务器功率不足

这是InnoDB存储引擎的一大弱点:
SELECT COUNT(*)
不可优化,因为表中的行数取决于事务的表视图。因此,它必须访问每一行并逐行确定您的事务是否可以“看到”该行。因此,
选择计数(*)
似乎需要很长时间

MyISAM在这方面要好一点,因为表元数据保持表中当前的行数,
SELECT count(*)
为此进行了优化,从元数据中读取总数。但是,如果您从MyTable中选择COUNT(*),其中…any conditions…,则这没有帮助,因为它只保留元数据中的一个总行数,而不保留任何可能的条件的小计


如果您需要对此进行优化,您可以自己将总数保存在另一个表中,在
插入表时增加,在
删除表时减少。对于一个只有300万行的表来说,10分钟是荒谬的。我估计最多只需要几秒钟。同一台服务器上必须有大量其他负载,否则服务器功率不足

这是InnoDB存储引擎的一大弱点:
SELECT COUNT(*)
不可优化,因为表中的行数取决于事务的表视图。因此,它必须访问每一行并逐行确定您的事务是否可以“看到”该行。因此,
选择计数(*)
似乎需要很长时间

MyISAM在这方面要好一点,因为表元数据保持表中当前的行数,
SELECT count(*)
为此进行了优化,从元数据中读取总数。但是,如果您从MyTable中选择COUNT(*),其中…any conditions…
,则这没有帮助,因为它只保留元数据中的一个总行数,而不保留任何可能的条件的小计


如果您需要对此进行优化,您可以自己将总数保存在另一个表中,在
向表中插入
时将其递增,在
从数据库中删除
解释选择计数(*)的输出时将其递减,对索引列进行计数。例如,
从数据库中选择COUNT(id)。表
@Reto花费了大约1秒的时间。我没想到解释会这么有帮助。这真的很奇怪,因为MySQL网站推荐的count显然很糟糕。你能把它作为一个解决方案让我接受吗?@Jethro Van Thuyne这不会有帮助,因为MySQL计数是优化的,并且总是在后台进行计数(id)。@SeanJ
EXPLAIN
不是一个解决方案-它只是一种分析MySQL实际做什么的方法;)来自数据库的
EXPLAIN SELECT COUNT(*)的输出。表
可能会有所帮助。如果此表中的某列上有任何索引,请对索引列进行计数。例如,
从数据库中选择COUNT(id)。表
@Reto花费了大约1秒的时间。我没想到解释会这么有帮助。这真的很奇怪,因为MySQL网站推荐的count显然很糟糕。你能把它作为一个解决方案让我接受吗?@Jethro Van Thuyne这不会有帮助,因为MySQL计数是优化的,并且总是在后台进行计数(id)。@SeanJ
EXPLAIN
不是一个解决方案-它只是一种分析MySQL实际做什么的方法;)在这种情况下,
count(1)
count(*)
有区别吗?不,在MySQL中,
count(1)
count(*)
@BillKarwin MySQL运行在一个带有5 x E5649@2.53GHz处理器的专用Ubunutu服务器上,几乎没有动力不足,而且我已经禁用了大多数加载数据的队列……我猜不出为什么不分析您的系统要花10分钟。这与它应该采取的措施有很大的不同,我怀疑这是一个锁定的表,或者系统正在交换。在这种情况下,
count(1)
count(*)有何不同?不,在MySQL中,
count(1)
count(*)之间没有区别
@BillKarwin MySQL运行在一台专用的Ubunutu服务器上,该服务器具有5 x E5649@2.53GHz处理器,因此几乎没有动力不足,我已经禁用了大多数加载数据的队列……我猜不出为什么不分析您的系统就要花10分钟。这与它应该采取的措施有很大的不同,我怀疑这是一个锁定的表,否则系统正在交换。