效能優化案例-SQL優化
最近剛做了系統遷移,需要將老系統的資料遷移到新的系統中,老系統中是分了100張表,表的資料量分配不均勻,有些表有40G左右的資料,而有些表的資料又比較少。
剛開始處理的方式是,先獲取該表資料的總量,然後進行分頁處理,遷移的sql如下:
第一步:
`
select count(1) from some_table where type_id = #type_id#;
`
第二步:
`
select * from some_table where type_id = #type_id# limit #offset#,#pageSize#;
`
如果對於小名單數量在100萬以內的,這個sql的效能還是挺能滿足的,但是當越到後面的名單的時候,SQL效能越來越差。
原因
limit有兩個引數,第一個引數是offset,第二個引數是取的資料量。當offset很大時,mysql需要掃描從頭到offset的資料量,這個時間會隨著offset越大而越大。
第一次優化
- 使用id分割槽. 先獲取最小的id,然後按照id進行過濾,取最近100條。然後下次迴圈的時候,重新設定id值。
- 再次迴圈獲取下一個100條資料。
select min(id) from some_table where type_id = #type_id#;
`select * from some_table where type_id = #type_id# and id > #min# order by id asc limit #pageSize#;
`
- 通過上面的優化後,在100萬的名單隻需要10分鐘就可以查詢完畢,這個優化解決了大部分的名單遷移,但是在遷移到一些表的資料仍然不行,因為增加id的排序,導致每次的排序,需要做幾億的資料的掃描:
第二次優化
因為我們的目標就是將所有的資料全部讀出來,所以可以先把min和max的id取出來,然後通過id增加固定步調的方式來進行處理。
select min(id) from some_table where type_id = #typeId#
select max(id) from some_table where type_id = #typeId#
虛擬碼:
`
int pageSize = 500;
for(int i = minId; i<= maxId; i+=pageSize){
select * from some_table where type_id =#type_id# where id between i and i+ pageSize;
}
`
由於沒有排序的操作,所以每次的取的資料範圍非常小,通過執行計劃也是可以看出:
總結
sql的寫法不同,執行計劃完全不同,作為開發人員,不能只單純的滿足業務功能就可以了,而是要想想自己寫得sql會怎麼執行,會走那些索引,資料量大得情況下會怎麼樣。並且要善於用一些工具幫助自己分析,(比如idb上得執行計劃的功能就非常棒), 共勉。
相關文章
- Oracle效能優化-SQL優化(案例一)Oracle優化SQL
- Oracle效能優化-SQL優化(案例二)Oracle優化SQL
- Oracle效能優化-SQL優化(案例三)Oracle優化SQL
- Oracle效能優化-SQL優化(案例四)Oracle優化SQL
- SQL效能優化案例分析SQL優化
- MySQL 效能優化之SQL優化MySql優化
- sql效能優化SQL優化
- sql 效能優化SQL優化
- 效能優化部分——高階SQL優化2優化SQL
- SQL效能優化技巧SQL優化
- Sql效能優化梳理SQL優化
- Oracle SQL效能優化OracleSQL優化
- SQL優化案例-使用with as優化Subquery Unnesting(七)SQL優化
- MySQL SQL優化案例(一)MySql優化
- 一個效能優化的案例優化
- sql語句效能優化SQL優化
- SQL SERVER效能優化(轉)SQLServer優化
- SQL Server SQL效能優化之引數化SQLServer優化
- SQL優化案例-union代替or(九)SQL優化
- greenplum 簡單sql優化案例SQL優化
- 記一個SQL優化案例SQL優化
- 資料庫效能優化之SQL語句優化資料庫優化SQL
- 使用優化實用工具來優化SQL Server效能優化SQLServer
- 優化案例--重建索引引發的sql效能問題優化索引SQL
- 【前端效能優化】vue效能優化前端優化Vue
- 使用SQL Profile進行SQL優化案例SQL優化
- 從案例分析如何優化前端效能優化前端
- 資料庫效能優化-索引與sql相關優化資料庫優化索引SQL
- SQL優化案例-單表分頁語句的優化(八)SQL優化
- ORACLE SQL效能優化系列 (一)OracleSQL優化
- SQL SERVER效能優化綜述SQLServer優化
- Oracle SQL效能優化常用方法OracleSQL優化
- 效能為王:SQL標量子查詢的優化案例分析SQL優化
- 前端效能優化(JS/CSS優化,SEO優化)前端優化JSCSS
- sql語句的優化案例分析SQL優化
- Android效能優化----卡頓優化Android優化
- 前端效能優化 --- 圖片優化前端優化
- [效能優化]DateFormatter深度優化探索優化ORM