3

在遇到 mysql 查询加载时间缓慢的问题后,我现在正在寻找计算行数的最佳方法。我愚蠢地使用mysql_num_rows()函数来做到这一点,现在意识到这是最糟糕的方法。我实际上是在做一个分页来用 PHP 制作页面。我找到了几种计算行数的方法。但我正在寻找更快的方法来计算它。

表类型是 MyISAM

所以现在的问题是

哪个是最好和更快的计数 -

1. `SELECT count(*) FROM 'table_name'`

2. `SELECT TABLE_ROWS
FROM INFORMATION_SCHEMA.TABLES WHERE table_schema =  'database_name'
AND table_name LIKE  'table_name'`

3. `SHOW TABLE STATUS LIKE 'table_name'`

4. `SELECT FOUND_ROWS()`

如果还有其他更好的方法可以做到这一点,请也让我知道。如果可能的话,请连同答案一起描述 - 为什么它是最好和更快的。所以我可以理解并可以根据我的要求使用该方法。

谢谢。

4

5 回答 5

8

在COUNT上引用 MySQL 参考手册

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

mysql> SELECT COUNT(*) FROM student; 

此优化仅适用于 MyISAM 表,因为为此存储引擎存储了准确的行数,并且可以非常快速地访问。对于 InnoDB 等事务性存储引擎,存储准确的行数会带来更多问题,因为可能会发生多个事务,每个事务都可能影响计数。

另请阅读此问题 MySQL - Complexity of: SELECT COUNT(*) FROM MyTable;

于 2011-08-04T10:26:13.393 回答
5

我会首先使用SELECT count(*) FROM 'table_name'它,因为它是最便携、最容易理解的,并且因为 DBMS 开发人员很可能会优化这种常见的惯用查询。

只有当这还不够快时,我才会对您列出的方法进行基准测试,以发现是否有明显更快的方法。

于 2011-08-04T10:18:13.857 回答
2

计算一个常数会稍微快一些:

select count('x') from table;

当解析器命中count(*)时,它必须弄清楚表的所有列是由 表示的,*并准备好在count().

使用常量绕过了这个(尽管很小)列检查开销。

顺便说一句,虽然不是更快,但一个可爱的选择是:

select sum(1) from table;
于 2011-08-04T10:30:05.577 回答
1

我最近环顾​​四周。似乎这里有一些我以前从未见过的。

特殊需求:这个数据库大约有 600 万条记录,并且一直被多插入查询压垮。至少很难说得到真正的计数。

SELECT TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE table_schema =  'admin_worldDomination' AND table_name LIKE  'master'

Showing rows 0 - 0 ( 1 total, Query took 0.0189 sec)

这是体面的,非常快但不准确。显示从 400 万行到近 800 万行的结果

SELECT count( * ) AS counter FROM `master`

没有显示时间,实际耗时 8 秒。随着桌子的增长,情况会变得更糟。直到今天,这一直在杀死我的网站。

SHOW TABLE STATUS LIKE 'master'

似乎和第一个一样快,但没有显示时间。提供许多其他表信息,但其中没有多少是值得的(可能是平均记录长度)。

SELECT FOUND_ROWS() FROM 'master'

Showing rows 0 - 29 ( 4,824,232 total, Query took 0.0004 sec)

这很好,但很平均。比其他人更紧密地传播(4-5 百万),所以我可能最终会从其中一些查询中抽取样本并取平均值。

EDIT: This was really slow when doing a query in php, ended up going with the first. Query runs 30 times quickly and I take an average, under 1 second ... it' still ranges between 5.3 & 5.5 million

于 2016-03-05T17:27:15.887 回答
0

我有一个想法,把它扔在那里,是试图找到一种方法来估计行数。因为它只是为了让您的用户了解页数,所以您可能不需要精确,甚至可以说Page 1 of ~4837Page 1 of about 4800 之类的

我无法快速找到估计计数函数,但您可以尝试获取表大小并除以确定/恒定的平均行大小。我不知道从 TABLE STATUS 获取表大小是否或为什么会比从 TABLE STATUS 获取行更快。

于 2011-08-04T12:03:18.313 回答