mysql大表count_mysql 大表中count() 使用方法以及性能优化.

笔者现在遇到这么一个场景,

一个单表中包含有6000w+的数据,然而你又不能拆分.需要分别统计表中有多少数据,A产品有多少,B产品有多少这几个数据.

在为优化之前.表结构如下,为了隐藏内容我将相应字段做了模糊化处理.

CREATE TABLE `xxxx` (

`link` varchar(200) DEFAULT NULL,

`test0` varchar(500) DEFAULT NULL,

`test1` varchar(50) DEFAULT NULL,

`test2` int(11) DEFAULT NULL,

`test3` varchar(20) DEFAULT NULL,

`test4` varchar(50) DEFAULT NULL,

`test5` varchar(50) NOT NULL,

`inserttime` datetime DEFAULT NULL,

`test6` bit(1) NOT NULL DEFAULT b'0',

`A` bit(1) NOT NULL DEFAULT b'0',

`B` bit(1) NOT NULL DEFAULT b'0' ,

PRIMARY KEY (`test5`),

KEY `test6` (`test6`) USING BTREE,

KEY `A` (`A`) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这个一个常规的InnoDB的表格,所以它的count(*)比起MyISAM的效率慢很多,InnoDB所显示的row的行数不很准确,所以在这这里我需要统计一下.有这么几个策略.

共计61500000数据

count(*) 耗时 1539.499s

count(1) 耗时 907.581s

count(A) 对索引进行count.

count(test6) 对主键进行count.

无一例外,由于这个表没有优化好上面无论哪一种都需要几千秒的时间,这个是我们无法忍受的.

下面我们开始着手分析处理这个问题.

预期整个表的count(*)应该在200s以内为正常,100以内为良好,50以内为优秀.

首先我将里面test6抽取了出来,单独形成了一个表.对其进行操作.

共计61500000数据

count(*) 耗时10.238s

count(1) 耗时8.710s

count(test6) 对主键进行count.耗时12.957s

其中count(1)的效率最高,比最慢count(pk)速度提升了52.0%.

将你能确定的字段改为最优值,例如:

varchar更为char.虽然varchar可以自动分配存储空间的大小但是.varchar需要使用1到2个额外的字节来记录字符串的长度,增加它的update的操作时间,

datetime改为timestamp后者在1978-2038年之间

最后使用count(1)检验的时候最快耗时,168s.虽然有些慢但是可以接受.

总结:

重新设计你表中的字段,尽量优化它的长度.不要一味使用过多的varchar.

使用count(1)而不是count(*)来检索.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值