mysql之索引

什么是索引

MySQL索引是帮助MySQL高效获取数据的数据结构,索引是一种数据结构,用于帮助我们在大量数据中快速定位到我们想要查找的数据。
索引是一种数据结构,那么适合做索引的数据结构就有哈希,平衡二叉树,b树,b+树
1.哈希在数据量大的时候会散列增加,文件庞大,不能使用范围查找,in查找
2.平衡二叉树在数据量大的时候会出现需要维持平衡二叉树而进行移动操作耗时,二叉树的特点是左边节点小于父节点,右边节点大于父节点,数据多,树的高度就高,查找比较就多
3.b树是将数据放到了节点上,这样就会影响树的高度
4.b+树是对b树进行了优化,将数据放在叶子节点 叶子节点之间有双向指针相连
索引的类型
1、普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一 点。

2、唯一索引:索引列中的值必须是唯一的,但是允许为空值。

3、主键索引:是一种特殊的唯一索引,不允许有空值。(主键约束,就是一个主键索引)。
4、联合索引:在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合。

5、全文索引:全文索引,只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引,介绍了要求,说说什么是全文索引,就是在一堆文字中,通过其中的某个关键字等,就能找到该字段所属的记录行。

索引的原理

MySQL的数据是以页为单位存储的。一页可以存储16K(可修改)。

主键索引:

在创建表的时候会自动创建主键索引(如果没有指定索引,就会找表中的唯一字段作为索引,如果没有合适的字段,就会创建一个隐藏列作为索引)。我们的数据是放在主键索引的叶子节点上的,非叶子节点存放我们的主键利于查询。每个节点存储的数据是一页(16K)。例如我们查询id=18的数据。首先在根节点查询id=18的区间,然后在其子节点查询id=18的区间,在去其子节点查询id=18的数据,一共查询三次即可。由此可见,树的高度越高查询的次数就越多。那么树的高度是由我们的非叶子节点存储的数据多少来决定的,每个节点的存储容量是固定的,id的值越小,存储的id就越多,那么三层高度的数据存储就越多。大约在2000万数据以后表的性能会下降。
我们千万级别的数据树的高度一般在3到5之间。
在这里插入图片描述

联合索引:

联合索引是我们在插入数据的时候非叶子节点存储了我们创建索引的字段值,如果是多个字段就会按照创建字段的顺序一次将字段值放在节点里面。正是因为这样存放,这就要求我们使用索引时遵循最左原则。我们在查询数据时,先对比第一个字段,第一个字段命中之后再对比第二个字段,这样往下对比。
联合索引的叶子节点存储的是数据对应主键索引的值。那么通过联合索引查到的数据就是主键索引的值,就需要通过主键索引再查一次才能找到真正的数据。这个过程叫做回表。
在这里插入图片描述

问题

主键为什么用int 不能用uuid

因为数据库在插入时进行排序,在排序时可能会出现数据的移动,因为页的数据存储有限,而插入的数据正好在中间的页中,这时后面的数据就会被移动到下一页,int自增就不需要了本身就是自增不需要进行排序,也不会出现页里面的数据移动
主键或者索引字段越小越好,字段占用空间越小,一页存放的数据就会越多,树的高度就会越小,查询速度就会越快。

如何避免回表:

如果我们查询的数据就是就是我们叶子节点上存在的(与创建索引字段一致),这时候就直接返回,不需要做回表操作。

索引可以随便添加吗

索引也是占用我们磁盘空间的,索引也需要数据库进行维护,在做增删改的时候索引会被数据库做一些相应的操作。所以,我们加索引要在经常查询,而增删改变动不频繁的字段上面,字段的值如果很少的话也是不需要建立索引的,比如性别这样只有男和女的字段查询中与其他表关联的字段外键关系建立索引。这样才会降低数据库维护,增加查询效率。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值