资讯专栏INFORMATION COLUMN

关于mongodb中选择性低的字段排序问题

Alliot / 2560人阅读

摘要:一般我们都知道不给选择性低的字段添加索引,因为这个不能提高效率。即选择性高的字段选择性低的字段方案一添加组合索引此图索引为从图上看出,还是索引没有起作用,这是因为组合索引中,用右边的字段索引,索引不起作用。

今天在开发公司评论系统的新需求时,碰到一个关于mongo sort排序的问题

条件:
1. 评论表comment中包含两个字段 ctime(添加时间),like(点赞的人数)
2. comment表中的数据为1000万+
3. 无索引(没有给ctime,like添加任何索引)
4. php查询mongo的超时时间设置的是1s

查询:

db.comment.find().skip(0).limit(*).sort({"ctime":-1})
//按照ctime排序
没有报错,查询时间不到1s

db.comment.find().skip(0).limit(*).sort({"like":-1})
//按照like排序
报错:超时,发现查询时间为2s到3s


此图为无索引

为什么会出现这个问题呢?当时很困惑,ctime与like的级别是一样的,都没有加索引且都是int型数据,为什么一个查询不到1s,一个要2s+?

突然一道金光射入我的脑子我一下就明白了!!
因为如果按ctime排序的话,这个数组就为有序数组,如果按like排序的话,这个数组就为无序数组无序数组排序比有序排序的时间复杂度要大

note:一条记录在添加时ctime是递增的,而like是离散的数字
问题现在搞清楚了,现在怎么解决呢?

怎样才能让db.comment.find().skip(0).limit(*).sort({"like":-1})的查询效率变高?

在不影响业务的情况下,我选择了给like添加索引,但如何添加索引是个问题了。一般我们都知道不给选择性低的字段添加索引,因为这个不能提高效率。那该如何做呢?

答案:就是添加组合索引

策略是创建组合索引包括这个低选择性的字段。(即:选择性高的字段+选择性低的字段)

方案一

db.comment.ensureIndex({"ctime":1,"like":-1})
//添加组合索引
db.comment.find().skip(0).limit(*).sort({"like":-1})


此图索引为{"ctime":1,"like":-1}
从图上看出,还是索引没有起作用,这是因为组合索引中,用右边的字段索引,索引不起作用。

方案二

db.comment.ensureIndex({"like":-1,"ctime":1})
//添加组合索引
db.comment.find().skip(0).limit(*).sort({"like":-1})


此图索引为{"like":-1,"ctime":1}
发现效率明显提高了很多

了解组合索引的优化原理请读:10gen工程师谈MongoDB组合索引的优化

关于mysql数据库索引 http://www.uml.org.cn/sjjm/201107145.asp

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/18739.html

相关文章

  • MongoDB指南---11、使用复合索引、$操作符如何使用索引、索引对象和数组、索引基数

    摘要:操作符如何使用索引有一些查询完全无法使用索引,也有一些查询能够比其他查询更高效地使用索引。有时能够使用索引,但是通常它并不知道要如何使用索引。索引对象和数组允许深入文档内部,对嵌套字段和数组建立索引。 上一篇文章:MongoDB指南---10、索引、复合索引 简介下一篇文章:MongoDB指南---12、使用explain()和hint()、何时不应该使用索引 1、使用复合索引 在多...

    saucxs 评论0 收藏0
  • MongoDB指南---11、使用复合索引、$操作符如何使用索引、索引对象和数组、索引基数

    摘要:操作符如何使用索引有一些查询完全无法使用索引,也有一些查询能够比其他查询更高效地使用索引。有时能够使用索引,但是通常它并不知道要如何使用索引。索引对象和数组允许深入文档内部,对嵌套字段和数组建立索引。 上一篇文章:MongoDB指南---10、索引、复合索引 简介下一篇文章:MongoDB指南---12、使用explain()和hint()、何时不应该使用索引 1、使用复合索引 在多...

    tomlingtm 评论0 收藏0
  • mysql - 收藏集 - 掘金

    摘要:步优化以及其它数据库后端掘金原文链接在发表了一篇简洁有效有趣和令人信服的分钟教程描述了如何进行优化。关于的七种后端掘金对于的,在学习起来可能是比较乱的。 5 步优化 MongoDB 以及其它数据库 - 后端 - 掘金原文链接 Jared Rosoff 在 Scale Out Camp 发表了一篇简洁、有效、有趣和令人信服的《8 分钟 MongoDB 教程》描述了如何进行 MongoDB...

    Donald 评论0 收藏0
  • mongodb索引

    摘要:指定为创建唯一索引。默认值为索引的名称。在建立唯一索引时是否删除重复记录指定创建唯一索引。索引权重值,数值在到之间,表示该索引相对于其他索引字段的得分权重。对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。 这种扫描全集合的查询效率是非常低的,特别在...

    30e8336b8229 评论0 收藏0

发表评论

0条评论

Alliot

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<