当前位置 博文首页 > 信息技术智库:?『面试知识集锦100篇』3.mysql篇丨mysql基础知识

    信息技术智库:?『面试知识集锦100篇』3.mysql篇丨mysql基础知识

    作者:[db:作者] 时间:2021-09-13 19:04

    作者:不吃西红柿

    简介:CSDN博客专家、蓝桥签约作者、大数据&Python领域优质创作者。

    谢谢那些曾经击倒我的人,

    躺着可真TM舒服。

    目录

    一、知识体系

    1、关系型数据库术语

    2、事务的基本要素(ACID)

    3、事务的并发问题

    二、面试真题

    1、说一下 mysql 常用的引擎?

    2、Myisam和InnoDB的区别?

    3、B树和B+树的概念和区别?

    4、为什么选择B+树作为索引结构?

    5、B+树的叶子节点都可以存哪些东西?

    6、什么样的信息能成为索引?

    7、批量往mysql导入1000万数据有什么方法?

    8、binlog和redolog有什么区别?


    【系列课程介绍】

    『面试知识集锦』系列课程包括以下20+个章节,超过100+篇文章,每篇文章的前半部分为「知识体系」帮助你打牢基础,后半部分为「面试真题」帮助你拿下面试。

    如果觉得还不错,求点赞、求收藏、关注专栏。

    图片


    一、知识体系

    1、关系型数据库术语

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

    开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语:

    • 数据库:?数据库是一些关联表的集合。
    • 数据表:?表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
    • 列:?一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。
    • 行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
    • 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
    • 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
    • 外键:外键用于关联两个表。
    • 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
    • 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
    • 参照完整性:?参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

    2、事务的基本要素(ACID)

    1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位

    2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。

    3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。

    4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

    3、事务的并发问题

    1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

    2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致

    3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

    小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

    二、面试真题

    1、说一下 mysql 常用的引擎?

    InnoDB 引擎MySQL 5.5之后的默认引擎,InnoDB 引擎提供了对数据库事务的支持,并且还提供了行级锁和外键的约束,它的设计的目标就是处理大数据容量的数据库系统。MySQL 运行的时候,InnoDB 会在内存中建立缓冲池,用于缓冲数据和索引。由于锁的粒度小,写操作是不会锁定全表的,所以在并发度较高的场景下使用会提升效率的。

    MyISAM 引擎:不提供事务的支持,也不支持行级锁和外键。因此当执行插入和更新语句时,即执行写操作的时候需要锁定这个表,所以会导致效率会降低。不过和 InnoDB 不同的是,MyIASM 引擎是保存了表的行数,于是当进行 select count(*) from table 语句时,可以直接的读取已经保存的值而不需要进行扫描全表。所以,如果表的读操作远远多于写操作时,并且不需要事务的支持的,可以将 MyIASM 作为数据库引擎的首选。

    2、MyisamInnoDB的区别?

    对比项

    MyISAM

    InnoDB

    外键

    不支持

    支持

    事务

    不支持

    支持

    行表锁

    表锁,即使操作一条记录也会锁住整个表,不适合高并发的操作

    行锁,操作时只锁某一行,不对其它行有影响,

    适合高并发的操作

    缓存

    只缓存索引,不缓存真实数据

    不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响

    • 是否支持行级锁?: MyISAM 只有表级锁(table-level locking),而InnoDB 支持行级锁(row-level locking)和表级锁,默认为行级锁,适合高并发操作。
    • 是否支持外键 MyISAM不支持,而InnoDB支持
    • 是否支持事务MyISAM不支持,而InnoDB支持
    • 缓存MyISAM只缓存索引,InnoDB缓存索引和真实数据,所以对内存要求高
    • 崩溃恢复MyISAM 崩溃后发生损坏的概率比 InnoDB 高很多,而且恢复的速度也更慢。

    3、B树和B+树的概念和区别?

    1B-树的关键字和记录是放在一起的,叶子节点可以看作外部节点,不包含任何信息;B+树的非叶子节点中只有关键字和指向下一个节点的索引,记录只放在叶子节点中。

    2)在B-树中,越靠近根节点的记录查找时间越快,只要找到关键字即可确定记录的存在;而B+树中每个记录的查找时间基本是一样的,都需要从根节点走到叶子节点,而且在叶子节点中还要再比较关键字。从这个角度看B-树的性能好像要比B+树好,而在实际应用中却是B+树的性能要好些

    4、为什么选择B+树作为索引结构?

    • 因为B+树的非叶子节点不存放实际的数据,这样每个节点可容纳的元素个数比B-树多,树高比B-树小,这样带来的好处是减少磁盘访问次数。尽管B+树找到一个记录所需的比较次数要比B-树多,但是一次磁盘访问的时间相当于成百上千次内存比较的时间,因此实际中B+树的性能可能还会好些。
    • B+树的叶子节点使用指针连接在一起,方便顺序遍历(例如查看一个目录下的所有文件,一个表中的所有记录等)。
    • B+树的查询效率更加稳定,每次查询的效率一样。

    Hash索引底层是哈希表,哈希表是一种以key-value存储数据的结构,所以多个数据在存储关系上是完全没有任何顺序关系的,所以,对于区间查询是无法直接通过索引查询的,就需要全表扫描。所以,哈希索引只适用于等值查询的场景。而B+ 树是一种多路平衡查询树,所以他的节点是天然有序的(左子节点小于父节点、父节点小于右子节点),所以对于范围查询的时候不需要做全表扫描

    • 二叉查找树:解决了排序的基本问题,但是由于无法保证平衡,可能退化为链表。
    • 平衡二叉树:通过旋转解决了平衡的问题,但是旋转操作效率太低。
    • 红黑树:通过舍弃严格的平衡和引入红黑节点,解决了 AVL旋转效率过低的问题,但是在磁盘等场景下,树仍然太高,IO次数太多。

    5、B+树的叶子节点都可以存哪些东西?

    可能存储的是整行数据,也有可能是主键的值

    6、什么样的信息能成为索引?

    主键,唯一键,普通键都可,只要能让数据有一定区分性的字段。

    7、批量往mysql导入1000万数据有什么方法?

    • 减少IO次数
    • SQL写法优化,一条SQL语句插入多条数据
    • 合理设置批量大小
    • 尽量顺序插入, 减少索引的维护压力

    8、binlogredolog有什么区别?

    1. redolog是在InnoDB存储引擎层产生,而binlogMySQL数据库的上层服务层产生的。
    2. 两种日志记录的内容形式不同。MySQLbinlog是逻辑日志,其记录是对应的SQL语句。而innodb存储引擎层面的重做日志是物理日志。
    3. 两种日志与记录写入磁盘的时间点不同,binlog日志只在事务提交完成后进行一次写入。而innodb存储引擎的重做日志在事务进行中不断地被写入,并日志不是随事务提交的顺序进行写入的。
    4. binlog不是循环使用,在写满或者重启之后,会生成新的binlog文件,redolog是循环使用。
    5. binlog可以作为恢复数据使用,主从复制搭建,redolog作为异常宕机或者介质故障后的数据恢复使用。

    好了,本节分享就到这里......点赞、收藏、关注专栏之后,回去等通知吧!

    cs