mysql数据库------索引(1)

一、什么是索引

索引是帮助MySQL高效获取数据的排序好数据结构

1.1 索引数据结构:
  • 二叉树
  • 红黑树 :又叫二叉平衡树
  • hash表 :
  • B-Tree :分为B-Tree和B+Tree(多叉平衡树)
    在这里插入图片描述
    例如没有索引的时候,select * from table where col2=89 ,查询这条语句会扫描前面的1-6才能找到数据89,这是数据少,当数据多的时候就会相当耗费资源。
    有了索引就会按照索引对应的数据结构使用的方法快速找到数据89.

测试这四种数据结构的网站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
可以选择索引相应的数据结构进行演示查看(如图)
在这里插入图片描述

1.2 B-Tree

b-tree是根据红黑树改造而来,下面是b-tree的特点:

  • 叶节点具有相同的深度,叶节点的指针为空
  • 所有索引元素不重复
  • 结点中的数据索引从左到右递增排列

在这里插入图片描述

1.3 B+Tree
  • 非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
  • 叶子节点包含所有索引字段
  • 叶子节点用指针连接,提高区间访问的性能

在这里插入图片描述
因为一个叶节点的大小是固定的,根节点不存放数据就会存放更多的索引,查看根节点的大小:
在这里插入图片描述
从图中可以看出一个节点占用16kb(存储在内存中),一个索引最大占用14byte(bigint8字节,指针6字节,),所以根节点最大存放索引元素:16kb/14byte=1170
在这里插入图片描述
假设叶子节点中一个索引元素和一个data占用1kb,一个节点就能放16个索引和data,那么整个叶子节点可以存放1170117016=21902400,这就是只进行2次IO就能查到2千多万条索引数据。

二、存储引擎

MySQL中常用的四种存储引擎分别是: MyISAM存储引擎、innoDB存储引擎、MEMORY存储引擎、ARCHIVE存储引擎。

2.1 查看存储引擎

1、show engines; // 查看mysql所支持的存储引擎,以及从中得到mysql默认的存储引擎。
在这里插入图片描述
2、show variables like ‘% storage_engine’; // 查看mysql 默认的存储引擎

3、show create table tablename ; // 查看具体某一个表所使用的存储引擎,这个默认存储引擎被修改了!

4、show table status from database where name=“tablename” //准确查看某个数据库中的某一表所使用的存储引擎

2.2 MyISAM和innoDB存储引擎:

现在我们常用的就是这两种存储引擎,所以我们主要讲解这两种存储引擎:

2.2.1MyISAM存储引擎:

存放的位置:/var/lib/mysql/所在数据库/(docker模式)
我建了一个存储引擎是MyISAM的student表,我们发现他有三个文件:
student.MYD(数据) student.MYI(索引) student.frm(表结构)
在这里插入图片描述
存放的方式: MyISAM 这种存储引擎不支持事务,不支持行级锁,只支持并发插入的表锁,主要用于高负载的select。

索引的方式: MyISAM也是使用B+tree索引但是和Innodb的在具体实现上有些不同。

MyISAM强调了快速读取操作,主要用于高负载的select,这可能也是MySQL深受Web开发的主要原因:在Web开发中进行的大量数据操作都是读取操作,所以大多数虚拟主机提供商和Internet平台提供商(Internet Presence Provider,IPP)只允许使用MyISAM格式。

优缺点:
MyISAM的优势在于占用空间小处理速度快。缺点是不支持事务的完整性和并发性

2.2.2 innoDB存储引擎:

存放的位置:/var/lib/mysql/所在数据库/(docker模式)
我建了一个存储引擎是innoDB的teacher表,发现有以下两个文件:
teacher.frm(表结构) teacher.ibd(索引和数据)
在这里插入图片描述

我们发现innoDB比MyISAM少了一个文件,是因为innoDB将索引和数据放在了同一个文件中。

innodb存储引擎的mysql表提供了事务,回滚以及系统崩溃修复能力和多版本迸发控制的事务的安全。

innodb支持自增长列(auto_increment),自增长列的值不能为空,如果在使用的时候为空的话怎会进行自动存现有的值开始增值,如果有但是比现在的还大,则就保存这个值。

innodb存储引擎支持外键(foreign key) ,外键所在的表称为子表而所依赖的表称为父表。

innodb存储引擎最重要的是支持事务,以及事务相关联功能。

innodb存储引擎支持mvcc的行级锁

innodb存储引擎索引使用的是B+Tree

优缺点:
InnoDB的优势在于提供了良好的事务处理崩溃修复能力和并发控制。缺点是读写效率较差占用的数据空间相对较大

参考:
存储引擎:https://zhuanlan.zhihu.com/p/50564425
索引(视频):https://www.bilibili.com/video/BV1aE41117sk?p=6

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值