MySQL千萬級資料表的優化實戰記錄

2022-09-21 23:24:15 字數 2462 閱讀 8833

這裡先說明一下,網上很多人說阿里規定500w資料就要分庫分表。實際上,這個500w並不是定義死的,而是與mysql的配置以及機器的硬體有關。my為了提公升效能,會將表的索引裝載到記憶體中。但是當表的資料到達一定的量的時候,會導致記憶體無法儲存這些索引,無法儲存索引,就只能進行磁碟io,從而導致效能下降。

我這裡有張表,資料有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。可謂是相當慢了。通常我們乙個後台系統,比如這個是乙個電商平台,這個是使用者表。後台管理系統,一般會查詢這些使用者資訊,做一些操作,比如後台直接新增使用者啊,或者刪除使用者啊這些操作。

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

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

select * from user limit 1, 10 //幾乎不用時

select * from user limit 1000000, 10

select * from user limit 5000000, 10

select * from user limit 9000000, 10

select count(1) from user

從上面查詢所用時間可以看出來,如果是分頁查詢的話,查詢的資料越往後用時是越長的,查詢count也需要1.程式設計客棧7s。這顯然是不符合我們的要求的。所以,這裡我們就需要優化。首先我們這裡進行索引優化試試

首先看一下這是只有主鍵索引的執行計畫:

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

看上面的執行計畫,雖然type是從all->index,走了sindex索引,但是實際上查詢速度並沒有發生改變。

其實,建立聯合索引,是為了有條件查詢的時候速度更快,而不是全表查詢

select * from user where uname='6.445329111484186' 無聯合索引)

select * from user where uname='6.445329111484186' 有聯合索引)

所以這就是有聯合索引和無索引的差距

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

既然索引這個結果已經不好使了,那就只能找其他方案了。根據我之前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就進行優化完了。如果上面有選擇條件的話,就可以建立索引,通過走索引篩選的形式來查詢,這樣就可以不用讀這個count了。

那麼,count是沒問題了,分頁查詢優化要如何優化呢?這裡可以使用子查詢來優化

select * from user where

id>=(select id from user limit 9000000,1) limit 10

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

但是如果說數程式設計客棧據量太大了,我還是建議走es或者進行一些預設選擇,count可以單獨列出來

至此,乙個千萬級的資料分頁查詢的優化就完成了。

MySQL千萬級資料表優化思路

本文參考知乎問答整理 喜歡這樣的論調 mysql只做簡單的事情,千萬級的表,無論怎樣優化,同樣的sql,都沒有在十萬級的表中執行效率快 因此,在設計千萬級的大表之前,要先問自己幾個問題 我們當然希望每個應用都可以這樣,但理想終歸是理想,現實中,輪到我們自己擼袖子上陣的時候,坑,大多已經是一眼忘不到底...

千萬級別mysql資料表優化

第一優化你的sql和索引 第二加快取,memcached,redis 第三以上都做了後,還是慢,就做主從複製或主主複製,讀寫分離,可以在應用層做,效率高,也可以用三方工具,第三方工具推薦360的atlas,其它的要麼效率不高,要麼沒人維護 第四如果以上都做了還是慢,不要想著去做切分,mysql自帶分...

mysql千萬級資料大表該如何優化

1.資料的容量 1 3年內會大概多少條資料,每條資料大概多少位元組 2.資料項 是否有大字段,那些欄位的值是否經常被更新 3.資料查詢sql條件 哪些資料項的列名稱經常出現在where group by order by子句中等 4.資料更新類sql條件 有多少列經常出現update或delete ...