面试题答案
一键面试索引在删除操作性能优化方面的作用
- 加速查询匹配文档:在MongoDB中删除符合某条件的文档,首先要定位这些文档。如果在
age
字段上有索引,MongoDB可以利用索引快速定位到年龄大于50岁的文档所在位置,而不需要全表扫描。全表扫描在数据量较大时性能极低,而索引能让查询操作在索引结构中快速查找,大大减少了定位文档的时间。 - 减少I/O操作:通过索引快速定位文档,减少了磁盘I/O操作。因为不需要读取整个集合的数据来查找符合条件的文档,只需要根据索引找到相关文档的位置并读取,从而提高了删除操作的效率。
合理创建索引辅助删除操作的方法
- 单字段索引:
- 如果只根据年龄这一个条件进行删除,在
age
字段上创建单字段索引即可。可以使用以下命令创建:
这里db.users.createIndex( { age: 1 } )
{ age: 1 }
表示按升序创建age
字段的索引,若要降序则将1改为 -1。单字段索引适用于简单的查询条件,对于删除年龄大于50岁这种单一条件的操作非常有效。 - 如果只根据年龄这一个条件进行删除,在
- 复合索引:
- 若除了年龄大于50岁,可能还会结合其他条件(如性别等)进行删除操作,就需要创建复合索引。例如,假设还要删除年龄大于50岁且性别为男性的用户文档,可以创建如下复合索引:
复合索引中字段的顺序很重要,一般将选择性高(区分度大)的字段放在前面,这里年龄的区分度相对较大放在前面。在查询时,MongoDB会根据复合索引的结构快速定位符合多个条件的文档,提高删除操作性能。db.users.createIndex( { age: 1, gender: 1 } )
- 注意索引维护成本:虽然索引能提升删除操作性能,但过多或不合理的索引会增加存储开销和写操作的成本。因为每次插入、更新或删除文档时,MongoDB都需要同时更新相关的索引。所以在创建索引时要权衡利弊,只创建必要的索引。同时,定期检查和清理不再使用的索引,以维护数据库的整体性能。