我原來(lái)的公司是一家網(wǎng)絡(luò)游戲公司,其中網(wǎng)站交易與游戲數(shù)據(jù)庫(kù)結(jié)合通過(guò)ws實(shí)現(xiàn)的,但是交易記錄存放在網(wǎng)站上,級(jí)別是千萬(wàn)級(jí)別的數(shù)據(jù)庫(kù)是mysql數(shù)據(jù)庫(kù).
上面的內(nèi)容還沒(méi)有進(jìn)行有條件的查詢僅僅是一些關(guān)于orderby和limit的測(cè)試,請(qǐng)關(guān)注我的下一篇文件對(duì)于條件查詢的1億數(shù)據(jù)檢索測(cè)試
現(xiàn)在我們繼續(xù)進(jìn)行一個(gè)測(cè)試相同的表結(jié)構(gòu)插入1億條數(shù)據(jù)這次用到的是Innodb表引擎,表名有些變化,這里為甚要新建一個(gè)表的很重要元素是原來(lái)的那張表是每個(gè)uid=1來(lái)做的索引,這次uid是1...10不等的數(shù)每種1千萬(wàn)條記錄
CREATE TABLE `ipdata` (
} ENGINE=InnoDB AUTO_INCREMENT=100004857 DEFAULT CHARSET=utf8
我開啟了Innodb的線程數(shù)為128,因?yàn)閕nnodb是行級(jí)別鎖定,并發(fā)處理能力很強(qiáng)我開啟100線程每個(gè)線程大小為100萬(wàn)記錄插入時(shí)間如下
JDBC插入100w條數(shù)據(jù)此線程用時(shí):9300984ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):9381203ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):9412343ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):9442046ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):9449828ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):9484703ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):9528093ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):9533359ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):9534296ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):9539718ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):9541750ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):9636406ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):9695093ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):9806890ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):9895500ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):9989750ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):10012312ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):10037250ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):10092796ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):11993187ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12033203ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12068453ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12133625ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12212953ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12253421ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12284968ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12296421ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12366828ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12388093ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12389656ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12396625ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12417921ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12431000ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12432875ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12434703ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12455218ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12457109ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12484218ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12518375ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12519015ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12521109ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12521515ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12537343ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12539421ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12544250ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12559234ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12567484ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12574109ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12579156ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12638046ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12693047ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12722906ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12728781ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12732546ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12748265ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12757421ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12761375ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12765312ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12788359ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12802765ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12810484ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12811062ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12811796ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12812843ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12829671ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12830296ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12840000ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12840890ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12850312ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12856671ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12858609ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12860125ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12861750ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12864125ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12875609ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12875781ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12900859ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12906812ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12909656ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12913375ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12915609ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12917562ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12918000ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12919468ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12922093ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12922843ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12924375ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12925734ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12925781ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12931140ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12934562ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12934828ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12935281ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12936953ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12937218ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12937406ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12937765ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12939125ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12940281ms
JDBC插入100w條數(shù)據(jù)此線程用時(shí):12941828ms
大概一共用了2個(gè)多小時(shí)內(nèi)容為1億條數(shù)據(jù)mysql的innodb中文件大小為 11.7 GB (12,660,506,624 字節(jié));
首先來(lái)看看in查詢
SELECT * FROM ipdata WHERE id IN(112358,201023,100020,100001,10000,100000,1000000,10000000,100000000); 141ms
SELECT * FROM ipdata WHERE id IN(12345,123456,1234567,12345678,987654,789654,1236985,852963,9745621,78965412); 141ms
看來(lái)in的查詢還算理想,
然后我們進(jìn)行分頁(yè)必要查詢不排序
SELECT id FROM ipdata WHERE uid=1 LIMIT 1,10; 31ms;
SELECT id FROM ipdata WHERE uid=1 LIMIT 10,10; 0ms;
SELECT id FROM ipdata WHERE uid=1 LIMIT 100,10; 0ms;
SELECT id FROM ipdata WHERE uid=1 LIMIT 1000,10; 0ms;
SELECT id FROM ipdata WHERE uid=1 LIMIT 10000,10; 47ms;
SELECT id FROM ipdata WHERE uid=1 LIMIT 100000,10; 235ms;
SELECT id FROM ipdata WHERE uid=1 LIMIT 1000000,10; 1.438s;
SELECT id FROM ipdata WHERE uid=1 LIMIT 5000000,10; 5.422s;
SELECT id FROM ipdata WHERE uid=1 LIMIT 10000000,10; 9.562s; 無(wú)返回結(jié)果
SELECT id FROM ipdata WHERE uid=1 LIMIT 9999990,10; 10.953s;
符合上一篇的結(jié)論mysql越向后越慢,但是整體來(lái)說(shuō)是可以接受的,畢竟分頁(yè)到最后一頁(yè)雖然用到了10秒鐘,但是后臺(tái)人員不可能到最后去看,第二呢,10秒后臺(tái)人員也算可以接受級(jí)別;
分頁(yè)排序查詢
SELECT id FROM ipdata WHERE uid=1 ORDER BY id ASC LIMIT 1,10; 0ms;
SELECT id FROM ipdata WHERE uid=1 ORDER BY id ASC LIMIT 10,10; 0ms;
SELECT id FROM ipdata WHERE uid=1 ORDER BY id ASC LIMIT 100,10; 0ms;
SELECT id FROM ipdata WHERE uid=1 ORDER BY id ASC LIMIT 1000,10; 0ms;
SELECT id FROM ipdata WHERE uid=1 ORDER BY id ASC LIMIT 10000,10; 47ms;
SELECT id FROM ipdata WHERE uid=1 ORDER BY id ASC LIMIT 100000,10; 266ms;
SELECT id FROM ipdata WHERE uid=1 ORDER BY id ASC LIMIT 1000000,10; 1.594s;
SELECT id FROM ipdata WHERE uid=1 ORDER BY id ASC LIMIT 5000000,10; 5.625s;
SELECT id FROM ipdata WHERE uid=1 ORDER BY id DESC LIMIT 5000000,10; 11.235s;
SELECT id FROM ipdata WHERE uid=1 ORDER BY id ASC LIMIT 10000000,10; 11.562s 無(wú)返回結(jié)果
SELECT id FROM ipdata WHERE uid=1 ORDER BY ID ASC LIMIT 9999990,10; 11.719s;
SELECT id FROM ipdata WHERE uid=1 ORDER BY ID DESC LIMIT 9999990,10; 18.719s;
結(jié)論是如果單查找id,order by的時(shí)間比較可觀,但是可見正序和倒序時(shí)間不同.
返回全部結(jié)果查詢"*"
SELECT * FROM ipdata WHERE uid=1 ORDER BY id ASC LIMIT 1,10; 109ms;
SELECT * FROM ipdata WHERE uid=1 ORDER BY id ASC LIMIT 10,10; 0ms;
SELECT * FROM ipdata WHERE uid=1 ORDER BY id ASC LIMIT 100,10; 16ms;
SELECT * FROM ipdata WHERE uid=1 ORDER BY id ASC LIMIT 1000,10; 63ms;
SELECT * FROM ipdata WHERE uid=1 ORDER BY id ASC LIMIT 10000,10; 356ms;
SELECT * FROM ipdata WHERE uid=1 ORDER BY id ASC LIMIT 100000,10; 2.969s;
SELECT * FROM ipdata WHERE uid=1 ORDER BY id ASC LIMIT 1000000,10; 30.766s;
select id,uid,ipaddress,source,track,entrance,createdtime,createddate from ipdata WHERE uid=1 ORDER BY id ASC LIMIT 1000000,10; 29.953s;
...下面的就不測(cè)試了,已經(jīng)難以接受了
結(jié)論SELECT id 要比SELECT *快了不少至少在大的結(jié)果面前;
結(jié)果count測(cè)試
SELECT COUNT(*) FROM ipdata WHERE uid=1; 12.281s;
SELECT COUNT(*) FROM ipdata WHERE uid=2; 12.250s;
....
SELECT COUNT(*) FROM ipdata WHERE uid=10; 11.453s;
count級(jí)別大概是10多秒左右返回都是1000萬(wàn);
Count(id)測(cè)試
SELECT COUNT(id) FROM ipdata WHERE uid=1; 10.281s;
SELECT COUNT(id) FROM ipdata WHERE uid=2; 10.531s;
....
SELECT COUNT(id) FROM ipdata WHERE uid=10; 12.531s;
Count(id)這里我不知道是機(jī)器原因可能測(cè)試不是十分準(zhǔn)確,總之相差不大,不知道是否mysql默認(rèn)通過(guò)唯一主鍵來(lái)count,如果*和id差不多都方便我還是推薦id,呵呵
總結(jié)
接下來(lái)我將要測(cè)試一些關(guān)于1億+的用戶數(shù)據(jù)表的解決方案,及大數(shù)據(jù)的搜索方案通過(guò)lucene/solr+mysql
聯(lián)系客服
微信登錄中...
請(qǐng)勿關(guān)閉此頁(yè)面