什么是索引?
数据库中的所以,好比是一本书的目录,可以快速进行特定值的定位和查找,从而加快查询效率
索引不是万能的,在有些情况下使用索引反而会让效率变低
- 在数据比较少的情况下,比如不到1000行,就不需要创建索引的
- 在数据重复度大,比如高于10%的时候,也不需要对这个字段使用索引(比如性别
男女比例失调的除外,100万行查找50w行,一旦创建索引就得先行问50w次索引,然后在访问50w次数据表,效率降低)
索引的种类
普通索引、唯一索引、主键索引、全文索引
普通索引是基础索引,没有任何约束,主要用于提高查询效率。
唯一索引,在普通索引基础上加了数据唯一性约束
主键索引,在唯一索引基础上增加了不少空的约束(NOT NULL+UNIQUE),一张表最多有一个主键索引
全文索引,用的不多。
按照物理实现方式,索引可以分为 2 种:聚集索引和非聚集索引。
- 聚集索引可以按照主键来排序存储数据(例如查字典,按拼音查找)
- 非聚集索引,数据库系统单独储放非聚集索引,索引项目按顺序存储的,但索引项指向的内容是随机存储的,系统会进行两次查找,第一次先找到索引,第二次找到索引对应的位置取出数据行,相对于聚集索引,他不会直接定位到索引的后面,而是维护单独的索引表。(例如查字典,先按偏旁查,然后再定位后半部分)
聚集索引和非聚集索引,在使用上的区别:
- 聚集索引的叶子节点存储的就是我们的数据记录,非聚集索引的叶子节点存储的是数据位置。非聚集索引不会影响数据表的物理存储顺序。
- 一个表只能有一个聚集索引,因为只能有一种排序存储的方式,但可以有多个非聚集索引,也就是多个索引目录提供数据检索。
- 使用聚集索引的时候,数据的查询效率高,但如果对数据进行插入,删除,更新等操作,效率会比非聚集索引低。
索引还可以按照字段个数进行划分,分成单一索引和联合索引。
索引列为一列时为单一索引;多个列组合在一起创建的索引叫做联合索引。
联合索引存在最左匹配原则,也就是按照最左优先的方式进行索引的匹配。比如刚才举例的 (x, y, z),如果查询条件是 WHERE x=1 AND y=2 AND z=3,就可以匹配上联合索引;如果查询条件是 WHERE y=2,就无法匹配上联合索引。
总结:
使用索引可以帮助我们从海量的数据中快速定位想要查找的数据,不过索引也存在一些不足,比如占用存储空间、降低数据库写操作的性能等,如果有多个索引还会增加索引选择的时间。当我们使用索引时,需要平衡索引的利(提升查询效率)和弊(维护索引所需的代价)。