mysql大表中count()的用法以及mysql中count()的優(yōu)化
發(fā)表時間:2023-07-16 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]本篇文章給大家?guī)淼膬?nèi)容是關(guān)于mysql大表中count()的用法以及mysql中count()的優(yōu)化,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。一個單表中包含有6000w+的數(shù)...
本篇文章給大家?guī)淼膬?nèi)容是關(guān)于mysql大表中count()的用法以及mysql中count()的優(yōu)化,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
一個單表中包含有6000w+的數(shù)據(jù),然而你又不能拆分.需要分別統(tǒng)計表中有多少數(shù)據(jù),A產(chǎn)品有多少,B產(chǎn)品有多少這幾個數(shù)據(jù).
在為優(yōu)化之前.表結(jié)構(gòu)如下,為了隱藏內(nèi)容我將相應(yīng)字段做了模糊化處理.
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;
這個一個常規(guī)的InnoDB的表格,所以它的count(*)比起MyISAM的效率慢很多,InnoDB所顯示的row的行數(shù)不很準確,所以在這這里我需要統(tǒng)計一下.有這么幾個策略.
共計61500000數(shù)據(jù)
count(*) 耗時 1539.499s
count(1) 耗時 907.581s
count(A) 對索引進行count.
count(test6) 對主鍵進行count.
無一例外,由于這個表沒有優(yōu)化好上面無論哪一種都需要幾千秒的時間,這個是我們無法忍受的.
下面我們開始著手分析處理這個問題.
預(yù)期整個表的count(*)應(yīng)該在200s以內(nèi)為正常,100以內(nèi)為良好,50以內(nèi)為優(yōu)秀.
首先我將里面test6抽取了出來,單獨形成了一個表.對其進行操作.
共計61500000數(shù)據(jù)
count(*) 耗時10.238s
count(1) 耗時8.710s
count(test6) 對主鍵進行count.耗時12.957s
其中count(1)
的效率最高,比最慢count(pk)
速度提升了52.0%.
將你能確定的字段改為最優(yōu)值,例如:
varchar更為char.雖然varchar可以自動分配存儲空間的大小但是.varchar需要使用1到2個額外的字節(jié)來記錄字符串的長度,增加它的update的操作時間,
datetime改為timestamp后者在1978-2038年之間
最后使用count(1)檢驗的時候最快耗時,168s.雖然有些慢但是可以接受.
總結(jié):
重新設(shè)計你表中的字段,盡量優(yōu)化它的長度.不要一味使用過多的varchar.
使用count(1)而不是count(*)來檢索.
Mysql數(shù)據(jù)庫優(yōu)化的方法總結(jié)(必看)
以上就是mysql大表中count()的用法以及mysql中count()的優(yōu)化的詳細內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!
學(xué)習(xí)教程快速掌握從入門到精通的SQL知識。