试想,你的应用程序运行将进行这些查询:
collection.find({"x" : criteria, "y" : criteria, "z" : criteria}) collection.find({"z" : criteria, "y" : criteria, "w" : criteria}) collection.find({"y" : criteria, "w" : criteria})
正如你看到的,y在每个查询中都会出现,所以这个个非常好的索引候选者,z出现在第一次和第二次,w出现在第二次和第三次,所以任何其中的一个都可以作为索引的候选者.
我们要尽可能多的频繁的命中索引.如果上面的某个查询比其它的更重要或者说使用频率更高,我们索引应该尽量偏袒于它.比如说,试想第一个查询运行查过其它两个1000多次.我们应该这么建立索引:
collection.ensureIndex({"y" : 1, "z" : 1, "x" : 1})这个查询将会尽可能的最大优化,其它两个查询将会使用部分索引进行查询.
如果三个查询运行次数相近,一个好的混合索引应该是
collection.ensureIndex({"y" : 1, "w" : 1, "z" : 1})
这样三个查询就会使用y作为标准索引,第二个和第三个能够使用w作为索引,中间那个查询将会全部命中索引.
你可以调用explain()来查看索引怎么在查询中使用的
collection.find(criteria).explain()
(译者续: 有关Compound index可以参看官网 http://www.mongodb.org/display/DOCS/Indexes#Indexes-CompoundKeysIndexes )
原版书<<50 Tips and Tricks for MongoDB Developers>> 地址:http://oreilly.com/catalog/0636920019893
皮皮书屋下载地址:http://www.ppurl.com/2011/05/50-tips-and-tricks-for-mongodb-developers.html
本书的所有翻译地址:http://blog.csdn.net/crazyjixiang/article/category/858638
翻译目的:MongoDB资料国内很少,书就更不必说了,借助对MongoDB的理解为大家做点贡献,如果有翻译有误的地方请指正,不能误入子弟,谢谢!
译者:Crazybaby