您好,登錄后才能下訂單哦!
MySQL中怎么優(yōu)化千萬級數(shù)據(jù)表,很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
我這里有張表,數(shù)據(jù)有1000w,目前只有一個(gè)主鍵索引
CREATE TABLE `user` ( `id` int(10) NOT NULL AUTO_INCREMENT, `uname` varchar(20) DEFAULT NULL COMMENT '賬號', `pwd` varchar(20) DEFAULT NULL COMMENT '密碼', `addr` varchar(80) DEFAULT NULL COMMENT '地址', `tel` varchar(20) DEFAULT NULL COMMENT '電話', `regtime` char(30) DEFAULT NULL COMMENT '注冊時(shí)間', `age` int(11) DEFAULT NULL COMMENT '年齡', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=10000003 DEFAULT CHARSET=utf8;
查詢所有大概16s??芍^是相當(dāng)慢了。通常我們一個(gè)后臺系統(tǒng),比如這個(gè)是一個(gè)電商平臺,這個(gè)是用戶表。后臺管理系統(tǒng),一般會查詢這些用戶信息,做一些操作,比如后臺直接新增用戶啊,或者刪除用戶啊這些操作。
所以這里就誕生了兩個(gè)需求,一個(gè)是查詢count,一個(gè)是分頁查詢
我們分別來測試一下count用的時(shí)間和分頁查詢所用的時(shí)間
select * from user limit 1, 10 //幾乎不用時(shí) select * from user limit 1000000, 10 //0.35s select * from user limit 5000000, 10 //1.7s select * from user limit 9000000, 10 //2.8s select count(1) from user //1.7s
從上面查詢所用時(shí)間可以看出來,如果是分頁查詢的話,查詢的數(shù)據(jù)越往后用時(shí)是越長的,查詢count也需要1.7s。這顯然是不符合我們的要求的。所以,這里我們就需要優(yōu)化。首先我們這里進(jìn)行索引優(yōu)化試試
首先看一下這是只有主鍵索引的執(zhí)行計(jì)劃:
alter table `user` add INDEX `sindex` (`uname`,`pwd`,`addr`,`tel`,`regtime`,`age`)
看上面的執(zhí)行計(jì)劃,雖然type是從all->index,走了sindex索引,但是實(shí)際上查詢速度并沒有發(fā)生改變。
其實(shí),創(chuàng)建聯(lián)合索引,是為了有條件查詢的時(shí)候速度更快,而不是全表查詢
select * from user where uname='6.445329111484186' //3.5s(無聯(lián)合索引) select * from user where uname='6.445329111484186' //0.003s(有聯(lián)合索引)
所以這就是有聯(lián)合索引和無索引的差距
這里基本上可以證明,加了索引和不加索引,進(jìn)行全表查詢的時(shí)候,效率就是會很慢
既然索引這個(gè)結(jié)果已經(jīng)不好使了,那就只能找其他方案了。根據(jù)我之前mysql面試?yán)锩嬷v的,count我們可以單獨(dú)存儲到一個(gè)表里面
CREATE TABLE `attribute` ( `id` int(11) NOT NULL, `formname` varchar(50) COLLATE utf8_bin NOT NULL COMMENT '表名', `formcount` int(11) NOT NULL COMMENT '表總數(shù)據(jù)', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
這里說一下,這種表一般不會查所有,只會查詢一條,所以建表的時(shí)候,可以建成hash
select formcount from attribute where formname='user' //幾乎不用時(shí)
count就進(jìn)行優(yōu)化完了。如果上面有選擇條件的話,就可以建立索引,通過走索引篩選的形式來查詢,這樣就可以不用讀這個(gè)count了。
那么,count是沒問題了,分頁查詢優(yōu)化要如何優(yōu)化呢?這里可以使用子查詢來優(yōu)化
select * from user where id>=(select id from user limit 9000000,1) limit 10 //1.7s
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。