MySQL高级02:索引(重点)

目录

 

一、索引的数据结构

 二、B+树

三、常见索引概念

3.1 聚簇索引

3.2 二级索引(辅助索引、非聚簇索引)

3.3 联合索引(非聚簇索引)

 MyISAM与InnoDB索引的对比

5、索引的代价


一、索引的数据结构

索引是帮助MySQL高效获取数据的数据结构;降低数据库和磁盘IO的成本;

        索引的本质:是数据结构;这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法;

        索引是在存储引擎中实现的,因此每种存储引擎的所有不一定完全相同

 缺点:创建、维护耗费时间、占据磁盘空间、降低更新表的速度;

提示:

        索引可以提高查询速度,但是会影响插入记录的速度,这种情况下,最好的办法就是先删除表中的索引,然后插入数据,插入完数据之后再创建索引;

 二、B+树

三、常见索引概念

        基于主键构建的索引称为聚簇索引不是主键的就称为非聚簇索引(二级索引、辅助索引);

3.1 聚簇索引

        聚簇索引并不是一种单独的索引类型,而是一种数据存储方式(所有的数据都存储在叶子节点),也就是所谓的索引即数据,数据即索引;非聚簇索引中索引和数据是分开的

 聚簇索引的优点:

        1、数据访问更快,因为聚簇索引将索引和数据保持在同一个B+树中,因此从聚簇索引中获取数据比非聚簇索引更快

        2、聚簇索引对于主键的排序查找和范围查找速度非常快;

        3、按照聚簇索引排列顺序,查询显示一定范围数据的时候,由于数据都是紧密相连,数据库不用从多个数据块中提取数据,所以节省了大量的io操作

聚簇索引的缺点:

        1、插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式,否则就会出现页分裂(因为他是有序的,在插入的时候如果按照顺序就会进行大量的移动(页分裂),影响性能),严重影响性能,所以对于InnoDB表,一般会定义一个自增的ID列为主键;

        2、更新主键的代价很高,因为将会导致被更新的行移动,因此,对于InnoDB表,一般定义为主键不可更新;

        3、二级索引访问需要两次索引查找,第一次找到主键值,第二次根据主键值找到行数据;

 限制:

        1、对于MySQL数据库目前只有InnoDB数据引擎支持聚簇索引,而MyISAM并不支持聚簇索引;

        2、由于数据物理存储排序方式只能有一种,所以每个MySQL的表只能又一个聚簇索引,一般情况下就是该表的主键;

        3、如果没有定义主键,InnoDB会选择非空 的唯一索引代替,如果没有这样的索引,Innodb会隐式的定义一个主键来作为聚簇索引;

        4、为了充分利用聚簇索引的聚簇的特性,所以innodb表的主键列应尽量选择有序的顺序ID,而不建议用无序的id;

聚簇索引只能在搜索条件是主键值的时候才能发挥作用,因为B+树中的数据都是按照主键进行排序的;

3.2 二级索引(辅助索引、非聚簇索引)

实际上为了保证内节点的唯一性,再目录页中不止有C2的值,还有对应的主键值;

        比如,两个C2都一样了下一条数据就不知道插入到第一个的左边还是右边,这个时候就需要保证他的唯一,所以需要添加主键,这样再插入的时候就不会不知道插入到什么位置;

       搜索条件不是主键的时候,可以多建几个二叉树;

二级索引中存储的是:按照某个字段构建的二级索引+主键

 回表:

        例如:根据C2列(不是主键)大小排序的B+树,只能确定要查找记录的主键值,如果想要根据C2列的值查找到完整的用户记录的话,需要到聚簇索引中去根据查询到的主键值再查询一遍,这个过程称为回表,也就是根据C2列的值查询一条完整数据的时候需要用到2棵B+树

问题:为什么需要一次回表操作?直接把完整的用户记录放到叶子节点不行吗?

        回答:如果把完整的用户记录放到叶子节点是可以不用回表的,但是太占地方了,相当于每建立一颗B+树都需要把所有的数据都拷贝一边,这就有点太浪费空间了;

总结:

1、聚簇索引的叶子节点存储的就是数据记录非聚簇索引的叶子节点存储的是数据位置非聚簇索引不会影响数据表的物理存储顺序;

2、一个表只能又一个聚簇索引,因为只能又一个排序存储的方式,但可以有多个非聚簇索引,也就是多个索引目录提供数据检索;

3、使用聚簇索引的时候,数据的查询效率高(不需要回表),但如果对数据进行插入、删除,更新等操作,效率会比非聚簇索引低;

3.3 联合索引(非聚簇索引)

        上边提到的是以一个列的大小作为排序规则,那么也可以同时为多个列的大小作为排序规则,也就是为多个列建立索引;例如按照C2、C3的大小进行排序,这个包含两层含义:

        先把各个记录和页按照C2列进行排序;

        C2相同的时候按照C3进行排序;

 其实就是多了一个列的比较;

3.4 InnoDB的B+树索引的注意事项

 2、内节点中目标项记录的唯一性

 前面的索引结构都是基于InnoDB引擎的;

4、MyISAM中的索引方案

        MyISAM引擎使用的也是B+树作为索引结构,MyISAM的data域中存储的是数据记录的地址;MyISAM中是数据和索引分开存储。(所以就没有聚簇索引,可以理解为全部都是二级索引或非聚簇索引);

InnoDB引擎中根据使用的是聚簇索引还是非聚簇索引data存放的数据不同;

 MyISAM与InnoDB索引的对比

1、在InnoDB存储引擎中,我们只需要根据主键值对聚簇索引进行一次查找就能找到对应的记录,而在MyISAM中,需要进行一次回表的操作(MyISAM中建立的索引都是二级索引);

2、InnoDB中数据和索引是保存在一起的MyISAM中数据和索引是分离的,索引文件只是保存了数据的地址;

3、InnoDB得到非聚簇索引data域中存储相应记录主键的值MyISAM索引记录的是地址。InnoDB中所有的二级索引中data域中都是主键的值;

4、MyISAM中的回表操作十分快速,因为拿着地址就可以直接到文件中去查找,InnoDB还需通过获取到的主键去聚簇索引中进行查找,速度会稍微慢一些;

5、InnoDB要求表中必须有主键(MyISAM可以没有);如果额米有显示指定,MySQL系统就会自动选择一个可以非空且唯一标识数据记录的列作为主键,如果不存在这样的列,就会自动创建一个隐含字段作为主键;

小结:

         二级索引中会保存主键的值,如果过长,就会导致数据页中的数据减少(因为数据页大小为16kb),数据页中存储的数据数变少,就可能导致层数增加,IO的次数增加,性能下降;

也就是主键一会大一会小,就会导致频繁的页分裂,性能降低;所以一般选择主键都是自增的;

5、索引的代价

 时间上的代价总的来说就是:在进行增删改操作的时候需要去维护索引表;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小馨java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值