2016-05-11 62 views
0

我在本地存儲的MySQL數據庫上使用了一個巨大的數據集(> 10M記錄*〜16k)。SQL/C# - 多階段查詢,海量數據集

用戶將按字段A/B/C過濾,返回1到200k個記錄。此查詢需要長達一分鐘

有了這組數據,我想用SQL進一步分析;即根據UI中的設置動態地改變另一組字段,例如D/E/F,僅在較小的數據集上運行這些進一步的查詢。

我的問題是 - 在概念上 - 在C#/ MySQL中最好如何處理這個問題;

我可以保留MySQL服務器上的原始查詢「打開」,並動態調整以適應? 我是否需要將原始查詢中的整個數據集存入內存,然後在C#中進一步對其進行過濾? 我應該將相關數據複製到臨時表中,並在該表上執行查詢嗎?

+0

10m行,16k - 你住在1990?在2016年,這並不像任何體面的工作站有足夠的空間將其加載到內存中一樣合格。 – TomTom

+0

非常抱歉。也許你比我有更多的經驗。我累積了大約四個小時。 – DanB

回答

0

我可以保持原有查詢「開放」 MySQL服務器上,並動態調整 ,要適應?

對於任何SQL服務器變體的SQL初學者教程都會告訴你,這不是SQL如何工作並且自發明以來一直工作的原因。執行的查詢被執行 - 需要不同的結果,再次詢問。

我是否需要將原始查詢的整個數據集放入內存中,然後使用C#進一步過濾它?

不,我會說在99%的案例中加載所有過濾都是愚蠢的。是的,我的意思是。數據庫用於過濾。在大多數情況下,這意味着您不僅要在客戶端使用更多的內存,還必須通過較慢的網絡連接來提取數據(是的,即使是與本地內存相比,10千兆比較慢),只是爲了丟掉那些東西。除了有很多本地過濾的數據集外,最好是動態地(作爲用戶類型),這是沒有意義的。如「所有國家的名單」的限制 - 足夠我不關心網絡速度等。你變大的那一刻,扔掉的價格太高了。

我應該將相關數據複製到臨時表中,並在 上執行關於該表的查詢嗎?

爲什麼你甚至認爲完整的副本+過濾比過濾更快而沒有先寫入整個數據到另一個表?最重要的是,你有和以前一樣的問題 - 你需要做很多工作才能把它扔掉。最重要的是,除非你運行快速SSD的Raid 0,否則你會在臨時表中出現非常慢的媒介。

說真的,抓一本初學者書。 3個假設,當你知道一些基本知識的時候,所有的假設都是顯而易見的。

+0

感謝您在這裏輸入TomTom,這很有幫助。爲白癡道歉。不幸的是,不是每個業餘愛好者都有時間閱讀一本500頁的SQL書,這是你正確指出的2016年。 – DanB