我通过工作台运行一个非常简单的MySQL查询,以便计算表格中的条目数:
SELECT COUNT(*) FROM database.table
表格中约有300万条目,但计算条目数量需要10多分钟。如果有帮助,我可以在机器上添加额外的处理器和服务器,但此时我只想弄清楚为什么花费这么长时间来计算300万行。
我可以做些什么来让查询更快地运行?
答案 0 :(得分:2)
这是InnoDB存储引擎的一大弱点:SELECT COUNT(*)
不可优化,因为表中的行数取决于事务的表视图。因此,它必须访问每一行并逐行确定您的事务是否可以“看到”该行。因此SELECT COUNT(*)
似乎需要很长时间。
MyISAM在这方面要好一些,因为表元数据保留了表中当前的行数,SELECT COUNT(*)
优化了这一点,从元数据中读取了总数。但是,如果您执行SELECT COUNT(*) FROM MyTable WHERE ...any conditions...
,这没有任何帮助,因为它只在元数据中保留一个总行数,而不是任何可能的条件的小计。
如果您需要对此进行优化,您可以自己将总数保留在另一个表格中,在INSERT
到表格时将其递增,并在DELETE
时递减。