代码之家  ›  专栏  ›  技术社区  ›  Niklas B

云数据存储避免在非常简单的表上爆炸索引

  •  1
  • Niklas B  · 技术社区  · 8 年前

    我正在尝试使用谷歌云数据存储来存储METAR观测(机场天气观测),但我正在经历我认为指数爆炸的情况。我的索引 station_id (4个字符的字符串)比实际数据本身大20倍。数据库每天将增加大约25万个实体,因此索引大小将成为一个问题。

     - observation_time (Date / Time) - indexed
     - raw_text (String) (which is ~200 characters) - unindexed
     - station_id (String) (which is always 4 characters) - indexed
    

    综合指数:

      - station_id (ASC), observation_time (ASC)
    

    查询

    我唯一会问的问题 曾经 运行是:

    query.add_filter('station_id', '=', station_icao)
    query.add_filter('observation_time', '>=', before)
    query.add_filter('observation_time', '<=', after)
    

    哪里 before after 是datetime值

    索引大小

    name               type         count         size      index size
    observation_time   Date/Time    1,096,184     26.14MB   313.62MB    
    station_id         String       1,096,184     16.73MB   294.8MB 
    

    数据存储报告:

    Resource           Count        Size
    Entities           1,096,184    244.62MB
    Built-in-indexes   5,488,986    740.63MB
    Composite indexes  1,096,184    137.99MB
    

    帮助

    我想我的第一个问题是:我错过了什么?我想我正在做一些未优化的事情,但我不知道是什么。只要查找时间保持在~2s以下,查询时间就不是一个直接的问题。

    我可以简单地删除内置索引吗?组合会继续工作吗?

    我读过谷歌和StackOverflow的文章,但似乎无法理解这一点。我之所以不尝试删除所有内置索引,是因为在下载/取消索引/放置所有数据之后,我需要花费相当长的时间来更新仪表板摘要,也就是说,我需要几天时间才能得到结果。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Dan McGrath    8 年前

    您可以看到存储大小是如何根据 our documentation here ,因此可以将其应用到示例中,以查看大小的总和。

    TL公司;博士: 您可以通过使用稍微更简洁(但仍可读!)的方式来节省空间属性名称。例如 observation_time observation

    • 要使用复合索引,需要对各个属性进行索引,因此不要删除内置的,否则它将停止工作
    • 内置程序被索引两次-一次用于升序,一次用于降序
    • 种类名称和属性名称是索引中为每个实体使用的字符串,因此它们越长索引就越大