MySQL 百万级/千万级表 总记录数查询

业务背景:基于 InnoDB 存储引擎的表,在数据量达到百万级之后,用 count 函数查询表记录总数会变得很慢,会导致服务请求超时。针对这种情况总结下我所想到的解决办法。

实际业务场景

表名表名含义行记录数
base_house房屋表4201183

解决方案一:使用count 函数

-- 执行SQL 语句
select count(1) from bad_house;

-- SQL 执行时间
5.133S

使用场景说明:针对百万级及其以上的表数据记录总数统计不推荐使用。

解决方案二:使用预估值

-- 执行SQL查询
select TABLE_NAME, TABLE_ROWS
from  
    INFORMATION_SCHEMA.PARTITIONS  
where 
    TABLE_SCHEMA = 'test' 
    and TABLE_NAME='bds_house';

-- 执行时间
0.003S

使用场景说明:针对百万级及其以上的表数据记录总数通过MySQL数据管理系统自带库表,查询指定schema和table_name的记录总数。温馨提示:这里是个预估值,但与实际表记录总数非存在差别,由于MySQL数据管理系统需要定时更新表的记录总数。

解决方案三:通过自增长Id,统计指定表的记录总数

前提条件:表主键id 必须使用自增长,且必须确保表中数据几乎没有跳id、删数据的情况下,直接用最大id,减最小id。

-- 执行asc 升序排序,且取第一条记录
select id from bds_house order by id asc limit 1;

-- 执行时间
0.9S

-- 执行desc 降序排序,且取第一条记录
select id from bds_house order by id desc limit 1;

-- 执行时间
1.2S

-- 最后一步:
使用desc 降序id值 - 使用asc 升序id值

解决方案四:创建一张统计表table_count, 实时记录给表的记录数

table_count 表结构设计:

DROP TABLE IF EXISTS table_count;
CREATE TABLE table_count(
    ID INT NOT NULL AUTO_INCREMENT  COMMENT '主键' ,
    TABLE_NAME VARCHAR(255) NOT NULL   COMMENT '表名' ,
    TABLE_COUNT INT    COMMENT '表记录总数' ,
    CREATED_BY VARCHAR(255)    COMMENT '创建人' ,
    CREATED_TIME DATETIME    COMMENT '创建时间' ,
    UPDATED_BY VARCHAR(255)    COMMENT '更新人' ,
    UPDATED_TIME DATETIME    COMMENT '更新时间' ,
    PRIMARY KEY (ID)
)  COMMENT = '表记录总数';

设计存储过程:主要实现统计各表的记录总数,我这里以bds_house 表为实例

create procedure table_count_procedure()
begin
	-- 定义字段
	declare R_TABLE_COUNT int default 0;

	-- 查询bds_count 表记录总数
	select count(1) into R_TABLE_COUNT  from bds_house;
	
	-- 执行数据库插入
	insert into table_count(table_name, table_count) values('bds_house', R_TABLE_COUNT);
end

定时调用存储过程的方式:

单体应用:Spring定时任务框架、Quartz、Java Timer/Task等等

分布式应用:XXL-job、分布式Quartz、Elastic-job 等等

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值