vlambda博客
学习文章列表

面试复习之MySQL篇

一、索引是一种数据结构

     索引是对数据库表中一列或者多列的值进行排序的一种数据结构。理解MySQL数据库的B+Tree索引的数据结构,就必须先掌握基础的数据结构,因为B+Tree是从二叉树逐步演化来的。索引可以提高数据检索、聚合函数、排序的效率。

  1. 二叉树

    每个结点最多有2个子结点,即可能含有0-2个;

    子树有左右序之分,顺序不可颠倒;

    左子树的键值永远小于右子树,并小于根键值;

  2. 平衡二叉树

    二叉树保存数据越多,结点的深度可能会越大,不利于快速查找数据;

    对二叉树进行左旋或者右旋,获得1个左右子树高度差不大于1的二叉树;

  3. B-Tree

    B-Tree不限制子结点的数量;

    叶子结点都出现在同一层;

    叶子结点不包含任何关键字信息;

  4. B+Tree(双向链表)

    B+Tree不限制子结点的数量;

    叶子结点都出现在同一层;

    叶子结点包含关键字信息的指针;

    叶子结点按照关键字的大小顺序连接;

二、B+Tree索引分类

  1. 聚集索引

    叶子结点存储表中所有行数据记录的信息,索引即数据;

    如主键索引、行数据;

  2. 普通索引(非聚集索引)

    叶子结点只存储索引本身的键值和主键的值(先通过索引页的叶子结点找到主键,再通过主键回表查找行数据记录,2次I/O读操作);

    如唯一索引、前缀索引、联合索引等;

三、索引优化

      通过“explain命令 + SQL语句”来分析语句的查询执行效率及索引是否满足预期;

     explain结果主要依次看type、key、rows、extra、filtered列(type为all表示全表扫描,key为null表示未使用索引,rows数量表示被扫描的行数,extra为Using filesort或者Using temporary表示使用了文件或内存排序,filtered代表返回结果行数量占rows列的百分比);

       优化经验基本主要围绕业务场景,from表连接条件、where查询条件、order by排序、group by分组的列都要尽可能的匹配索引(完全匹配就是最理想的覆盖索引了,1次I/O读操作,即extra列为Using index),并且条件字段的数据类型要保持一致(避免发生隐式转换导致索引失效);

四、索引创建

1.主键索引

     ALTER TABLE t_user ADD PRIMARY KEY(id);

2.唯一索引

     ALTER TABLE t_user ADD UNIQUE(user_id);

3.前缀索引

     ALTER TABLE t_user ADD KEY(user_name(prefix_length));

4.联合索引

     CREATE INDEX idx_provinceCode_cityCode ON t_user (provinceCode,cityCode);

五、事务

1.事务的特性(ACID)

    原子性、一致性、隔离、持久性。

2.事务的隔离级别

    MySQL默认的隔离级别RR(事务结束前始终可读到事务开始时的数据快照);

    隔离级别分别是RU(脏读)、RC(幻读,可能读不到事务开始时的数据快照了)、RR、Serializble;

六、锁

1.MyISAM只支持表锁(无死锁现象、并发量低)

2.InnoDB支持行锁(死锁现象、并发量高)和表锁

3.InnoDB支持行锁

    读锁,即S锁,有单行记录锁(主键和唯一索引)、间隙锁(指定范围的记录)、混合锁(普通索引);

    写锁,即X锁;

    MDL锁,正常读写事务默认开启MDL来防止执行DDL语句修改表结构;

4.InnoDB行锁的锁等待/超时、死锁

   锁等待/超时:Lock wait timeout exceeded:try restarting transaction.

   死锁:Deadlock found when trying to get lock,try restarting transaction.

5.锁问题监控

    show full processlist

    show engine innodb status

、数据库架构设计闭坑思考

1.主从模式

    一主多从模式中,存在主从数据延迟的情况(通过Zabbix开源可视化工具监控),如果数据量较大、从库性能差异大,可能会出现不同从库的延迟时间不一致的现象;

2.主从从模式

    从库的从库,通常是用来做一些数据采集实时性要求不高的业务场景,比如T+1报表、按周、月、年汇总数据;