高容量数据集的性能不佳

时间:2017-07-19 17:33:21

标签: orientdb orientdb2.2

我对具有高记录数的类的查询性能很差。我正在运行一些非常简单的查询,但性能无法使用。我非常喜欢orientdb,这是我的第五个开发项目,其中odb作为后端。但是,这个特殊的项目迫使我寻找替代方案。

请参阅下面的详细说明。

我们有一个Parent类没有增长太多,整个数据集大约有900条记录。

然而,Child类在15分钟内以10万条记录的速度增长。它每天都会产生数百万条记录。

将记录作为父级的更新/添加插入子类。

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类中,我们有大约900万条记录WHERE MarketName = "USD-CNY"

执行此查询大约需要33到40秒。

我没有对父类或子类进行任何索引,需要一些关于多模型数据库的正确索引技术的指导。

此外,我不期待900万条记录的回应。我可以将结果分页并获得前100名。

感谢任何指导。

2 个答案:

答案 0 :(得分:0)

与任何其他DBMS一样,OrientDB需要在您用作过滤器的属性上使用索引。尝试执行此操作:

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

您将看到您的查询现在应该<300毫秒。

有关详细信息,请查看https://orientdb.com/docs/2.2/SQL-Create-Index.html

答案 1 :(得分:0)

我试试这个: CREATE INDEX Child_Market_Time_idx ON Child(Marketname,TimeStamp)UNIQUE;