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.varchar2最大长度
使⽤count(1)⽽不是count(*)来检索.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论