最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL千萬(wàn)級(jí)數(shù)據(jù)表的優(yōu)化實(shí)戰(zhàn)記錄

 更新時(shí)間:2021年08月03日 15:26:40   作者:Five在努力  
千萬(wàn)級(jí)大表如何優(yōu)化,這是一個(gè)很有技術(shù)含量的問(wèn)題,通常我們的直覺(jué)思維都會(huì)跳轉(zhuǎn)到拆分或者數(shù)據(jù)分區(qū),這篇文章主要給大家介紹了關(guān)于MySQL千萬(wàn)級(jí)數(shù)據(jù)表優(yōu)化的相關(guān)資料,需要的朋友可以參考下

前言

這里先說(shuō)明一下,網(wǎng)上很多人說(shuō)阿里規(guī)定500w數(shù)據(jù)就要分庫(kù)分表。實(shí)際上,這個(gè)500w并不是定義死的,而是與MySQL的配置以及機(jī)器的硬件有關(guān)。MySQL為了提升性能,會(huì)將表的索引裝載到內(nèi)存中。但是當(dāng)表的數(shù)據(jù)到達(dá)一定的量的時(shí)候,會(huì)導(dǎo)致內(nèi)存無(wú)法存儲(chǔ)這些索引,無(wú)法存儲(chǔ)索引,就只能進(jìn)行磁盤IO,從而導(dǎo)致性能下降。

實(shí)戰(zhàn)調(diào)優(yōu)

我這里有張表,數(shù)據(jù)有1000w,目前只有一個(gè)主鍵索引

CREATE TABLE `user` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `uname` varchar(20) DEFAULT NULL COMMENT '賬號(hào)',
  `pwd` varchar(20) DEFAULT NULL COMMENT '密碼',
  `addr` varchar(80) DEFAULT NULL COMMENT '地址',
  `tel` varchar(20) DEFAULT NULL COMMENT '電話',
  `regtime` char(30) DEFAULT NULL COMMENT '注冊(cè)時(shí)間',
  `age` int(11) DEFAULT NULL COMMENT '年齡',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10000003 DEFAULT CHARSET=utf8;

查詢所有大概16s。可謂是相當(dāng)慢了。通常我們一個(gè)后臺(tái)系統(tǒng),比如這個(gè)是一個(gè)電商平臺(tái),這個(gè)是用戶表。后臺(tái)管理系統(tǒng),一般會(huì)查詢這些用戶信息,做一些操作,比如后臺(tái)直接新增用戶啊,或者刪除用戶啊這些操作。

所以這里就誕生了兩個(gè)需求,一個(gè)是查詢count,一個(gè)是分頁(yè)查詢

我們分別來(lái)測(cè)試一下count用的時(shí)間和分頁(yè)查詢所用的時(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í)間可以看出來(lái),如果是分頁(yè)查詢的話,查詢的數(shù)據(jù)越往后用時(shí)是越長(zhǎng)的,查詢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í)際上查詢速度并沒(méi)有發(fā)生改變。

其實(shí),創(chuàng)建聯(lián)合索引,是為了有條件查詢的時(shí)候速度更快,而不是全表查詢

select * from user where uname='6.445329111484186' //3.5s(無(wú)聯(lián)合索引)
select * from user where uname='6.445329111484186' //0.003s(有聯(lián)合索引)

所以這就是有聯(lián)合索引和無(wú)索引的差距

這里基本上可以證明,加了索引和不加索引,進(jìn)行全表查詢的時(shí)候,效率就是會(huì)很慢

既然索引這個(gè)結(jié)果已經(jīng)不好使了,那就只能找其他方案了。根據(jù)我之前mysql面試?yán)锩嬷v的,count我們可以單獨(dú)存儲(chǔ)到一個(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;

這里說(shuō)一下,這種表一般不會(huì)查所有,只會(huì)查詢一條,所以建表的時(shí)候,可以建成hash

select formcount from attribute where formname='user' //幾乎不用時(shí)

count就進(jìn)行優(yōu)化完了。如果上面有選擇條件的話,就可以建立索引,通過(guò)走索引篩選的形式來(lái)查詢,這樣就可以不用讀這個(gè)count了。

那么,count是沒(méi)問(wèn)題了,分頁(yè)查詢優(yōu)化要如何優(yōu)化呢?這里可以使用子查詢來(lái)優(yōu)化

select * from user where
id>=(select id from user limit 9000000,1) limit 10 //1.7s

其實(shí)子查詢這種寫法,判斷id,其實(shí)就是通過(guò)覆蓋索引來(lái)查詢。效率會(huì)大大增加。不過(guò)我這里測(cè)試是1.7s,以前在公司優(yōu)化這方面的時(shí)候,比這個(gè)查詢時(shí)間要低,大家也可以自己生成數(shù)據(jù)自己測(cè)試

但是如果說(shuō)數(shù)據(jù)量太大了,我還是建議走es或者進(jìn)行一些默認(rèn)選擇,count可以單獨(dú)列出來(lái)

至此,一個(gè)千萬(wàn)級(jí)的數(shù)據(jù)分頁(yè)查詢的優(yōu)化就完成了。

總結(jié)

到此這篇關(guān)于MySQL千萬(wàn)級(jí)數(shù)據(jù)表優(yōu)化的文章就介紹到這了,更多相關(guān)MySQL千萬(wàn)級(jí)數(shù)據(jù)表優(yōu)化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql 錯(cuò)誤號(hào)碼1129 解決方法

    mysql 錯(cuò)誤號(hào)碼1129 解決方法

    在本篇文章里我們給大家整理了關(guān)于mysql 錯(cuò)誤號(hào)碼1129以及解決方法,需要的朋友們可以參考下。
    2019-08-08
  • Mysql超時(shí)配置項(xiàng)的深入理解

    Mysql超時(shí)配置項(xiàng)的深入理解

    超時(shí)是我們?nèi)粘=?jīng)常會(huì)遇到的一個(gè)問(wèn)題,這篇文章主要給大家介紹了關(guān)于Mysql超時(shí)配置項(xiàng)的深入理解,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,需要的朋友可以參考下
    2023-01-01
  • mysql第一次安裝成功后初始化密碼操作步驟

    mysql第一次安裝成功后初始化密碼操作步驟

    在本篇文章里小編給大家整理了關(guān)于mysql第一次安裝成功后初始化密碼操作步驟以及相關(guān)知識(shí)點(diǎn),有興趣的朋友們可以學(xué)習(xí)下。
    2019-08-08
  • 深入mysql并發(fā)插入優(yōu)化詳解

    深入mysql并發(fā)插入優(yōu)化詳解

    本篇文章是對(duì)mysql并發(fā)插入優(yōu)化進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • 使用Canal實(shí)現(xiàn)MySQL主從同步的流程步驟

    使用Canal實(shí)現(xiàn)MySQL主從同步的流程步驟

    這篇文章主要介紹了如何使用Canal實(shí)現(xiàn)MySQL主從同步效果,文中通過(guò)代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-04-04
  • ubuntu下apt-get安裝和徹底卸載mysql詳解

    ubuntu下apt-get安裝和徹底卸載mysql詳解

    本文給大家分享ubuntu下apt-get安裝和徹底卸載mysql的方法,文中提到了安裝mysq命令查看mysql是否運(yùn)行的命令寫法,具體內(nèi)容詳情大家通過(guò)本文學(xué)習(xí)吧
    2017-08-08
  • MySQL高級(jí)查詢之與Group By集合使用介紹

    MySQL高級(jí)查詢之與Group By集合使用介紹

    在MySQL中,你可以獲取表達(dá)式組合的連接值。你可以使用DISTINCT刪去重復(fù)值。假若你希望多結(jié)果值進(jìn)行排序,則應(yīng)該使用 ORDER BY子句
    2013-08-08
  • MySQL replace into 語(yǔ)句淺析(一)

    MySQL replace into 語(yǔ)句淺析(一)

    這篇文章主要介紹了MySQL replace into 語(yǔ)句淺析(一),本文講解了replace into的原理、使用方法及使用的場(chǎng)景和使用示例,需要的朋友可以參考下
    2015-05-05
  • Linux下安裝mysql的教程詳解

    Linux下安裝mysql的教程詳解

    這篇文章主要介紹了Linux下安裝mysql的教程詳解,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-11-11
  • 教你使用idea連接服務(wù)器mysql的步驟

    教你使用idea連接服務(wù)器mysql的步驟

    這篇文章主要介紹了如何使用idea連接服務(wù)器上的mysql,具體步驟本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02

最新評(píng)論

白河县| 北流市| 怀宁县| 师宗县| 崇文区| 宜君县| 拉萨市| 鲜城| 香港 | 岳普湖县| 贞丰县| 公安县| 鸡西市| 大足县| 昌吉市| 邳州市| 左贡县| 康乐县| 格尔木市| 炉霍县| 宁陕县| 张掖市| 崇信县| 嘉义市| 拉萨市| 平果县| 常山县| 阜新| 凤山县| 延长县| 潼关县| 平和县| 丘北县| 临湘市| 米脂县| 文昌市| 班戈县| 瑞安市| 麻江县| 长宁区| 安化县|