1.谈谈数据库事务的理解

事务由单独单元的一个或者多个SQL语句组成,在这个单元中, 每一个MySQL语句都是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚。
所有受到影响的数据将返回事务开始以前的状态;如果单元中的所有SQL语句均执行成功,则事务被顺利执行。
事务的特性:
原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,
事务中的操作要么都发生,要么都不发生。

一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另一个一致性状态。

隔离性(Isolation)
事务的隔离性是指一个事务的执行不能被其它事务干扰,
即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,
并发执行的各个事务之间不能互相干扰。

持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障 不应该对其有任何影


2.解释胀读、幻读、不可重读

脏读:所谓的脏读,其实就是读到了别的事务回滚前的脏数据。比如事务B执行过程中修改了数据X,在未提交前,事务A读取了X,而事务B却回滚了,这样事务A就形成了脏读。也就是说,当前事务读到的数据是别的事务想要修改成为的但是没有修改成功的数据。

幻读:一个事务中两次读取的数据的数量不一致(insert或delete时发生的问题)

不可重读: 事务A首先读取了一条数据,然后执行逻辑的时候,事务B将这条数据改变了,然后事务A再次读取的时候,发现数据不匹配了,就是所谓的不可重复读了。

3.什么是索引

  • 排好序的数据结构,可以帮助快速查找数据
  • 优缺点:索引可以提高查询速度,查询使用优化隐藏器提高性能,但是也会占据物理空间,降低增删改的速度,因为还要操作索引文件

4.索引类型

  • 普通索引:可以重复

  • 唯一索引:唯一,可为空,表中只有一个主键索引,可多个唯一索引

  • 主键索引

    • 唯一,不为空,叶子结点存出了行记录数据,主键索引也称聚簇索引,对应非主键索引的叶子结点存的主键的值(二级索引),用二级索引查需要回表操作(根据二级索引查到主键,再根据主键去主键索引查)
    • 一般推荐用自增主键,保证空间利用率,减少页分裂
  • 全文索引

  • 覆盖索引:索引字段覆盖了查询语句涉及的字段,直接通过索引文件就可以返回查询所需的数据,不必通过回表操作。

  • 回表:通过索引找到主键,再根据主键id去主键索引查。

  • 索引下推

    • 在根据索引查询过程中就根据查询条件过滤掉一些记录,减少最后的回表操作
  1. 假如执行select * from stu where name=? and age=?
  2. 没有索引下推先再存储引擎根据name筛选数据返回给server层,然后server层再根据age过滤
  3. 有索引下推直接根据nameage在存储引擎层就筛选得到结果

5.索引底层数据结构?

B+树、hash
hash底层是哈希表实现,等值查询,可以快速定位,一般情况效率很高,不稳定,当出现大量键重复哈希冲突,效率下降,不支持范围查询,无法用于排序分组,无法模糊查询,多列索引的最左前缀匹配原则,总要回表操作等。

6.B树与B+树区别?为何用B+树?

B+树:非叶子结点不存data,只存key,查询更稳定,增大了广度(B+树出度更大,树高矮,节点小,磁盘IO次数少);叶子结点下一级指针(范围查询);索引冗余。

与红黑树相比:

更少查询次数:B+树出度更大,树高更低,查询次数更少

磁盘预读原理:为了减少IO操作,往往不严格按需读取,而是预读。B+树叶子结点存储相临读取会快一些

存储更多索引结点:B+树只在叶子结点储存数据,非叶子结点存索引,而一个结点就是磁盘一个内存页,内存页大小固定,那么相比B树这些可以·存更多的索引结点,出度更大,树高矮,查询次数少,磁盘IO少。

7.索引设计原则(查询快,占用空间少)

  • 出现在where子句或则连接子句中的列
  • 基数小的表没必要
  • 使用短索引,如果索引长字符串列,应该指定前缀长度
  • 定义有外键的数据列一定索引
  • 不要过度索引
  • 更新频繁的不适合
  • 区分度不高的不适合,如性别
  • 尽量扩展索引,别新建索引,如(a)->(a,b)

总结:索引设计原则要求查询快,占用空间少;一般建在where条件,匹配度高的;要求基数大,区分度高,不要过大索引,尽量扩展,用联合索引,更新频繁不适合、使用短索引。