Mysql千萬級別資料優化方案 單錶

2021-07-07 03:43:54 字數 3407 閱讀 3508

mysql千萬級別資料優化方案 目錄

目錄 1 一、

目的與意義 2 1)

說明 2 二、

解決思路與根據(本測試表中資料在千萬級別) 2 1)

建立索引 2 2)

資料體現

(主鍵非索引,實際測試結果

其中fid

建立索引) 2 3)

mysql

分頁原理 2 4)

經過實際測試當對表所有列查詢時 2 三、

總結 3 1)

獲得分頁資料 3 2)

獲得總頁數:建立表

記錄大資料表中總數

通過觸發器來維護 3

一、 目的與意義

1) 說明

在mysql

單錶中資料達到千萬級別時資料的分頁查詢結果時間過長,對此進行優 達到最優效果,也就是時間最短;

(此統計利用的

jdbc

連線,其中

fid為該錶的主鍵;)

二、 解決思路與根據(本測試表中資料在千萬級別)

1) 建立索引

優點:當表中有大量記錄時,若要對錶進行查詢,第一種搜尋資訊方式是全表搜尋,是將所有記錄一一取出,和查詢條件進行一一對比,然後返回滿足條件的記錄,這樣做會消耗大量資料庫系統時間,並造成大量磁碟i/o操作;第二種就是在表中建立索引,然後在索引中找到符合查詢條件的索引值,最後通過儲存在索引中的rowid(相當於頁碼)快速找到表中對應的記錄。

缺點:當對表中的資料進行增加、刪除和修改的時候,索引也要動態的維護,降低了資料的維護速度。

2) 資料體現(主鍵非索引,實際測試結果   其中fid

建立索引)

未建立索引:select fid from t_history_data  limit 8000000,10  結果:13.396s

建立索引:select fid from t_history_data  limit 8000000,10  結果:2.896s

select * from t_history_data where fid in ( 任意十條資料的id )  結果:0.141s

首先通過分頁得到分頁的資料的id,將id

拼接成字串利用

sql語句

select * from table where id in (

id字串)此語句受資料量大小的影響比較小(如上測試);

3) mysql分頁原理

mysql的

limit

工作原理就是先讀取

n條記錄,然後拋棄前

n條,讀

m條想要的,所以

n越大,效能會越差。

優化前sql: select * from 

v_history_data

limit 

5000000, 10

10.961s

優化後sql: 

select * from v_history_data inner join (select fid from t_history_data limit 5000000, 10) a using (fid)

1.943s

(using index:不讀資料檔案,所有欄位都可以從索引上獲得,using where只是過濾元組,和是否讀取資料檔案或索引檔案沒有關係

分別在於,優化前的sql

需要更多

i/o浪費,因為先讀索引,再讀資料,然後拋棄無需的行。而優化後的

sql(

子查詢那條

)唯讀索引

(cover index)

就可以了,然後通過

member_id

讀取需要的列

4) 經過實際測試當對表所有列查詢時

select * from table 會比 

select 

(所有列名) 

from table 

快些(以查詢

8000000

處資料分頁實驗)。

select 

*from t_history_data limit 8000000,10

結果:10.735s

select

(總共14

列)from t_history_data limit 8000000,10

結果:11.594s

三、 總結 

1) 獲得分頁資料

建立索引:create unique index index_name on 

t_history_data 

(fid)

相應的查詢語句:

select * from v_history_data inner join (select fid from t_history_data limit 5000000, 10) a using (fid)

(原理位於上方紅色標記處

,該方法查詢速度將近提公升10倍

) 相對應的有條件查詢根據需要建立索引

2) 獲得總頁數:建立表 記錄大資料表中總數  通過觸發器來維護(不懂,不了解觸發器

建立表:  

create table `t_total` (

`id` int(11) not null auto_increment,

`tablename` char(25) default null,

`sum` int(11) default null,

primary key (`id`)

) engine=innodb default charset=utf8;

表初始化

寫觸發器

create trigger t1 after insert

on t_history_data for each row

begin

declare i int;

select sum into i from t_total where tablename = 't_history_data' ;

set i = i+1;

update t_total set sum=i where tablename = 't_history_data' ;

end

create trigger t2 after delete

on t_history_data for each row

begin

declare i int;

select sum into i from t_total where tablename = 't_history_data' ;

set i = i-1;

update t_total set sum=i where tablename = 't_history_data' ;

end

Mysql千萬級別資料優化方案

一 目的與意義 1 說明 在mysql單錶中資料達到千萬級別時資料的分頁查詢結果時間過長,對此進行優達到最優效果,也就是時間最短 此統計利用的jdbc連線,其中fid為該錶的主鍵 二 解決思路與根據 本測試表中資料在千萬級別 1 建立索引 優點 當表中有大量記錄時,若要對錶進行查詢,第一種搜尋資訊方...

千萬級別資料插入實現方案

上次面試問我上萬級別的資料如何快速插入資料庫,當時不知怎麼回答,回來通過查資料和實踐,通過執行緒池和事務管理實現了批量快速插入資料,特地總結一下。目錄結構,乙個簡單的springboot工程 首先建立乙個普通的表只有三個字段 create database if not exists demo us...

Oracle 千萬級別資料查詢優化

說明 平時很少接觸到大資料分頁,今天有興趣在資料庫插入1000萬條資料進行測試,經過查詢相關資料得到如下說明 筆者在工作中有一上百萬條記錄的表,在jsp頁面中需對該錶進行分頁顯示,便考慮用rownum來做,下面是具體方法 每頁顯示20條 語句 select from tabname where ro...