mysql大表中count()的用法以及mysql中count()的最佳化

來源:互聯網
上載者:User
本篇文章給大家帶來的內容是關於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(*)來檢索.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.