2011-07-31 41 views
4

您认为在每个页面加载时从一个非常大的表格(如50K行)中计数条目是个好主意吗?是SELECT COUNT(*)贵吗?

SELECT COUNT(*) FROM table 

现在我有一个像2000行,似乎非常快,我没有看到在页面加载:)

任何延迟,但该表应可达50K条目...而且我好奇它是如何加载然后

(PS:这个网页,其中显示的行数是私有的,在一个管理界面,不公开)

+0

如果/当它成为一个问题....已经有很多解决方案。 – 2011-07-31 17:17:23

+0

对于MyISAM而言,由于行数已存储,所以速度很快,但我认为您并未使用MyISAM。 – Jacob

+0

表格类型在我的phpmyadmin中显示“MyISAM” – Emma

回答

5

如果SELECT从一个表中检索,没有其他列被检索,并且没有WHERE子句,则COUNT(*)被优化为非常快速地返回。例如:

mysql> SELECT COUNT(*) FROM student; 

这个优化仅适用于只有MyISAM表,因为一个确切的行数存储这个存储引擎,可以非常快速地访问。

Source

正如你说你使用MyISAM和您的查询是整个表,它并不重要,如果其1个或100000行。

+0

仅供参考:在ANSI-92 SQL中提到http://dba.stackexchange.com/questions/2511/what-is-the-difference-between-select-count-and-select-countany-non-null-col/2512 #2512 – gbn

0

正如你所说的这个页面是列兵和不公开我不”没有看到该查询和50k记录的任何问题,不应该对页面加载ti有任何实际影响mes和服务器负载。

-1

它可以。根据this forum PostgreSql将对数据库执行一次完整的扫描以确定计数。

+1

是的,但这是MySQL :) – 2011-07-31 17:21:03

+0

而MySQL/SQL Server/Sybase也不使用MVCC。 – gbn

0

COUNT(*)不是一个昂贵的操作,它dosent实际上返回的数据只是看索引。即使在5万张桌子上,你也应该没问题。

如果您在加载过程中遇到问题,那么在该点处对卷收器进行优化很简单。

+0

MyISAM或InnoDB或..? – 2011-07-31 17:20:19

0

count(*)是O(n)所以它的性能与表中的记录数有关,50k根本不是很多,所以我认为它在管理页面上没问题。当你进入百万美元时count(*)肯定会变得昂贵。

0

MyISAM引擎在内部存储行数,所以当发出像SELECT COUNT(*) FROM table这样的查询时,它会很快。另一方面,使用InnoDB,它会花费一些时间,因为它会计算实际的行数。这意味着 - 更多的行 - 它越慢。但有一个技巧,你使用一个小的覆盖索引来统计表中的所有行 - 然后它很快。另一个诀窍是简单地将行数存储在相应的汇总表中。

0

在MyISAM中,计数(*)已被优化,但没有任何'条件',因此查询速度甚至超过数十亿行。

对于分区表,如果在定义分区的列上有一个简单的条件(例如:计算逻辑表的几个物理表上的所有行),我们可以认为它的行为方式是相同的。 。但是情况并非如此:即使我们要统计所有物理表的所有行,它也会循环。例如,在这里,在一个分成40个表的9800万行表中,需要5分钟来计算最近32个物理表中的行数。