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...