mysql大表中count()的用法以及mysql中count()的优化【MySQL教程】,python,mysql
一个单表中包括有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(*)来检索.
相干引荐:
mysql中无限极分类的代码完成
Mysql数据库优化的要领总结(必看)
以上就是mysql大表中count()的用法以及mysql中count()的优化的细致内容,更多请关注ki4网别的相干文章!