计数表行


165

什么是MySQL命令来检索表中的记录数?

Answers:


236
SELECT COUNT(*) FROM fooTable;

将计算表中的行数。

请参阅参考手册


7
使用索引列的名称而不是*会更快吗?像这样:SELECT COUNT(id)FROMtablename

1
只是轻微。我得到了一个21961904行表,他的COUNT在115秒内被查询,而使用ID花费了107秒。
Bondolin

2
COUNT(*)是严格的语言定义。如果尝试使用COUNT(*),则会出现解析错误,请注意空格
ppostma1 2014年

9
您可以这样做COUNT(1),这将是最快的方法。
Shota Papiashvili

使用COUNT()在PHP中编写变量的最佳方法是什么?我是否在SQL中执行“ ... COUNT(*)AS rowCount ...”,是否使用$ results-> num_rows,还是可以直接调用此结果?
Nosajimiki

71

因为没有人提到它:

show table status;

列出所有表以及一些其他信息,包括每个表的估计行。这就是phpMyAdmin用于其数据库页面。

该信息在MySQL 4中可用,可能在MySQL 3.23中也可用-较长时间的先前信息架构数据库。

更新:

由于投票否决,我想澄清一下显示的数字是针对InnoDB和TokuDB估算的,所以对于MyISAM和Aria(Maria)存储引擎来说绝对正确。

根据文档

行数。某些存储引擎(例如MyISAM)存储准确的计数。对于其他存储引擎,例如InnoDB,该值是一个近似值,可能与实际值相差40%至50%。在这种情况下,请使用SELECT COUNT(*)获得准确的计数。

这也是查看MySQL上行数的最快方法,因为查询如下:

select count(*) from table;

执行全表扫描可能是非常昂贵的操作,在大型高负载服务器上可能要花费数小时。它还会增加磁盘I / O。

相同的操作可能会阻止该表进行插入和更新-这仅在外部存储引擎上发生。

InnoDB和TokuDB可以使用表锁定,但是需要全表扫描。


3
这似乎是对行进行计数的最有效方法。我不知道为什么不是答案?我正在使用InnoDB。使用表锁时,行数应该正确吗?
钟伦元

对于innodb,它是估计的。但是您可以在某些情况下使用“我们的网站有xxx个成员”,“我们检测到与您的结果相似的xxx个结果”等。
尼克,

我不确定。但是对于Innodb来说并不是真正的数字。但是对于百万行表来说非常有用。
尼克,

4
遍历表以对每一行进行计数以获得行计数是相当荒谬的。所以我也喜欢这个答案。
th3penguinwhisperer

35

我们还有另一种方法来查找表中的行数,而无需在该表上运行select查询。

每个MySQL实例都有一个information_schema数据库。如果运行以下查询,它将提供有关该表的完整详细信息,包括该表中的大约行数。

select * from information_schema.TABLES where table_name = 'table_name'\G

因为MyISAM存储行数,这在MyISAM表上是否也更快?
NaturalBornCamper

我从未在MyISAM上测试过。
Santhosh Tangudu



3

只是做一个

SELECT COUNT(*) FROM table;

您可以在之后指定一个条件

SELECT COUNT(*) FROM table WHERE eye_color='brown';

3

If you have several fields in your table and your table is huge, it's better DO NOT USE * because of it load all fields to memory and using the following will have better performance

SELECT COUNT(1) FROM fooTable;

This is incorrect. See stackoverflow.com/questions/5179969/… COUNT(1) may actually be much slower for MyISAM.
jcoffland

@jcoffland您可以自己尝试t,特别是当您加入或条件比count(*)快得多的时候。
Yuseferi '18 -10-26

2

正如Santosh所提到的,我认为此查询是适当的快速,而不是查询所有表。

为特定数据库中的特定表名返回数据记录数的整数结果

select TABLE_ROWS from information_schema.TABLES where TABLE_SCHEMA = 'database' 
AND table_name='tablename';

1
这可能会返回估计的行数。在一个示例中,使用COUNT(*)获得了55,940,343行,但是使用此方法获得了56,163,339行,因此它减少了200k以上。
jcoffland '18 -10-25

@jcoffland,我提到了_ Santosh_的答案,上面指出结果是近似值。我的答案是更详细的实际查询。如果您想count(*)在绩效意识中使用精确的计数,则在所有答案中都非常清楚
Mohammad Kanan

1
$sql="SELECT count(*) as toplam FROM wp_postmeta WHERE meta_key='ICERIK' AND post_id=".$id;
$total = 0;
$sqls = mysql_query($sql,$conn);
if ( $sqls ) {
    $total = mysql_result($sqls, 0);
};
echo "Total:".$total;`

这个答案已经过时,在PHP 5.5.0中不推荐使用mysql_result,在PHP 7.0.0中将其删除
使这个世界变得更好

1

您必须使用count()返回与指定条件匹配的行数

select count(*) from table_name;

0

如果您有主键或唯一键/索引,则可能是更快的方法(已对400万行表进行了测试)

SHOW INDEXES FROM "database.tablename" WHERE Key_Name=\"PRIMARY\"

然后获取基数字段(接近即时)

从0.4s到0.0001ms的时间

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.