緩存遇到的數據過濾與分頁問題

来源:http://www.cnblogs.com/5207/archive/2017/01/18/6297020.html
-Advertisement-
Play Games

遇到的問題 1、最初階段 系統中做了一個監控功能,用於記錄所有的請求數據,數據插入頻繁,量非常大,比如一天1000萬條。考慮到數據插入的效率,就使用記憶體KV緩存來保存。寫入過程是在接收到請求後放入到線程池中,然後線程池非同步處理後寫入。到這問題基本上沒什麼事情。 2、新的需求 後面數據保存了,就需要在 ...


遇到的問題

1、最初階段

系統中做了一個監控功能,用於記錄所有的請求數據,數據插入頻繁,量非常大,比如一天1000萬條。考慮到數據插入的效率,就使用記憶體KV緩存來保存。寫入過程是在接收到請求後放入到線程池中,然後線程池非同步處理後寫入。到這問題基本上沒什麼事情。

2、新的需求

後面數據保存了,就需要在運維繫統中可以查詢到,所以這個緩存還必須是分散式的。於是就換成了redis,這樣系統都可以連接到。但是數據量太大,需要分頁查詢,這就有點頭痛了。還好redis是可以支持有序集合的,而且可以通過zrange來獲取指定範圍數據。

3、增加了需求

這些數據要在運維界面里還要可以按條件過濾,這個就非常頭疼啦,redis沒有條件過濾啊。即使過濾出來了數據要顯示在界面上必須分頁。

問題思考

最終突然發現如果存在資料庫里是不是很好解決?但是存在資料庫里就會有大量寫操作的問題,而且數據這麼大,像Mysql單表很容易就破了。所以我想著是不是還是在nosql的基礎上解決。

這裡就有幾個問題:大數據量的排序、查找過濾、分頁。

先不管這麼多,如果使用Mysql的話,除了大表保存問題,查找、過濾、分頁功能都是直接使用sql實現的,開發起來簡單。

mysql

如果使用mysql存儲後,如果要查一些數據怎麼整?先看下麵的這段代碼:

SELECT t.* 
    from ofOffline1 t 
    ORDER BY t.creationDate desc
  LIMIT 1300000,100

這裡最直接的就體現了兩點:先排序,然後取分頁的數據。好了,這裡有幾個問題:

1、使用了*返回欄位,全欄位返回的問題就是要掃描全表
2、進行了ORDERBY排序,我測試的這個表只有幾百萬數據
3、最後分頁是取的130萬開始的100條,等於是要掃描130萬後才開始

我隨便跑了一下執行了:5.5秒左右。有沒有辦法讓它快一點呢?確實有,網上找找挺多的。

首先,看看只返回部分欄位是不是快一些?

SELECT t.creationDate 
    from ofOffline1 t 
    ORDER BY t.creationDate desc
  LIMIT 1300000,100

上面的SQL語句,改造後,只返回一個欄位,再執行。2.9秒了。

那麼取1條數據的速度會不會快一些呢?

SELECT t.creationDate 
    from ofOffline1 t 
    ORDER BY t.creationDate desc
  LIMIT 1300000,1

執行上面的sql後發現時間還是2.9秒,這說明取1條的數據也是這麼慢,那慢的肯定就是排序啦。

然後使用這一條取出來的數據作為條件,直接在集合中定位到分頁數據

SELECT ofOffline1.* FROM ofOffline1 WHERE ofOffline1.creationDate <(
SELECT t.creationDate 
    from ofOffline1 t 
    ORDER BY t.creationDate desc
  LIMIT 1300000,1
) 
ORDER BY ofOffline1.creationDate desc
LIMIT 100

這是網上查到的SQL,思路就是先使用子查詢定位到第130萬條記錄,然後從它開始取後面的99條。時間差不多3.9秒左右。這說明這樣的優化還是有效的。

使用一下索引
我想了想如果加個索引是不是可以提升性能呢?SQL中只使用了creationDate排序和過濾,那麼就用它建個索引試試吧。

還是測試一下最簡單的那條SQL

SELECT t.* 
    from ofOffline1 t 
    ORDER BY t.creationDate desc
  LIMIT 1300000,100

結果是:5.5秒左右,沒變化

那麼看看前面有子查詢的情況:

SELECT ofOffline1.* FROM ofOffline1 WHERE ofOffline1.creationDate <(
SELECT t.creationDate 
    from ofOffline1 t 
    ORDER BY t.creationDate desc
  LIMIT 1300000,1
) 
ORDER BY ofOffline1.creationDate desc
LIMIT 100

不錯,執行結果:0.599秒。

好吧,本文先到這,後面再學習一下mangodb,按理它會比較適合我們的場景。



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 介紹 經常會有人問profile工具該怎麼使用?有沒有方法獲取性能差的sql的問題。自從轉mysql我自己也差不多2年沒有使用profile,忽然profile變得有點生疏不得不重新熟悉一下。這篇文章主要對profile工具做一個詳細的介紹;包括工具的用途和使用方法等。profile是SQLServ ...
  • 今天公司編輯部有一妹紙,遇到問題,是需要處理資料庫中重覆的數據,於是想辦法幫忙解決,要求刪除重覆的數據,該表中只有一個欄位,假設為保存的公司名,這是經過多重過濾之後,最終留下的的數據,需要進行篩選,然後重覆的數據只保留一條,最上邊或最下邊的都可以,有且僅有一條,整張表的數據量大概在20W左右,重覆量 ...
  • ###11數據表中的數據類型 * A:MySQL中的我們常使用的數據類型如下 詳細的數據類型如下(不建議詳細閱讀!) 分類 類型名稱 說明 整數類型 tinyInt 很小的整數 smallint 小的整數 mediumint 中等大小的整數 int(integer) 普通大小的整數 小數類型 flo ...
  • 記得在自己學習資料庫知識的時候特別喜歡看案例,因為優化的手段是容易掌握的,但是整體的優化思想是很難學會的。這也是為什麼自己特別喜歡看案例,今天也開始分享自己做的優化案例。 最近一直很忙,博客產出也少的可憐,今天整理了一下自己做過優化或各種方案的客戶已經超過100家了,今天分享的案例算是在這些客戶中比 ...
  • Apache Flink是一個面向分散式數據流處理和批量數據處理的開源計算平臺,它能夠基於同一個Flink運行時,提供支持流處理和批處理兩種類型應用的功能。 現有的開源計算方案,會把流處理和批處理作為兩種不同的應用類型,因為它們所提供的SLA(Service Level Aggreement)是完全 ...
  • 編輯 用戶: SYSTEM 1.1, 1.2, 2.1, 2.2, 3.1, 3.2, 4.1, 4.2, 5.1, 5.2, 6.1, 6.2, 7.1, 7.2, 8.1, ...
  • 執行計劃顯示SQL執行的開銷 工具→ SQL Server Profiler : SQL Server 分析器,監視系統調用的SQL Server查詢 Top查詢 -- Top Percent 選擇百分比 SELECT top 30 percent * FROM [SchoolDB].[dbo].[... ...
  • 前言 最近連續接觸了4個OA系統,均存在著不同的性能問題,本文記述對某移動OA系統的優化全過程,讓看官們對資料庫優化流程有一個瞭解,並揭開隱式轉換這無情殺手的神秘面紗。 本文使用的工具:SQL專家雲平臺專業體檢工具 :www.zhuancloud.com 系統情況 硬體配置 軟體情況 資料庫情況 系 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...