Mysql千萬級別資料優化方案

2021-06-22 08:46:11 字數 2592 閱讀 3776

一、      目的與意義

1)        說明

在mysql單錶中資料達到千萬級別時資料的分頁查詢結果時間過長,對此進行優達到最優效果,也就是時間最短;(此統計利用的jdbc連線,其中fid為該錶的主鍵;)

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

1)        建立索引

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

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

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

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

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

select * from t_history_datawhere 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

分別在於,優化前的sql需要更多i/o浪費,因為先讀索引,再讀資料,然後拋棄無需的行。而優化後的sql(子查詢那條)唯讀索引(cover index)就可以了,然後通過member_id讀取需要的列

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

select * from table 會比 select (所有列名) from table 快些(以查詢8000000處資料分頁實驗)。

select  *  from t_history_datalimit 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_datalimit 5000000, 10) a using (fid)    (原理位於上方紅色標記處,該方法查詢速度將近提公升10倍)

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

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

建立表:  createtable `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 wheretablename = 't_history_data' ;

set i = i+1;

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

endcreate 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千萬級別資料優化方案 單錶

mysql千萬級別資料優化方案 目錄 目錄 1 一 目的與意義 2 1 說明 2 二 解決思路與根據 本測試表中資料在千萬級別 2 1 建立索引 2 2 資料體現 主鍵非索引,實際測試結果 其中fid 建立索引 2 3 mysql 分頁原理 2 4 經過實際測試當對表所有列查詢時 2 三 總結 3 ...

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

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

Oracle 千萬級別資料查詢優化

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