Onlyruiwen 2010-08-18
MongoDB支持索引,一个集合上可以创建唯一、非唯一索引,可以建立几个索引。可以将多列组合起来做成复合索引。通过索引检索数据性能很好,如果没有索引进行检索,会导致全集合的扫描,性能很差。即使他是内存数据库。
由于我最近的项目上需要子对象集合,需要对其进行检索为此针对此进行了一次验证。这里将验证的结果共享给大家。
集合样例:
{gid:"sadfasdfadsfasdf",gList:[{gtag:"asdfasdf"},{gtag:"yyjsdhfg"},{gtag:"dfsdf8899"},gtype:"abc"}
其中gid是全局唯一的,gtype总共只有7个值。gList里面的子集合(子对象)的个数是随机的,个数范围在3到200之间。其中只有5000条数据有gtag,其他数据没有gtag。
分别有三个应用,第一个应用需要按照gid检索数据,第二个应用需要通过gtag检索数据,第三个应用通过gtype检索数据。
为了获得性能,需要做一个测试。为了得到的数据接近实际情况,我将生产系统的数据拿来做测试。考虑到32位mongodb处理的数据条目可字节数的限制,灌入120万条数据,再多的数据会导致mongodb无法简历索引,mongoDB不可用。
为了测试其性能,首先进行一次全集合的遍历,将所有的数据读入内存。测试情况如下:
1、分别就gid、gtag、gtype建立索引,进行检索。每个业务执行10万次。返回结果集中第一条数据。
得到结果:
检索gid业务消耗时间平均为0.6毫秒,检索gtype业务消耗时间平均为1.3毫秒,检索gTag业务消耗时间为7毫秒
2、返回列对性能的影响
返回的列数、列的复杂度、以及每行的字节数会影响到性能。越复杂的列、列数越多、返回的字节数越多,消耗时间越多。
由于时间关系,没有进行分页业务的性能的测试。