我必须找出在RHEL5上运行RHEL5 5.5的5000个表的“确切”行计数。据我所知,唯一的方法是"SELECT COUNT(*) from table_name"。但这需要太多的时间。
所以我试着并行运行这些查询。我将查询拆分到10个不同的文件中,每个文件包含500个查询,并从10个不同的终端运行它们,我还尝试使用不同的uid/pwd进行日志记录。每次都是同样的时间。我错过了什么?如何并行运行这些查询。
它是一个16 vCPU和94 It内存系统。我认为吞吐量也是不错的。几乎每个表都有主键。总共需要6小时以上。
发布于 2022-05-21 02:21:31
如果您没有使用该ENGINE=INNODB,请这样说;这个答案是完全错误的。
无论您如何运行它,都必须从磁盘读取相同数量的数据。这就是为什么并行是无用的,至少当有比RAM中缓存的数据更多的数据时。
您应该适当地设置innodb_buffer_pool_size (70%的可用内存)。
有一个诡计会加速一些计数。向任何大型表添加辅助索引;将其索引为最小的列,如ENUM或TINYINT。(如果已经有索引,则不要添加额外的索引;不要为小型表添加额外的索引。)这个技巧很有帮助,因为InnoDB为COUNT(*)选择了最小的笨重索引,从而完成了最少的I/O操作。
发布于 2022-05-21 07:31:06
我们升级到MySQL 8.0。我认为它比5.5更能处理并行性
我在10个不同的会话中并行运行这些查询,执行时间从11小时缩短到2.4小时。
发布于 2022-06-05 21:25:01
使用您的MySQL 8.0,请尝试此查询。
SELECT IFNULL(table_schema,'Total') db,COUNT(1)
table_count,SUM(information_schema.tables.table_rows) row_count
FROM information_schema.tables WHERE table_schema
NOT IN ('information_schema','performance_schema','mysql','sys','innodb')
AND table_type='Base Table'
GROUP BY table_schema WITH ROLLUP; 你可能需要把这里显示的前2行放在一起。
期望表计数和行计数按架构计算,最后一行为总计。查看联系人信息的配置文件,并在需要时保持联系。
请张贴您的确切计数和行计数之间的差异,此查询提供的总数以及此查询所消耗的时间量。
对RolandoMySQLDBA MySQL I/O冻结导致RDS实例崩溃的原意
https://dba.stackexchange.com/questions/312150
复制相似问题