从mysql数据库中计算行数的最佳方法

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()`

如果有其他更好的方法,请也让我知道。如果可能的话,可以在回答中解释为什么这种方法更好、更快。这样我就能理解并根据自己的需求使用这种方法了。
谢谢。

你刚刚尝试使用“Limit”并在运行时进行分页吗?例如,如果用户点击“下50个”,则显示下50个项目?以此类推... - PhD
我正在尝试制作常规分页。它将显示为 - 显示第1页,共4739页。我肯定会使用LIMIT来显示结果,但我需要知道行数以制作准确的页码并显示它。 - Aajahid
你能发布这四个选项的时间吗? - jmilloy
5个回答

8

引用MySQL参考手册关于COUNT的内容:

如果SELECT语句只从一张表中检索数据,没有检索其他列,并且没有WHERE子句,那么COUNT(*)将被优化以快速返回结果。例如:

mysql> SELECT COUNT(*) FROM student; 

这种优化仅适用于MyISAM表,因为该存储引擎存储了精确的行数,并且可以非常快速地访问。对于InnoDB等事务性存储引擎而言,存储精确的行数更加困难,因为可能会发生多个事务,每个事务都可能影响计数。
此外,请阅读这个问题MySQL - Complexity of: SELECT COUNT(*) FROM MyTable;

5

我会建议使用SELECT count(*) FROM 'table_name',因为它最具可移植性、易于理解,并且很可能DBMS开发人员会优化这种常见的查询。

只有当这种方法不够快时,才会对你列出的其他方法进行基准测试,以找到是否有任何一种方法显着地更快。


2

常量计数速度略快:

select count('x') from table;

当解析器遇到 count(*)时,它必须去找出所有由*表示的表的列,并准备好在count()内接受它们。
使用一个常量可以绕过这个(虽然轻微的)列检查开销。
顺便说一下,虽然不更快,但一个可爱的选项是:
select sum(1) from table;

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百万),所以我可能会从这些查询中取样本并求平均值。
编辑:使用php进行查询非常慢,最终选择了第一个。查询快速运行30次并取平均值,在1秒内...仍然在530万到550万之间变化。

0

我有一个想法,不妨提出来,尝试找到一种方式来估计行数。由于这只是为了让您的用户了解页面数量,也许您不需要精确,甚至可以说 第一页共约4837页 或者 第一页大约有4800页 等。

我无法快速找到一个估算行数的函数,但您可以尝试获取表格大小并将其除以确定/常量平均行大小。我不知道从TABLE STATUS中获取表格大小是否比从TABLE STATUS中获取行数更快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接