数据库索引问题部分总结(牛奶)

**

数据库四大隔离级别,实现方式

**
Read uncommitted – 不防止任何隔离性问题,具有脏读/不可重复度/虚读(幻读)问题

Read committed – 可以防止脏读问题,但是不能防止不可重复度/虚读(幻读)问题

Repeatable read – 可以防止脏读/不可重复读问题,但是不能防止虚读(幻读)问题

Serializable – 数据库被设计为单线程数据库,可以防止上述所有问题

在这里插入图片描述
persist:永久
global:重启失效
session:当前链接
设置事务隔离级别:
SET [persist | global | session] TRANSACTION ISOLATION LEVEL 隔离级别
SHOW VARIABLES LIKE ‘%iso%’

请你说一说数据库索引?

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息
索引的一个主要目的就是加快检索表中数据的方法,亦即能协助信息搜索者尽快的找到符合限制条件的记录ID的辅助数据结构。

原来数据库的整个结构是下面这个样子。最上面是客户端,就是想sqlog或者navicat这种软件的交互端,中间是在Linux上打开数据库服务,最底层是存储引擎,为了放置信息丢失,一般都是先把信息保存在文件里,再把这些文件以不同的形式存在硬盘上,形式有二进制文件形式存储,纯文本文件存储,行式文件存储,列式文件存储等等。而存储引擎就代表不同数据文件的组织形式。InnoDB 和myisam就是两种不同的存储引擎,他们是以不同的方式存储数据。
在这里插入图片描述
MySQL整个工作流程如下:在这里插入图片描述

创建索引的时候,是用int类型还是varchar类型?

谁占用的空间小,就用哪个类型,只有占用空间小,才能存储更多的索引,记录更多的数据。
在这里插入图片描述

为什么选择B+树?

一开始选择二叉搜索树,但是二叉搜索树会出现单链表形式,导致深度增加,查找复杂度增大, 后来出现AVL树,通过旋转,保证了二叉搜索树的绝对平衡,解决了查找复杂度高的问题,但是插入数据的复杂度因为旋转增加,后来出现了红黑树,并非严格意义上的平衡,仅要求最长路径不超过最短路径的两倍即可。

但是最后之所以没有选择红黑树以及这几个树,最重要的原因是这些树随着数据的增多,深度会逐渐增大,导致IO次数变多,降低我们的查询效率。为什么会增加深度呢?因为它只有二叉。而B树和B+树突破了二叉的限制。

那为什么不选择B树选择B+树?
因为B+树把数据都迁移到叶子节点,这样前几层非叶子节点就可以存储更多的索引值,从而极大的增加了存储范围,达到了千万级别。而B树因为每一层都存储数据,反而限制了它的存储数量。

B树可以存储热点数据,这样放方便查找。一般用B+树,B+树效率更高。

信息来源:
MySQL底层树的分类
MySQL数据结构的选择

MySQL中的树一般是几层?

一般3-4层的B+树,足以支撑千万级别的数据的访问。并且具体有几层是不可以人为设置的。查一层需要一次IO操作,查3次需要三个IO操作。至少要查三次,因为数据在最后一层存放。

InnoDB和myISAM这两种存储引擎有什么区别?

InnoDB的数据和索引在一起,都保存在.ibd文件中,而myISAM的数据和索引是分开的,分别储存在.myd和myi两个文件中。myISAM引擎的叶子节点指向的是数据地址。所以该引擎相比InnoDB会多进行一次IO操作。
在这里插入图片描述
在这里插入图片描述

创建索引的时候有一个key值.这个key是什么?

默认情况下是主键,如果没有主键,那么是唯一键,如果没有唯一键,那么就是一个6字节的rowid。

如果一个表中有多个索引,比如有学生的ID(主键),姓名,年龄,身高等,那么应该怎样进行存储索引?数据存储几份?

数据只存储一份。建立一个索引就会有一个B+树,其他索引比如姓名,他们会重新在一个B+树中进行查找,其叶子节点存储的不是数据而是主键ID值,最后又会跳到ID的树中去查找真正的数据。这个过程就称之为回表

回表:当使用其他索引的时候,叶子节点中并不包含整行的数据值。需要去主键索引中进行数据查找的过程叫做回表。

索引的分类?

在这里插入图片描述

最左匹配原则?(有点含糊)

大致意思就是说,对于组合索引,只有匹配到第一个索引,才能匹配到后面的索引。所以每一次写都要把第一个索引写出来,如下凡是带select * from table where name =? 都是正确的,不论放在age=?之前还是之后,最左匹配原则就是说如果name =?放在了age=?后面,内部的优化器会自动把它调整到最左边,方便后续的利用。
在这里插入图片描述

索引下推(有点含糊)

下推必须是组合索引。和最左匹配原则的前提差不多。下推之后减少了IO操作,提高了操作效率。
在这里插入图片描述

主键为什么选择自动递增?

因为B+树必须要保证存储结构有序,如果不自动递增,插入和删除数据的时候,就可能会出现也分裂和页合并,**会影响整个数据结构和层数,**导致操作复杂度升高,效率降低。而选择自动递增后,每次插入直接就可以发放到最后,不会影响前面的结构,效率非常高。

什么是聚集索引?非聚集索引?

聚集索引:数据和索引是聚集存储的。比如InnoDB的主键索引。
非聚簇索引:数据和索引不放在一起,索引和类似于指针放在一起,需要执行回表操作进行二次查找才能找到。
myISAM索引都是非聚簇索引,InnoDB的二级索引

数据库三大范式

1.表中所有的字段都是不可再分的。
2.必须存在业务主键,并且表中所有非业务主键都必须依赖于全部业务主键。
3.表中非主键列不能相互依赖。

myisam和innodb的区别

前者是系统自带,后者是另外一家公司开发的
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值