具有简单密钥访问的大型表的良好数据库

时间:2010-10-12 18:13:19

标签: mysql sql mongodb database nosql

我有一些大型数据库,超过1亿条记录。它们包括以下内容:

  1. 一把独特的钥匙。
  2. 整数值,不是唯一的,但用于对查询进行排序。
  3. VARCHAR(200)。
  4. 我现在在mysql isam表中有它们。我的想法是,嘿,我只是在数据上建立一个覆盖索引,它应该合理地快速推出。查询的形式是......

    select valstr,account 
        from datatable 
        where account in (12349809, 987987223,...[etc]) 
        order by orderPriority;
    

    在某些测试中这似乎没问题,但在我们较新的安装中,它非常慢。没有索引似乎更快,这似乎很奇怪。

    无论如何,我在想,也许是一个不同的数据库?我们将数据仓库数据库用于系统的其他部分,但它不适合文本中的任何部分。任何免费或相当便宜的数据库都是一种选择,只要它们具有相当有用的API访问权限。 SQL可选。

    提前致谢。

    -Kevin

3 个答案:

答案 0 :(得分:2)

CouchDB和MongoDB以及Riak都很擅长相对快速地找到密钥(帐户)。

您将遇到的问题(有任何解决方案)与“order by”和“account in”子句相关联。

问题#1:帐户

120M记录可能意味着数十亿字节的数据。你可能有一个演出索引。这是一个问题的原因是你的“in”子句可以很容易地跨越整个索引。如果您搜索帐户“0000001”和“9999581”,您可能需要加载大量索引。

所以只是为了找到你的数据库首先要加载的记录,可能需要一大堆内存。然后实际加载您必须再次返回磁盘的数据。如果in子句中的“帐户”不是“靠近”,那么您将多次返回以获取各种块。在某些时候,只需执行表扫描然后加载索引和表就可以更快。

然后你会遇到问题#2 ......

问题#2:按订单排序

如果您从“in”子句中返回了大量数据,那么order by只是另一层缓慢。使用“order by”服务器无法传输数据。相反,它必须加载内存中的所有记录,然后对它们进行排序,然后流式传输。

<强>解决方案:

  1. 有很多内存。如果RAM无法满足整个索引,则负载将会很慢。
  2. 尝试限制“in”项目的数量。即使这个子句中的20或30个项目也可以使查询真的慢。
  3. 尝试使用键值数据库?
  4. 我是K / V数据库的忠实粉丝,但你必须看看#1点。如果你没有大量的RAM并且你有大量的数据,那么无论你使用什么数据库,系统都会运行得很慢。如果您希望在这些场景中获得良好的性能(大数据集中的小型查找),那么RAM / DB大小比率非常重要。

答案 1 :(得分:1)

这是一个使用innodb引擎的MySQL数据库的一个合理大小的例子,该引擎利用表格上的聚簇索引。 1.25亿行,查询运行时间为0.021秒,这似乎相当合理。

Rewriting mysql select to reduce time and writing tmp to disk

http://pastie.org/1105206

其他有用的链接:

http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html

http://dev.mysql.com/doc/refman/5.0/en/innodb-adaptive-hash.html

希望它被证明是有意义的。

答案 2 :(得分:0)

CouchDB将按键为您提供存储,您可以创建视图来执行查询/排序。第二种选择可能是cassandra,但是有一个相当大的学习曲线。