问题描述
有没有人使用过leveldb?我是在nodejs环境下使用的https://www.npmjs.com/package...
网上搜了资料,感觉还是挺少。更不用说用的人了。不过没有关系,即使没用过,我下面的问题也可以看看。
我现在面临的问题就是。测试数据一百万左右。如果单独根据key查找,那是非常快速的。
但是我现在需要完成类似于这样的功能
where name=’a’ order by dateline desc limit 100,50
无论怎样,你都必须得从数据库里面读取完所有的记录,然后再进行排序,然后再截取对应的数据段。
然而,光遍历读取所有的记录,100万条数据,花了4分钟,这个速度明显不能用于实际生产了。
我不明白mysql这种100万条数据,实现上面的sql应该是不到1秒的时间吧?他们到底怎么弄的。有什么思路吗?
问题解答
回答1:我觉得题主理解错了数据库的工作方式。数据库经常采用一种平衡树的数据结构进行组织数据,而不是单纯存储一个数组用的时候对这个数组进行排序,从data中找到按照dateline的desc顺序的100到150(这个限制我可能理解有误),并不是将所有的数据都读一遍,而是从对平衡树进行查找,找到最左下面的大小为150的子树,然后从这个子树的右子树找name = ’a’的节点,然后取出该节点的数据。这是数据库简单的原理,实际上数据库会将部分数据放在外部存储设备,然后在内存中建立这个外部存储区域的一条索引,如果进行查找时找的的是这个索引,那就会将外部存储设备上的这块数据读到内存中,建立一个平衡树,在这个平衡树上进行查找。这是数据库的一种组织数据的实现。
mysql中这条查询语句执行时间很短,但如果是获取所有的数据,也是会花费很长时间的。
最后,我还是不明白题主实现的功能,不明白的地方在于:1,数据是从数据库中读取的,还是只是在文件中存储着;2,如果遍历所有的数据是必须的,比如:必须显示出所有数据或者必须将所有数据存到其他的某个文件中,那实际上限制速度的瓶颈是编程语言,操作系统等等。