数据库——索引

一、索引的概念
 引用百度百科中的描述:在关系型数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
 索引采用的数据结构是B+树(即平衡树),而非二叉树,有的数据库也使用Hash桶作为索引的数据结构。B+Tree是B-Tree的变种,是一种平衡的多路查找(又称排序)树,在文件系统和数据库系统中有所应用,主要用作文件的索引,其中的B就表示平衡(Balance)。关于索引的数据结构参看:数据库索引背后的数据结构MySQL——索引实现原理
 我们可以给表的一个列创建索引,也可以同时给表的多个列创建索引(即复合索引)。创建索引后,当向表中插入数据的时候,就会将创建了索引的列的值同时存放在相应的索引的相应位置中(也就是说索引中会存放对应索引列的值,如果我们查找的字段刚好就是创建索引的列,有时会要求顺序也和创建索引时的顺序一致,则这个查询仅通过查询索引就可以完成,而不会再去查询表,这也是复合索引的意义所在),这样我们在查询数据的时候就可以根据索引快速定位到数据行的位置。这里可以看出来,如果我们为表创建了索引,则在插入、修改或删除数据的时候就需要同时维护索引,因此索引对于增删改操作是有负作用的,但是对于查询的效率会有一定程度的提升,因为如果没有索引的话在查询时就会全表扫描匹配,而有了索引则只需要匹配几次。

二、索引的分类
 索引分为聚集索引和非聚集索引。区别在于聚集索引要求表存储的数据行的物理顺序与索引的列值的逻辑顺序相同,非聚集索引则没有这个要求。正因为这个原因,一个表只能有一个聚集索引。
 1、聚集索引
  聚集索引一般会加在主键上,当我们创建表时如果指明了主键,则默认会给该列创建聚集索引,这也是为什么使用主键作为查询条件效率很高的原因。由于一个表只能加一个聚集索引,而聚集索引又是提升查询速度最快的索引,因此聚集索引就成了一种相对稀缺的资源。如果我们不经常使用主键作为查询条件,那将其加在主键上就是一种浪费,我们也可以手动的将主键的聚集索引改为非聚集索引,然后将聚集索引加在其他经常用在查询条件的列上,比如将聚集索引加在订单表的订单编号字段上。一旦我们给表中的某个字段加了聚集索引,那么表中的数据在磁盘上存储时就由整齐排列的结构转变成了树状结构,也就是上面说的平衡树结构,换句话说,就是整个表就变成了一个索引。因此我们最好在创建表时就创建聚集索引,如果在表中已经有了很多数据的时候再创建聚集索引,则创建索引时也同时要改变数据的存储结构,这可能会很耗时。
 2、非聚集索引
  由于一个表只能有一个聚集索引,而我们在查询时不一定会用到加了聚集索引的那个字段。比如我们在查询用户信息的时候,很少会使用用户表的id作为查询条件,而是使用名字这个字段,这时我们就可以在名字这个字段上加非聚集索引。非聚集索引同样需要在增删改数据的时候进行维护,在使用非聚集索引的时候并不是直接根据非聚集索引找到的数据行,而是非聚集索引会关联聚集索引,当找到非聚集索引时就同时会找到该索引对应的聚集索引的集合,如果我们要查找的仅仅是聚集索引列的值则不会再去定位和查找数据行,而是直接将该索引的值返回,如果我们查找的字段包含其他列时才会再根据聚集索引定位和查找相应的数据列。
  盗用PostTruth的两张图:
在这里插入图片描述
在这里插入图片描述
三、索引的应用
 既然索引的目的是加速查询,那我们就应该在经常作为查询条件或作为排序的列上加上索引。若作为主键但并不常作为查询条件,则可以将主键上的聚集索引换为非聚集索引,而将聚集索引加在最经常作为查询条件的列或多个列上,方式:

#1、删除主键约束
alter table person drop constraint PK__person__117F9D94;
#2、将聚集索引加在其他列上
create clustered index test_index on person(date);
#3、在将主键约束加上,此时主键上的索引就变为了非聚集索引
alter table person add primary key (id);

 复合索引可以是聚集索引也可以是非聚集索引,什么时候应该创建复合索引呢?如上文所说,一个表中最经常被查询的字段应该创建一个复合索引,比如说如果我们经常根据用户名(user_name)查询用户的邮箱(email)和电话(phone),则应该创建一个user_name_email_phone的符合索引,最经常作为查询条件的name最好在索引的第一个位置,有了这个索引后我们就可以不同过表而直接通过索引查询到email和phone字段的值。

 关于索引的创建和删除等参看:MySQL 索引

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值