1. 索引的基础知识
在大型数据量下,索引是提高数据库效率的重要手段。一些查询如果没有索引可能会导致全表扫描,降低查询效率。
索引的定义:索引是一种数据结构,对数据库表中一列或多列进行排序,快速查找数据。索引分为聚集索引和非聚集索引。聚集索引定义了物理上的表顺序,不允许重复或 NULL 值,只有主键只能定义一个聚集索引。非聚集索引也称为辅助索引,单独存在于 B 树中,只存储索引列值和指针指向对应数据。
2. 单列索引
2.1 创建单列索引
单列索引是对表中的单独某一列创建索引,可以大大提高该列查询速度。下面是创建单列索引的语法:
db.collection.createIndex( { <field>: <type> } )
其中,<field>是字段名,<type>是索引类型,例如:
db.stu.createIndex( { age: -1 } )
表示为 stu 集合中的 age 字段创建逆序索引。
2.2 删除单列索引
删除单列索引使用 dropIndex 方法,例如:
db.stu.dropIndex( { score: 1 } )
表示删除 stu 集合中 score 字段的顺序索引。
3. 复合索引
复合索引(又称联合索引)是对表中的多列创建索引。复合索引可以优化多字段组合查询的速度,但是对于单个字段的查询效率可能低于单列索引。
3.1 创建复合索引
创建复合索引语法如下:
db.collection.createIndex( { <field1>: <type1>, <field2>: <type2> } )
以 stu 集合为例:
db.stu.createIndex( { name: 1, age: -1 } )
表示为 stu 集合中的 name 字段和 age 字段创建索引,name 字段按照正序排列,age 字段按照逆序排列。
3.2 删除复合索引
删除复合索引同样使用 dropIndex,语法和单列索引一样,例如:
db.stu.dropIndex( { name: 1, age: -1 } )
4. 索引的使用场景
索引的使用场景分为如下两个方面:
4.1 加速排序查询
使用索引可以加速按照索引字段排序的查询,例如:
db.stu.find( { name: 'Tom' } ).sort( { age: 1 } )
使用索引可以优化上述查询,加快查询速度。
4.2 加速范围查询
使用索引还可以加速范围查询,例如:
db.stu.find( { age: { $lt: 20 } } )
使用索引可以加快 age 小于 20 的查询速度。
5. 索引性能问题
索引的设计应该避免以下几个问题:
5.1 过度索引
当索引过多时,索引的增删改操作会变慢,并且占用过多的磁盘空间,影响数据库性能,因此应避免过度索引。
5.2 索引列顺序不当
当查询条件中的字段和索引中字段的顺序不一致时,索引对查询语句的优化会产生影响,应该根据查询条件优化索引字段的顺序。
5.3 慢查询
当查询结果集很大时,查询语句的执行会非常缓慢,这时可以选择使用分段查询或增加合适的复合索引来提高查询速度。
6. 总结
索引是数据库中一个重要的性能优化指标,正确使用索引可以大大提高数据库的查询效率,但是过度索引和不当的索引设计可能会对数据库性能产生负面影响,需要在设计时选择合适的索引方式。