在遇到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()`
如果还有其他更好的方法,请告诉我们。 如果可能的话,请描述答案 - 为什么它最好,更快。所以我可以理解并可以根据我的要求使用该方法。
感谢。
答案 0 :(得分:7)
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获取行更快。