索引的意义:索引在数据库中的作用相当于目录在书籍中的作用类似,都用来提高查找信息的速度。索引是一个表中所包含值的列表,其中注明了表中包含各个值的行所在的存储位置,使用索引查找数据时,先从索引对象中获得相关列的存储位置,然后再直接去其存储位置查找所需信息,这样就无需对这个表进行扫描,从而可以快速的找到所需数据。按指定的某些字段建立个索引表,通过索引表可以快速检索到记录。索引表中主要包括两项内容:关键字,关键字对应的记录号。
MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为 _id 创建索引,它的索引使用基本和MySQL 等关系型数据库一样。其实可以这样说,索引是凌驾于数据存储系统之上的另一层系统,所以各种结构迥异的存储都有相同或相似的索引实现及使用接口并不足为 奇。
优点:不需要做全表扫描,只需要扫描索引索引只存储了这个表的数据的一小部分,这小部分可以帮我们实现快速查询,因此扫描的时候只扫描这一小部分即可,如果将这小部分装载入内存中的话,速度会更快,大大减少了服务器需要扫描的数据量,索引可以帮助服务器避免排序或使用临时表索引可以将随机I/O转换为顺序I/O。
缺点:索引是保存了数据表上的一小部分数据,那么这些数据是需要额外存储的,毫无疑问如果更新了表中的数据,那么响应的索引数据也要跟着更新,加速了查找操作,但是减少了写入速度对查找的加速是否有用还是有待评估的,比如我们将一个表中的按年龄实现了索引创建(在年龄上创建了索引)平时大多数操作都是按照名字上去查找的,那么索引则无任何作用,所谓索引必须跟查找建完全匹配才有意义,但我们要知道大多数的查找未必只在有限字段上执行,也就意味着创建索引必须包含多个段,需要看索引是如何去生成的,对于多个条件可以将索引做为组合索引来查找,所以索引的设计是非常有技巧的
索引本身带来的未必是优势,如果一张表中索引非常的多的话,可能对于整个系统性能的影响是非常大的,如果一张表的本身非常小只有十几行,创建索引反而会减慢速度的,因为全表扫描也未必用不了多长时间
但如果表非常大的话,索引则非常有用,如果数据量过大那么索引反而也未必有意义,比如一张表非常大,上T的数据,可以想象一下创建什么样的索引才可以,所以只能将大表切割成小表,并且分布在不同的物理节点上,对mysql来说叫做分区;对mongodb来讲叫shaerd。
索引案例参考:
1: http://blog.youkuaiyun.com/congcong68/article/details/46955115
2: http://blog.youkuaiyun.com/loveyunwt/article/details/8067480