在大容量数据集上表现不佳

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;