溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MySQL中怎么優(yōu)化千萬級數(shù)據(jù)表

發(fā)布時(shí)間:2021-08-03 18:02:13 來源:億速云 閱讀:160 作者:Leah 欄目:開發(fā)技術(shù)

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;

MySQL中怎么優(yōu)化千萬級數(shù)據(jù)表

查詢所有大概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ì)劃:

MySQL中怎么優(yōu)化千萬級數(shù)據(jù)表

alter table `user` add INDEX `sindex` (`uname`,`pwd`,`addr`,`tel`,`regtime`,`age`)

MySQL中怎么優(yōu)化千萬級數(shù)據(jù)表

看上面的執(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;

MySQL中怎么優(yōu)化千萬級數(shù)據(jù)表

這里說一下,這種表一般不會查所有,只會查詢一條,所以建表的時(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è)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(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)容。

AI