Rumah > Artikel > pangkalan data > MongoDB索引概念及使用详解
索引,使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构,例如 employee 表的姓名
索引,使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构,例如 employee 表的姓名(name)列。如果要按姓查找特定职员,与必须搜索表中的所有行相比,索引会帮助您更快地获得该信息。
------------------------------------------------------------------
MongoDB 的详细介绍:请点这里
MongoDB 的下载地址:请点这里
相关阅读:
MongoDB备份与恢复
CentOS编译安装MongoDB
CentOS 编译安装 MongoDB与mongoDB的php扩展
CentOS 6 使用 yum 安装MongoDB及服务器端配置
Ubuntu 13.04下安装MongoDB2.4.3
如何在MongoDB中建立新数据库和集合
MongoDB入门必读(概念与实战并重)
《MongoDB 权威指南》(MongoDB: The Definitive Guide)英文文字版[PDF]
------------------------------------------------------------------
索引的优点:
不需要做全表扫描,只需要扫描索引索引只存储了这个表的数据的一小部分,这小部分可以帮我们实现快速查询,因此扫描的时候只扫描这一小部分即可,如果将这小部分装载入内存中的话,速度会更快
·大大减少了服务器需要扫描的数据量
·索引可以帮助服务器避免排序或使用临时表
·索引可以将随机I/O转换为顺序I/O
索引的缺点:
索引是保存了数据表上的一小部分数据,那么这些数据是需要额外存储的,毫无疑问如果更新了表中的数据,那么响应的索引数据也要跟着更新,加速了查找操作,但是减少了写入速度对查找的加速是否有用还是有待评估的,比如我们将一个表中的按年龄实现了索引创建(在年龄上创建了索引)平时大多数操作都是按照名字上去查找的,那么索引则无任何作用,所谓索引必须跟查找建完全匹配才有意义,但我们要知道大多数的查找未必只在有限字段上执行,也就意味着创建索引必须包含多个段,需要看索引是如何去生成的,对于多个条件可以将索引做为组合索引来查找,所以索引的设计是非常有技巧的
索引本身带来的未必是优势,如果一张表中索引非常的多的话,可能对于整个系统性能的影响是非常大的,如果一张表的本身非常小只有十几行,创建索引反而会减慢速度的,因为全表扫描也未必用不了多长时间
但如果表非常大的话,索引则非常有用,如果数据量过大那么索引反而也未必有意义,,比如一张表非常大,上T的数据,可以想象一下创建什么样的索引才可以,所以只能将大表切割成小表,并且分布在不同的物理节点上,对mysql来说叫做分区;对mongodb来讲叫shaerd
索引级别:
索引最高级别3星索引
1星:索引国能将相关的记录放置在一起,大大降低了I/O
2星:索引中数据的存储顺序与查找标准中顺序一致(只要设计良好即可)
3星:如果索引中包含查询中所需要的全部数据(覆盖索引)
索引的类别:
·顺序索引
·散列索引
将索引映射至散列桶中,映射是通过散列函数进行的
评估索引标准:
1、访问类型(如果做等值比较 散列比较好,如果做范围查找,那么顺序比较好
2、访问时长(为完成一个访问,基于索引类型访问的时间可能不同)
3、插入时长(更新表的话索引本身可能会有很大代价,如果散列索引的话只不过重新执行以下算法即可,但是对于顺序索引的话,有可能会移动索引列表后面的索引数据)
4、删除时长
5、空间开销
索引类型:
·顺序索引:按照聚集索引存放的文件也被称为索引顺序文件,最常见的索引类型,一般来讲被索引文件记录,如果按照顺序存放则为索引顺序文件,否则为堆文件
·聚集索引:如果某记录文件中的记录顺序是按照对应的搜索码(键/key)的顺序排序的话,被称为主索引
·非聚集索引:搜索码中的指定的次序与记录中的记录次序不一致
根据索引中是否为每个记录响应的创建索引项:
·稠密索引 (每个搜索码值都有一个对应的索引项
·稀疏索引 (并不是每个记录都有索引项)
·多级索引 (索引指向索引,以此类推,最后的索引指向数据;
索引本身,主索引之外的索引被称为辅助索引,而只有主索引才能使用稀疏索引,其他所有必需是稠密索引,而辅助索引必须是稠密索引
·B+树索引:
·Balance Tree 平衡树索引
·每个叶子节点,从叶子至根的距离是相同的,所以叫做平衡树
·层次需要根据数据量来动态创建层次
·B+树是一种顺序索引
散列索引则:
通过散列函数,数据库加载为一次I/O 指针加载数据为2次 I/O。
I/O是占据时间比例是最大值的,索引散列索引的速度在做精确匹配的时候会更快,因为I/O次数要少的多的多,因此散列索引能够让我们避免访问索引结构的。
散列索引的缺点:散列索引还有可能造成偏斜,长久以来可能发有的散列桶有的满有的空 导致每个节点的负载参差不齐,如果散列函数做的不够随机就有可能造成偏斜的情况
所以散列函数需要做到以下几点:
·分布式随机
·分布式均匀
散列函数适用的场景:精确值匹配,比如做等值比较: = ,IN(), 等
全文索引: