我有一些大型数据库,超过1亿条记录。它们包括以下内容:
我现在在mysql isam表中有它们。我的想法是,嘿,我只是在数据上建立一个覆盖索引,它应该合理地快速推出。查询的形式是......
select valstr,account
from datatable
where account in (12349809, 987987223,...[etc])
order by orderPriority;
在某些测试中这似乎没问题,但在我们较新的安装中,它非常慢。没有索引似乎更快,这似乎很奇怪。
无论如何,我在想,也许是一个不同的数据库?我们将数据仓库数据库用于系统的其他部分,但它不适合文本中的任何部分。任何免费或相当便宜的数据库都是一种选择,只要它们具有相当有用的API访问权限。 SQL可选。
提前致谢。
-Kevin
答案 0 :(得分:2)
CouchDB和MongoDB以及Riak都很擅长相对快速地找到密钥(帐户)。
您将遇到的问题(有任何解决方案)与“order by”和“account in”子句相关联。
问题#1:帐户
120M记录可能意味着数十亿字节的数据。你可能有一个演出索引。这是一个问题的原因是你的“in”子句可以很容易地跨越整个索引。如果您搜索帐户“0000001”和“9999581”,您可能需要加载大量索引。
所以只是为了找到你的数据库首先要加载的记录,可能需要一大堆内存。然后实际加载您必须再次返回磁盘的数据。如果in子句中的“帐户”不是“靠近”,那么您将多次返回以获取各种块。在某些时候,只需执行表扫描然后加载索引和表就可以更快。
然后你会遇到问题#2 ......
问题#2:按订单排序
如果您从“in”子句中返回了大量数据,那么order by只是另一层缓慢。使用“order by”服务器无法传输数据。相反,它必须加载内存中的所有记录,然后对它们进行排序,然后流式传输。
<强>解决方案:强>
我是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://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,但是有一个相当大的学习曲线。