Pro*_*ter 26 mysql count mysql-5.6
我想要一种快速的方法来计算我的表中有几百万行的行数。我在 Stack Overflow 上找到了帖子“ MySQL:计算行数的最快方法”,看起来它可以解决我的问题。Bayuah提供了这个答案:
SELECT
table_rows "Rows Count"
FROM
information_schema.tables
WHERE
table_name="Table_Name"
AND
table_schema="Database_Name";
Run Code Online (Sandbox Code Playgroud)
我喜欢它,因为它看起来像查找而不是扫描,所以它应该很快,但我决定对其进行测试
SELECT COUNT(*) FROM table
Run Code Online (Sandbox Code Playgroud)
看看有多大的性能差异。
不幸的是,我得到了不同的答案,如下所示:
为什么答案相差大约 200 万行?我猜执行全表扫描的查询是更准确的数字,但是有没有一种方法可以获得正确的数字而不必运行这个慢查询?
我跑了ANALYZE TABLE data_302,它在 0.05 秒内完成。当我再次运行查询时,我现在得到了 34384599 行的更接近的结果,但它仍然select count(*)与 34906061 行的数字不同。分析表是否立即返回并在后台处理?我觉得值得一提的是,这是一个测试数据库,目前尚未写入。
没有人会关心是否只是告诉某人表有多大,但我想将行数传递给一些代码,这些代码将使用该数字创建一个“同等大小”的异步查询来查询数据库并行,类似于Alexander Rubin 通过并行查询执行提高慢查询性能中显示的方法。事实上,我将获得最高的 id,SELECT id from table_name order by id DESC limit 1并希望我的表不会变得过于分散。
ype*_*eᵀᴹ 30
有多种方法可以对表中的行进行“计数”。什么是最好的取决于要求(计数的准确性,执行的频率,我们是否需要对整个表进行计数或使用变量where和group by子句等)
a)正常方式。就数他们吧。
select count(*) as table_rows from table_name ;
Run Code Online (Sandbox Code Playgroud)
准确度:运行查询时 100% 准确计数。
效率:不适合大桌子。(因为 MyISAM 表非常快,但现在没有人使用 MyISAM,因为它比 InnoDB 有很多缺点。“非常快”也仅适用于计算整个 MyISAM 表的行数 - 如果查询WHERE有条件,它仍然必须扫描表或索引。)
对于 InnoDB 表,它取决于表的大小,因为引擎必须扫描整个表或整个索引才能获得准确的计数。桌子越大,它变得越慢。
b)使用SQL_CALC_FOUND_ROWS和FOUND_ROWS()。如果我们还需要少量的行(更改LIMIT),则可以使用代替以前的方式。我已经看到它用于分页(获取一些行,同时知道总共有多少行并计算 pgeg 的数量)。
select sql_calc_found_rows * from table_name limit 0 ;
select found_rows() as table_rows ;
Run Code Online (Sandbox Code Playgroud)
准确度:与之前相同。
效率:与之前相同。
c)使用information_schema表格,作为链接问题:
select table_rows
from information_schema.tables
where table_schema = 'database_name'
and table_name = 'table_name' ;
Run Code Online (Sandbox Code Playgroud)
准确度:只是一个近似值。如果表是频繁插入和删除的目标,则结果可能与实际计数相差甚远。这可以通过ANALYZE TABLE更频繁地运行来改善。
效率:非常好,它根本不接触桌子。
d)将计数存储在数据库中(在另一个“计数器”表中)并在每次表有插入、删除或截断时更新该值(这可以通过触发器或通过修改插入和删除过程来实现) .
这当然会在每次插入和删除时增加额外的负载,但会提供准确的计数。
准确度:100% 准确计数。
效率:非常好,只需要从另一个表中读取一行。
然而,它给数据库带来了额外的负载。
e)在应用层中存储(缓存)计数 - 并使用第一种方法(或前面方法的组合)。示例:每 10 分钟运行一次精确计数查询。在两次计数之间的平均时间,使用缓存的值。
准确性:近似但在正常情况下不会太差(除非添加或删除数千行)。
效率:非常好,物超所值。