2017-07-19 32 views
0

我在具有高記錄數的類的查詢上表現不佳。我正在運行一些非常簡單的查詢,但性能無法使用。我真的很喜歡orientdb,這是我第五個將odb作爲後端的開發項目。但是,這個特定的項目迫使我尋找替代品。大容量數據集的性能不佳

請參閱下面的詳細說明。

我們有一個Parent類,它增長不多,整個數據集大約有900條記錄。

但是,Child班級在15分鐘內以100k的速度增長。它每天生成數百萬條記錄。

記錄作爲父項的更新/添加插入到子類中。

create class Parent extends V create class Child

父數據模型

{ 
     "id": string, 
     "name": string, 
     "rank": integer, 
     "price_usd": float, 
     "price_cny": float, 
     "volume_24h_usd": float 
     "market_cap_usd": float, 
     "available_supply": integer, 
     "total_supply": integer, 
     "last_updated": datetime, 
     "MarketName": string, 
     "Exchange": string, 
     "last_refresh": datetime 
    } 

兒童的數據模型

{ 
     "MarketName": string, 
     "High": float, 
     "Low": float, 
     "Volume": float, 
     "Last": float, 
     "Bid": float, 
     "Ask": float, 
     "BaseVolume": float, 
     "TimeStamp": datetime 
    } 

父數據採樣

{ 
     "@type": "d", 
     "@rid": "#506:403225", 
     "@version": 1, 
     "@class": "Parent", 
     "MarketName": "USD-CNY", 
     "High": 0.00026815, 
     "Low": 0.00023002, 
     "Volume": 17005.93615271, 
     "Last": 0.00026103, 
     "Bid": 0.00026104, 
     "Ask": 0.000265, 
     "BaseVolume": 4.15293493, 
     "TimeStamp": "2017-07-15T18:28:11.857", 
     "@fieldTypes": "High=d,Low=d,Volume=d,Last=d,Bid=d,Ask=d,BaseVolume=d" 
    } 

子記錄上插入下面的查詢

select 
     MarketName, 
     Last, 
     Bid, 
     Ask, 
     High, 
     Low, 
     BaseVolume, 
     TimeStamp, 
     TimeStamp.asDateTime().format('yyyy-MM-dd') as date, 
     TimeStamp.asDateTime().format('hh:mm:ss') as time, 
     if(eval('TimeStamp.asDateTime().format("hh") between 0 and 11'),'PM','AM') as hour12 
    from Child where MarketName = "USD-CNY" order by TimeStamp desc 

信息

Update Parent add Child = [ 
    { 
     "@type":"d", 
     "@class":"Child", 
     "MarketName":"USD-CNY", 
     "High":0.000083, 
     "Low":0.00006815, 
     "Volume":18688741.88795826, 
     "Last":0.00006857, 
     "Bid":0.00006857, 
     "Ask":0.00006889, 
     "BaseVolume":1412.08213181, 
     "TimeStamp":"2017-07-19T17:12:59.44" 
    } 
] where MarketName = "USD-CNY" 

性能差。

在子類中,我們有大約900萬條記錄WHERE MarketName = "USD-CNY"

此查詢的執行,需要大約33 - 40秒。

我還沒有對父類或子類做任何索引,需要一些關於多模數據庫正確索引技術的指導。

此外,我不期待900萬條記錄的迴應。我沒關係分頁我的結果,只獲得前100名。

任何指導表示讚賞。

回答

0

與其他DBMS一樣,OrientDB需要您用作過濾器的屬性的索引。嘗試執行此操作:

CREATE INDEX Child.MarketName ON Chile(market name) UNIQUE 

而且您現在將看到您的查詢應爲< 300ms。

欲瞭解更多信息,請看https://orientdb.com/docs/2.2/SQL-Create-Index.html

+0

嗨Lvca,我明白這一點。但是,與其他任何DBMS不同,OrientDB具有多種索引類型。我很困惑在什麼類型的場景中使用適當的索引。此外,由於MarketName不是唯一的,所以您建議的索引在兒童記錄上不可能實現...我們可以有1個父記錄,其中MarketName爲唯一的爲'ABC',但在子級別,我們可以有數百萬的ABC記錄。這就是問題出現的地方。 – OpsEngineer

+1

由於這個原因而不是UNIQUE,您可以使用NON_UNIQUE索引。如果你不做範圍查詢,比如''在'a'和'b'之間',我建議使用HASH索引。此外,如果Child連接到父級,並且在圖形數據庫中可以遍歷此關係,爲什麼不將父級名稱保留爲唯一索引,然後遍歷所有out('children')'來獲取它們? – Lvca

0

我想試試這個: CREATE INDEX Child_Market_Time_idx ON兒童(市場名稱,時間戳)UNIQUE;

+0

有幫助嗎?將孩子存儲爲獨立頂點並通過邊緣連接到父項如何? –

+0

當我的數據集低於500萬條記錄時,它有所幫助。但是,通過這個特定的項目,我面臨的挑戰比我通常所面臨的要多得多。我即將發佈另一個。 – OpsEngineer