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

时间:2011-08-04 10:00:47

标签: mysql database database-optimization

在遇到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()`

如果还有其他更好的方法,请告诉我们。 如果可能的话,请描述答案 - 为什么它最好,更快。所以我可以理解并可以根据我的要求使用该方法。

感谢。

5 个答案:

答案 0 :(得分:7)

COUNT

上引用MySQL参考手册
  

COUNT(*)已经过优化,可以在SELECT检索时非常快速地返回   从一个表中,没有检索到其他列,并且没有WHERE   条款。例如:

mysql> SELECT COUNT(*) FROM student; 
  

此优化仅适用于   仅限MyISAM表,因为存储了精确的行数   存储引擎,可以非常快速地访问。对于交易   存储引擎如InnoDB,存储精确的行数更多   有问题,因为可能正在发生多个交易   这可能会影响计数。

同时阅读这个问题 MySQL - Complexity of: SELECT COUNT(*) FROM MyTable;

答案 1 :(得分:5)

我首先使用SELECT count(*) FROM 'table_name',因为它是最易于理解的,易于理解的,因为DBMS开发人员可能会优化此类常见的惯用查询。

只有当它不够快时,我才会对您列出的方法进行基准测试,以确定是否有更快的速度。

答案 2 :(得分:2)

计算常数稍快一些:

select count('x') from table;

当解析器点击count(*)时,必须弄清楚*表示的表的所有列是什么,并准备好在count()内接受它们。

使用常量绕过此(尽管是轻微的)列检查开销。

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

select sum(1) from table;

答案 3 :(得分: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秒......它'仍在5.3&之间550万

答案 4 :(得分:0)

我有一个想法,就是试图找到一种估算行数的方法。因为它只是让你的用户知道页数,也许你不需要准确,甚至可以说第1页~4837 第1页约4800 < / strong>或者其他什么。

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