Mongo or 查询怎么走索引 ?
最近在开发的过程的遇到了一问题,客户导数据时超时,关键这块代码添加的需求,还是我。 果断锅扔到我这边。可是我也一头雾水啊,我也是抄袭别的代码呢。 经过一顿在测试环境添加日志,搞清楚什么问题:原来是针对这类特殊的业务,会多查一次表,这个多一次查表单次耗时0.9s,本来的所有业务一次必须查表是0.1s。这还是开发环境数据量比较少。怪不得线上导出几百条数据就超时。
为什么这个表查询这么慢?这条语句类似以下:
db.mycolletion.find({"$or":[{"x_id:"xxxxx"},{"y_id": "***"}]})
如此简单 首先去线上查看这表这个表也就10来个字段,通过
db.mycollection.getIndexes()
查询到这个表就两个索引一个_id和y_id,表中数据x_id和y_id至少有一个。 使用mongo查询计划如下截图
db.mycolletion.find({"$or":[{"x_id:"xxxxx"},{"y_id": "***"}]}).explain("executionStats")
如下截图
发现竟然没走索引,进行了全表扫描。 好好好,这么玩是吧,难道要加混合索引?在开发环境添加混合索引,发现依然全表扫描。 经过一番查询才知道这种$or查询是不会走索引,也就是索引失效了。
参考连接:
www.mongodb.com/docs/manual…
要想走索引必须两个都是索引,查询才会走索引。 在开发环境给x_id添加索引。 经过查询,可以发现这下查询走了索引,查询耗时大幅度减少。
至此测试环境验证完毕,接下来就去生产环境添加索引。