索引
1.索引是什么?
- 索引是一种特殊的文件,它们包含着对数据表里所有记录的引用指针。
- 索引是一种数据结构。相当于目录,为了方便查找库中的内容,通过对内容建立索引形成目录。而且索引是一个文件,它是要占据物理空间的。
- 索引可以大大提高MySQL的检索速度。
2.索引的优缺点:
- 优点:
- 加快数据的检索速度
- 提高系统的性能
- 缺点:
- 降低增/改/删的执行效率
- 需要占物理空间
3.MySQL有哪几种索引类型?
- 从存储结构上来划分:BTree索引
- 从应用层次来分:普通索引、唯一索引、复合索引
- 普通索引:即一个索引只包含单个列,一个表可以有多个单列索引
- 唯一索引:索引列的值必须唯一
- 复合索引:多列值组成一个索引
- 聚簇索引:是一种数据存储方式。是B+Tree的叶子节点处存储整行数据。
- 非聚簇索引:是B+Tree的叶子节点处存储主键的值。
4.索引的底层实现?
- B+Tree索引:是B-Tree的改进版本,数据都在叶子节点上,并且增加了顺序访问指针,每个叶子节点都指向相邻的叶子节点的地址。相比B-Tree来说,进行范围查找是只需要查找起始节点与结束节点即可,而B-Tree需要获取所有节点,B+Tree效率更高。
5. 为什么索引结构默认使用B+Tree,而不是B-Tree,Hash,二叉树,红黑树?
- 不用B-Tree的原因:
- B+树的磁盘读写代价更低
- B+树的数据都在叶子节点处,方便扫库,故更加适合在区间查询的情况
- 不用Hash的原因:
- 它是无序的
- 基于Hash表实现
- 适合等值查询
- 不能进行排序,因为不是按照索引值顺序存储的
- hash索引在查询等值时非常快
- 不用二叉树的原因:
- 树的高度不均匀,不能自平衡,并且IO代价高
- 不用红黑树的原因:
- 树的高度随着数据量增加而增加,IO代价高
6. 讲一讲聚簇索引与非聚簇索引?
- 聚簇索引:索引B+Tree的叶子节点存储的的是整行数据的是主键索引,也叫聚簇索引
- 非聚簇索引:索引B+Tree的叶子节点存储的是主键的值的是非主键索引,也被称为二级索引
- 聚簇索引与非聚簇索引的区别:
- 通常情况下,聚簇索引查询只会查一次,而非主键索引需要回表多次,但如果是覆盖索引就也是一次。
- 想要查找数据我们还需要根据主键再去聚簇索引中进行查找,这个过程叫做回表,第一次索引
- 一般是顺序IO,回表的操作属于随机IO。
7.覆盖索引?
- 一个索引包含(覆盖)所有需要查询字段的值,被称为“覆盖索引”
8.联合查询是什么?为什么需要注意联合索引中的顺序?
- MySQL使用多个字段同时建立一个索引的过程叫做联合索引。在联合索引中,如果想要命中索引,需要按照建立索引时的字段顺序挨个使用,否则无法命中索引。
9. 讲一讲MySQL的最左前缀原则?
- 就是最左优先,在创建多列索引时,要将while子句中使用最频繁的一列放在最左边。
- 直到查询到> < between like才会停止查询。
10. 讲一讲前缀索引?
- 将很长字段的前面的公共部分作为一个索引,产生超级加倍效果的过程。
11.了解索引下推吗?
- 索引下推时默认开启的,它的作用是:
- 有了索引下推优化,可以减少回表次数
- 在InnoDB中值针对二级索引有效
12.为什么建议用自增长主键作为索引:
- 唯一性:它可以确保每行数据都有唯一的标识,可以提高数据的完整性与准确性。
- 效率问题:可以提高嘻哈寻与写入操作的效率。
- 易于维护:自增长主键是一个简单的整数,易于维护与管理。
13.创建索引的方式:
- 执行create table创建索引
- 使用alter table创建索引。
- 使用create index命令创建索引。
14.创建索引的原则:
- 最左匹配原则
- =和in可以乱序
- 尽量扩展索引,不要新建索引
- 尽量选择区分度高的列来做为索引
- 索引列 不能参与运算
15.索引失效的情况:
- 使用!=或者<>导致索引失效
- 类型不一致导致索引失效
- 函数导致索引失效
- 运算符导致索引失效
- or引起索引失效
- 模糊搜索引起索引失效
- NOT IN 、NOT EXISTS导致索引失效
基础
1.数据库的三范式是什么:
- 第一范式:强调的是列的原子性
- 实体的属性完全依赖于主关键字
- 任何非主属性不依赖于其他非主属性
2.超键、候选键、主键、外键分别是什么:
- 超键:在关系中能够唯一标识元组的属性集叫做关系模式的超键。一个属性可以作为一个超键,多个属性组合在一起也可以作为一个超键使用。超键包含候选键与主键。
- 候选键:是最小的超键,即没有冗余元素的超键。
- 主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。主键不能为空。
- 外键:在一个表中存在另一个表的主键叫做这个表的外键。
3.MySql中的varchar与char的区别是什么?
- char是一个定长字段,而varchar是可变的。
- 在检索效率上讲,char > varchar,如果确定了值的长度,就要使用char,否则尽量使用varchar。
4.MySQL中in与exist的区别:
in是将外表与内表做hash连接,而exist是对外表做loop循环,每次loop循环在对内表进行查询。
5.drop、delete、truncate的区别:
- delete:可回滚,表结构还在,删除表的全部或者一部分数据行。
- truncate:不可回滚,表结构还在,删除表中的所有数据。
- drop:不可回滚,所有都删除。
事务
1.什么是数据库事务?
- 事务是数据库并发控制的基本单位,其执行的结果是使数据库从一种一致性状态变为另一种一致性状态,要么都执行,要么都不执行。
2.事务的特征:ACID(刚性事务)
A:原子性:操作不可再分,要么都成功,要么一个都不执行。
C:一致性:使数据库从一种一致性状态变为另一种一致性状态。
I:隔离性:并行执行的事务之间不能相互干扰。
D:持久性:一个事务提交之后对数据库中的改变是永久的。
3.MySQL的四种隔离级别:
- RU:读取未提交内容,也被称之为脏读。
- RC:读取提交内容,支持不可重读。
- RR:可重读。
- Serializable:可串行化。
4.什么是脏读?幻读?不可重复读?
- 脏读:事务A读取了事务B更新的速度,然后B回滚,此时A读取到的数据就是脏数据。
- 不可重读:事务A多次读取同一数据时,事务B对数据进行了修改操作,导致A读取到的数据不一致。
- 幻读:事务A多次读取同一数据时,事务B对数据进行了增加或删除操作,导致A读取到的数据不一致。
5.MVCC及其实现原理:
- MVCC:即多版本并发控制。MVCC的实现,是通过保存数据在某个时间点的快照来实现的。
- 实现原理:"3 3 2"
- 3个隐藏的列:
- ROW ID:隐藏的自增ID,如果没有主键,就会自动产生一个聚焦索引树。
- 事务IID:记录最后一次修改该记录的事务ID。
- 回滚指针:指向这条记录的上一个版本。
- 3个读的方式:
- 快照读:不会对数据进行修改,会形成恭喜将效果。
- 当前读:会对数据进行修改,会形成排他效果。
- 读视图:read viewer
- 2个日志:
- redo log:"落盘策略" ,是为了实现事务的持久性而出现的产物。
- undo log:"回滚记录" ,时为例实现事务的原子性而出现的产物。
锁
1.为什么要加锁?
- 为了在多用户环境下保证数据完整性与一致性。
2.按照锁的粒度分数据库锁有哪些?
- 行级锁:开销大,加锁慢,会出现死锁,锁定粒度最小。
- 表级锁:开销小,加锁快,不会有死锁,锁定粒度最大。
- 页级锁:开销、粒度与时间在行与表级锁之间,会出现死锁
3.按照锁的类别分MySQL都有哪些锁呢?
- 共享锁:又叫做读锁,共享锁可以同时加上多个。
- 排它锁:又叫做写锁,排它锁只能有一个。
4.数据库的乐观锁与悲观锁是什么?怎么实现的?
数据库管理系统中的并发控制的任务是确保在多个事务同时存取数据库中同一数据是不破坏事务的隔离性和统一性以及数据库的统一性。乐观锁与悲观锁就是并发控制主要采取的技术手段。
- 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。在修改数据的时候吧事务锁起来,通过version的方式来基尼陷阱锁定。适用于多读的场景。
- 悲观锁:假设会发生并发冲突,屏蔽一切可能违反数据完整性的操作。在查询完整数据的时候就把事务锁起来,直到提交事务。
5.什么是死锁?怎么解决?
死锁是指两个或多个事务在同一资源上相互占用并请求所缔结那个对方的资源,从而导致恶行循环的现象。
常见的解决死锁的方法:
- 以相同的顺序访问表,可大大降低死锁机会。
- 尽可能一次锁定所需要的所有资源,减少死锁产生的概率。
- 使用升级锁定颗粒度。
6.隔离级别与锁的关系?
- 在RU下,读取数据不需要加共享锁。
- 在RC下,需要加共享锁,但在语句执行完以后释放共享锁。
- 在RR下,需要加共享锁,但必须要等事务执行完毕之后再释放共享锁
- Serializable是限制性最强的隔离级别,是整个范围的锁,并一直持有锁,直到事务完成。