在大容量数据集上表现不佳
Poor performance on high volume data sets
我在 class 具有高记录数的查询上表现不佳。我是 运行 一些非常直接的查询,但性能不可用。我真的很喜欢 orientdb,这是我第 5 个以 odb 作为后端的开发项目。但是,这个特定项目迫使我寻找替代方案。
详细说明请见下文
我们有一个 Parent
class 增长不大,整个数据集大约有 900 条记录。
但是,Child
class 在 15 分钟内以 10 万条记录的速度增长。它每天生成数百万条记录。
记录作为父项的 update/add 插入子项 class。
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"
}
子记录插入
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"
以下查询性能不佳
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
补充信息。
在 Child class 中,我们有大约 900 万条记录 WHERE MarketName = "USD-CNY"
执行此查询大约需要 33 - 40 秒。
我没有对父项或子项进行任何索引 class,需要一些有关多模型数据库正确索引技术的指导。
此外,我并不期待900万条记录的响应。我可以对我的结果进行分页并获得前 100 名。
感谢任何指导。
与任何其他 DBMS 一样,OrientDB 需要您用作过滤器的 属性 上的索引。尝试执行此操作:
CREATE INDEX Child.MarketName ON Chile( market name ) UNIQUE
您会看到您的查询现在应该 <300 毫秒。
有关详细信息,请查看 https://orientdb.com/docs/2.2/SQL-Create-Index.html。
我会试试这个:
CREATE INDEX Child_Market_Time_idx ON Child (Marketname, TimeStamp) UNIQUE;
我在 class 具有高记录数的查询上表现不佳。我是 运行 一些非常直接的查询,但性能不可用。我真的很喜欢 orientdb,这是我第 5 个以 odb 作为后端的开发项目。但是,这个特定项目迫使我寻找替代方案。
详细说明请见下文
我们有一个 Parent
class 增长不大,整个数据集大约有 900 条记录。
但是,Child
class 在 15 分钟内以 10 万条记录的速度增长。它每天生成数百万条记录。
记录作为父项的 update/add 插入子项 class。
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"
}
子记录插入
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"
以下查询性能不佳
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
补充信息。
在 Child class 中,我们有大约 900 万条记录 WHERE MarketName = "USD-CNY"
执行此查询大约需要 33 - 40 秒。
我没有对父项或子项进行任何索引 class,需要一些有关多模型数据库正确索引技术的指导。
此外,我并不期待900万条记录的响应。我可以对我的结果进行分页并获得前 100 名。
感谢任何指导。
与任何其他 DBMS 一样,OrientDB 需要您用作过滤器的 属性 上的索引。尝试执行此操作:
CREATE INDEX Child.MarketName ON Chile( market name ) UNIQUE
您会看到您的查询现在应该 <300 毫秒。
有关详细信息,请查看 https://orientdb.com/docs/2.2/SQL-Create-Index.html。
我会试试这个: CREATE INDEX Child_Market_Time_idx ON Child (Marketname, TimeStamp) UNIQUE;