欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

實戰(zhàn)調優(yōu)

我這里有張表,數據有1000w,目前只有一個主鍵索引

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 '注冊時間',
  `age` int(11) DEFAULT NULL COMMENT '年齡',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10000003 DEFAULT CHARSET=utf8;

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

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

我們分別來測試一下count用的時間和分頁查詢所用的時間

select * from user limit 1, 10   //幾乎不用時
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

從上面查詢所用時間可以看出來,如果是分頁查詢的話,查詢的數據越往后用時是越長的,查詢count也需要1.7s。這顯然是不符合我們的要求的。所以,這里我們就需要優(yōu)化。首先我們這里進行索引優(yōu)化試試
首先看一下這是只有主鍵索引的執(zhí)行計劃:

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

看上面的執(zhí)行計劃,雖然type是從all->index,走了sindex索引,但是實際上查詢速度并沒有發(fā)生改變。

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

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

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

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

既然索引這個結果已經不好使了,那就只能找其他方案了。根據我之前mysql面試里面講的,count我們可以單獨存儲到一個表里面

CREATE TABLE `attribute` (
  `id` int(11) NOT NULL,
  `formname` varchar(50) COLLATE utf8_bin NOT NULL COMMENT '表名',
  `formcount` int(11) NOT NULL COMMENT '表總數據',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

這里說一下,這種表一般不會查所有,只會查詢一條,所以建表的時候,可以建成hash

select formcount from attribute where formname='user' //幾乎不用時

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

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

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

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

但是如果說數據量太大了,我還是建議走es或者進行一些默認選擇,count可以單獨列出來

至此,一個千萬級的數據分頁查詢的優(yōu)化就完成了。

總結

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

相關文章

  • sql?distinct多個字段的使用

    sql?distinct多個字段的使用

    這篇文章主要介紹了sql?distinct多個字段的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • MySQL的InnoDB存儲引擎的數據頁結構詳解

    MySQL的InnoDB存儲引擎的數據頁結構詳解

    這篇文章主要為大家詳細介紹了MySQL的InnoDB存儲引擎的數據頁結構,,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • mysql5.7 新增的json字段類型用法實例分析

    mysql5.7 新增的json字段類型用法實例分析

    這篇文章主要介紹了mysql5.7 新增的json字段類型用法,結合實例形式分析了mysql5.7 新增的json字段類型具體功能、使用方法及操作注意事項,需要的朋友可以參考下
    2020-02-02
  • 簡單聊一聊SQL中的union和union?all

    簡單聊一聊SQL中的union和union?all

    在寫SQL的時候,偶爾會用到兩個表的數據結合在一起返回的,就需要用到UNION 和 UNION ALL,這篇文章主要給大家介紹了關于SQL中union和union?all的相關資料,需要的朋友可以參考下
    2023-02-02
  • Navicat無法連接MySQL報錯1251的解決方案

    Navicat無法連接MySQL報錯1251的解決方案

    這篇文章主要為大家詳細介紹了Navicat無法連接MySQL報錯1251的解決方案,文中解決方法介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2023-12-12
  • MySQL數據庫中遇到no?database?selected問題解決辦法

    MySQL數據庫中遇到no?database?selected問題解決辦法

    這篇文章主要給大家介紹了關于MySQL數據庫中遇到no?database?selected問題的解決辦法,這是MySQL數據庫的錯誤提示,意思是沒有選擇數據庫,在使用MySQL命令行操作時需要先選擇要操作的數據庫,否則就會出現這個錯誤,需要的朋友可以參考下
    2024-03-03
  • mysql中general_log日志知識點介紹

    mysql中general_log日志知識點介紹

    這篇文章主要介紹了mysql中general_log日志知識點的介紹以及其他相關內容,以后興趣的朋友們學習下。
    2019-08-08
  • mysql 5.7.13 安裝配置方法圖文教程(win10 64位)

    mysql 5.7.13 安裝配置方法圖文教程(win10 64位)

    這篇文章主要為大家分享了win10 64位下mysql 5.7.13 安裝配置方法圖文教程,感興趣的朋友可以參考一下
    2017-02-02
  • 安裝mysql noinstall zip版

    安裝mysql noinstall zip版

    沒用過mysql, 這幾天折騰django ,發(fā)現連接mssql好像還是有些小bug,為了防止日后項目有些莫名的db故障,故選擇django推薦之一的mysql
    2011-12-12
  • MySQL5.7安裝過程并重置root密碼的方法(shell 腳本)

    MySQL5.7安裝過程并重置root密碼的方法(shell 腳本)

    由于 MySQL 5.7 版本的 root 密碼是首次啟動時隨機生成的,并且還要求必須修改后才能使用。下面小編給大家分享使用shell 腳本完成安裝和設置新的 root 密碼的方法,一起看看吧
    2016-12-12

最新評論