我在具有高記錄數的類的查詢上表現不佳。我正在運行一些非常簡單的查詢,但性能無法使用。我真的很喜歡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名。
任何指導表示讚賞。
嗨Lvca,我明白這一點。但是,與其他任何DBMS不同,OrientDB具有多種索引類型。我很困惑在什麼類型的場景中使用適當的索引。此外,由於MarketName不是唯一的,所以您建議的索引在兒童記錄上不可能實現...我們可以有1個父記錄,其中MarketName爲唯一的爲'ABC',但在子級別,我們可以有數百萬的ABC記錄。這就是問題出現的地方。 – OpsEngineer
由於這個原因而不是UNIQUE,您可以使用NON_UNIQUE索引。如果你不做範圍查詢,比如''在'a'和'b'之間',我建議使用HASH索引。此外,如果Child連接到父級,並且在圖形數據庫中可以遍歷此關係,爲什麼不將父級名稱保留爲唯一索引,然後遍歷所有out('children')'來獲取它們? – Lvca