MySQL預先計算
單位有一個很複雜的統計SQL,關聯了5張表
並且排序跨越了兩個表,
並且一個升序,一個降序...
這個SQL先查到一個大分類下所有的小分類,然後查詢小分類下所有的歌曲,然後使用歌曲連線到排行榜的資料,
根據優先順序和排行榜的點選率排序,最後取若干條資料。
優先順序 升序 點選率 降序。
表設計嚴格遵守三正規化,沒有一個冗餘欄位
這個SQL的功能是提供大分類下按照點選率排行的歌曲列表,所以使用率很高,雖然有快取,但是快取失效,平均查詢時間需要10s。
由於這個SQL對於點選率的實時性要求不高,所以採用類似Oracle物化檢視,定期全量重新整理的方式最佳化。
新建一個表,MV_Test
每天先truncate這個表,然後使用5個表的關聯查詢初始化這個表,
然後程式只使用MV_Test這個表。
這個最佳化的方式很常見。
但是遇到兩個問題
1.排序欄位一個升序,一個降序。
因為MySQL沒有實現降序的索引,所以在初始化MV的時候,需要整理資料。
假設原來的優先順序為priority欄位,則在插入MV的時候,需要插入(0-priority)
這樣優先順序和點選率就都可以使用降序了。
2.初始化MV的資料需要30s
先truncate,然後初始化資料。問題是初始化資料需要30s。
在這30s內,使用者訪問不到任何的資料。
業務人員也要求最好每個小時重新整理一次。
難道每小時都要給使用者看30s的白板嗎?
後來採用的方案
初始化的資料寫入mv_test_pre表(新建一個"準備"表)
初始化完成之後,rename表。這個rename的過程不到1毫秒。
RENAME TABLE mv_test TO tmp_mv_test,
mv_test_pre TO mv_test,
tmp_mv_test TO mv_test_pre;
參考:
並且排序跨越了兩個表,
並且一個升序,一個降序...
這個SQL先查到一個大分類下所有的小分類,然後查詢小分類下所有的歌曲,然後使用歌曲連線到排行榜的資料,
根據優先順序和排行榜的點選率排序,最後取若干條資料。
優先順序 升序 點選率 降序。
表設計嚴格遵守三正規化,沒有一個冗餘欄位
這個SQL的功能是提供大分類下按照點選率排行的歌曲列表,所以使用率很高,雖然有快取,但是快取失效,平均查詢時間需要10s。
由於這個SQL對於點選率的實時性要求不高,所以採用類似Oracle物化檢視,定期全量重新整理的方式最佳化。
新建一個表,MV_Test
每天先truncate這個表,然後使用5個表的關聯查詢初始化這個表,
然後程式只使用MV_Test這個表。
這個最佳化的方式很常見。
但是遇到兩個問題
1.排序欄位一個升序,一個降序。
因為MySQL沒有實現降序的索引,所以在初始化MV的時候,需要整理資料。
假設原來的優先順序為priority欄位,則在插入MV的時候,需要插入(0-priority)
這樣優先順序和點選率就都可以使用降序了。
2.初始化MV的資料需要30s
先truncate,然後初始化資料。問題是初始化資料需要30s。
在這30s內,使用者訪問不到任何的資料。
業務人員也要求最好每個小時重新整理一次。
難道每小時都要給使用者看30s的白板嗎?
後來採用的方案
初始化的資料寫入mv_test_pre表(新建一個"準備"表)
初始化完成之後,rename表。這個rename的過程不到1毫秒。
RENAME TABLE mv_test TO tmp_mv_test,
mv_test_pre TO mv_test,
tmp_mv_test TO mv_test_pre;
參考:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1242710/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 實現報表資料預先計算
- 效能最佳化之報表資料預先計算
- 畫像預先計算的一點設想.時間段分片
- MySQL 計算生日問題MySql
- 【mysql】mysql select中包括計算公式MySql公式
- 各類運算子和計算方法,優先順序
- MySQL如何計算統計redo log大小MySql
- MySQL-建立計算欄位MySql
- [MYSQL-10]計算欄位MySql
- Mysql中日期計算函式MySql函式
- 雲安全預警,雲端計算的預防措施和風險!
- 決策方法 | 計算預期價值
- 預測:雲端計算提升敏捷性敏捷
- css 選擇器優先順序的計算過程CSS
- 隱私計算FATE-離線預測
- 計算語言學之預備知識
- MySQL中Innodb如何計算索引的統計資訊?MySql索引
- Gartner:預計2016年IT預算平均將增長12%
- Gartner:90%的CFO預計會提高2024年AI預算AI
- 【Mysql】MySQL · 答疑解惑 · MySQL 最佳化器 range 的代價計算MySql
- MySQL:Innodb表 Data free 的計算概要MySql
- MySQL記憶體佔用計算公式MySql記憶體公式
- 【MySQL】利用binlog完成實時計算MySql
- 簡單聊聊Golang中defer預計算引數Golang
- 使用預計算分割槽優化引數化優化
- 累計預扣法個稅,怎麼算?(附excel)Excel
- HEVC幀內預測學習(二) 35種預測模式的計算模式
- 東數西算,網路為先
- 函式計算支援 MySQL 例項繫結函式MySql
- mysql查詢中時間、日期加減計算MySql
- MySQL中關於Qustions計算的改變MySql
- 得“量化”者得天下:要致富先學好數學和計算機計算機
- 到底應該先操作快取還是先運算元據庫?快取
- 計算機視覺 の1. 影像預處理計算機視覺
- 簡單探討Golang中defer預計算引數Golang
- 2015年雲端計算趨勢預測
- 2015年雲端計算三大預測
- 專案管理過程之計劃和預算(1) (轉)專案管理