| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> MySQL 数据库面试题总结(2022版) -> 正文阅读 |
|
[大数据]MySQL 数据库面试题总结(2022版) |
同时,本文还提供思维导图供大家学习补充: 【金山文档】 MySQL数据库 一、基础基本概念MySQL有哪些数据库类型?
有包括 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,分别表示 1 字节、2 字节、3 字节、4 字节、8 字节的整数类型。 1)任何整数类型都可以加上 UNSIGNED 属性,表示无符号整数。 2)任何整数类型都可以指定长度,但它不会限制数据的合法长度,仅仅限制了显示长度。 还有包括 FLOAT、DOUBLE、DECIMAL 在内的小数类型。
包括 VARCHAR、CHAR、TEXT、BLOB。 注意:VARCHAR(n) 和 CHAR(n) 中的 n 并不代表字节个数,而是代表字符的个数。
常用于表示日期和时间类型为 DATETIME、DATE 和 TIMESTAMP。 尽量使用 TIMESTAMP,空间效率高于 DATETIME。 ref MySQL 数据类型 CHAR 和 VARCHAR 区别?首先可以明确的是 CHAR 是定长的,而 VARCHAR 是可以变长。 CHAR 会根据声明的字符串长度分配空间,并会使用空格对字符串右边进行尾部填充。所以在检索 CHAR 类型数据时尾部空格会被删除,如保存的是字符串 'char ',但最后查询到的是 ‘char’。又因为长度固定,所以存储效率高于 VARCHAR 类型。 VARCHAR 在 MySQL 5.0 之后长度支持到 65535 字节,但会在数据开头使用额外 1~2 个字节存储字符串长度(列长度小于 255 字节时使用 1 字节表示,否则 2 字节),在结尾使用 1 字节表示字符串结束。 再者,在存储方式上,CHAR 对英文字符(ASCII)占用 1 字节,对一个汉字使用用 2 字节。而 VARCHAR 对每个字符均使用 2 字节。 虽然 VARCHAR 是根据字符串长度分配存储空间的,但在内存中依旧使用声明长度进行排序等作业,故在使用时仍需综合考量字段长度。 对于经常变更的数据来说,CHAR比VARCHAR更好,因为CHAR不容易产生碎片。 数据库设计什么是三大范式?
除了三大范式外,还有BC范式和第四范式,但其规范过于严苛,在生产中往往使用不到。 什么是范式和反范式,以及各自优缺点?范式是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则。在关系数据库中,这种规则就是范式。
所以在平时工作中,我们通常是将范式和反范式相互结合使用。 二、索引首先了解一下什么是索引,索引是对数据库表中一列或多列的值进行排序的数据结构,用于快速访问数据库表中的特定信息。 索引的几种类型或分类?从物理结构上可以分为聚集索引和非聚集索引两类。
从应用上可以划分为一下几类:
ref:索引的类型分类、区别、优缺点 索引的优缺点?先来说说优点:创建索引可以大大提高系统的性能。 1)通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 既然增加索引有如此多的优点,为什么不对表中的每一个列都创建一个索引呢?这是因为索引也是有缺点的: 1)创建和维护索引需要耗费时间,这种时间随着数据量的增加而增加,这样就降低了数据的维护速度。 2)索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间。如果要建立聚簇索引,那么需要的空间就会更大。 索引设计原则?1)选择唯一性索引 ref:MySQL索引的设计原则 索引的数据结构?索引的数据结构和具体存储引擎的实现有关,MySQL 中常用的是 Hash 和 B+ 树索引。 Hash 索引底层就是 Hash 表,进行查询时调用 Hash 函数获取到相应的键值(对应地址),然后回表查询获得实际数据. B+ 树索引底层实现原理是多路平衡查找树,对于每一次的查询都是从根节点出发,查询到叶子节点方可以获得所查键值,最后查询判断是否需要回表查询. Hash 和 B+ 树索引的区别?Hash 2)Hash 不支持模糊查询以及多列索引的最左前缀匹配,因为 Hash 函数的值不可预测,如 AA 和 AB 的算出的值没有相关性。 3)Hash 任何时候都避免不了回表查询数据. 4)虽然在等值上查询效率高,但性能不稳定,因为当某个键值存在大量重复时,产生 Hash 碰撞,此时查询效率反而可能降低。 B+ Tree 1)B+ 树本质是一棵查找树,自然支持范围查询和排序。 2)在符合某些条件(聚簇索引、覆盖索引等)时候可以只通过索引完成查询,不需要回表。 3)查询效率比较稳定,因为每次查询都是从根节点到叶子节点,且为树的高度。 为何使用 B+ 树而非 B 树做索引?什么是最左匹配原则?顾名思义,最左优先,以最左边为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会停止匹配。 如建立 再比如 最左匹配的原理 上图可以看出 a 是有顺序的(1、1、2、2、3、3),而 b 的值是没有顺序的(1、2、1、4、1、2)。所以 同时我们还可以发现在 a 值相等的情况下(a = 1),b 又是顺序排列的,所以最左匹配原则遇上范围查询就会停止,剩下的字段都无法使用索引。 ref 最左匹配原则 什么是覆盖索引?在 B+ 树的索引中,叶子节点可能存储了当前的键值,也可能存储了当前的键值以及整行的数据,这就是聚簇索引和非聚簇索引。 在 InnoDB 中,只有主键索引是聚簇索引,如果没有主键,则挑选一个唯一键建立聚簇索引。如果没有唯一键,则隐式的生成一个键来建立聚簇索引。 当查询使用聚簇索引时,在对应的叶子节点,可以获取到整行数据,因此不用再次进行回表查询。 什么是索引下推?三、存储存储引擎有哪些常见的存储引擎?MyISAM 和 InnoDB 的区别?1)InnoDB 支持事务,而 MyISAM 不支持。 2)InnoDB 支持外键,而 MyISAM 不支持。因此将一个含有外键的 InnoDB 表 转为 MyISAM 表会失败。 3)InnoDB 和 MyISAM 均支持 B+ Tree 数据结构的索引。但 InnoDB 是聚集索引,而 MyISAM 是非聚集索引。 4)InnoDB 不保存表中数据行数,执行 那为什么 InnoDB 没有使用这样的变量呢?因为InnoDB的事务特性,在同一时刻表中的行数对于不同的事务而言是不一样的。 5)InnoDB 支持表、行(默认)级锁,而 MyISAM 支持表级锁。 InnoDB 的行锁是基于索引实现的,而不是物理行记录上。即访问如果没有命中索引,则也无法使用行锁,将要退化为表锁。 6)InnoDB 必须有唯一索引(如主键),如果没有指定,就会自动寻找或生产一个隐藏列 Row_id 来充当默认主键,而 Myisam 可以没有主键。 InnoDB 的四大特性?
InnoDB 为何推荐使用自增主键?自增 ID 可以保证每次插入时 B+ 树索引是从右边扩展的,因此相比自定义 ID (如 UUID)可以避免 B+ 树的频繁合并和分裂。如果使用字符串主键和随机主键,会使得数据随机插入,效率比较差。 如何选择存储引擎?默认使用 InnoDB,MyISAM 适用以插入为主的程序,比如博客系统、新闻门户。 存储结构四、事务什么是数据库的事务?数据库的事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。 事务的典型应用场景,如转账。 什么是事务的四大特性(ACID)?
ref 事务ACID理解 事务的并发问题?脏读、幻读和不可重复度。 ref 并发事务带来的问题 什么是脏读、幻读和不可重复度?
不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表 ref MySQL的四种事务隔离级别 什么是事务的隔离级别?串行化的隔离级别最高,读未提交的级别最低,级别越高,则执行效率就越低,所以在选择隔离级别时应该结合实际情况。 MySQL 支持以上四种隔离级别,默认为 Repeatable read (可重复读);而 Oracle 只支持 Serializeble(串行化) 级别和 Read committed(读已提交) 两种,其中默认为读已提交。 ref 事务的隔离级别 ACID 特性是如何实现的?分四个维度去理解,如原子性是 undo 日志,持久性是 redo 日志。(PS 日志具体原理在后续章节讲述。) ref ACID特性的实现原理 五、锁数据库锁的作用以及有哪些锁?当数据库有并发事务的时候,可能会产生数据的不一致,这时候需要一些机制来保证访问的次序,锁机制就是这样的一个机制。即锁的作用是解决并发问题。 从锁的粒度划分,可以将锁分为表锁、行锁以及页锁。
行级锁开销大,加锁慢,且会出现死锁。但锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
开销和加锁时间界于表锁和行锁之间,会出现死锁。锁定粒度界于表锁和行锁之间,并发度一般。 从使用性质划分,可以分为共享锁、排它锁以及更新锁。
S 锁并非独占,允许多个并发事务对同一资源加锁,但加 S 锁的同时不允许加 X 锁,即资源不能被修改。S 锁通常读取结束后立即释放,无需等待事务结束。
X 锁仅允许一个事务对同一资源加锁,且直到事务结束才释放,其他任何事务必须等到 X 锁被释放才能对该页进行访问。 使用
当被读取的页将要被更新时,则升级为 X 锁,U 锁一直到事务结束时才能被释放。故 U 锁用来避免使用共享锁造成的死锁现象。 ref 数据库锁分类和总结 从主观上划分,又可以分为乐观锁和悲观锁。
乐观锁适用于多读的应用类型,可以系统提高吞吐量。
隔离级别和锁的关系?1)在 Read Uncommitted 级别下,读取数据不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突; 2)在 Read Committed 级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁; 3)在 Repeatable Read 级别下,读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁; 4)在 SERIALIZABLE 级别下,限制性最强,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成。 InnoDB 中的锁算法?
ref 锁机制与InnoDB锁算法 ####什么是 MVCC 以及原理? MVCC 的英文全称是 Multiversion Concurrency Control,中文意思是多版本并发控制技术。 其原理是通过数据行的多个版本管理来实现数据库的并发控制,简单来说就是保存数据的历史版本。可以通过比较版本号决定数据是否显示出来。读取数据的时候不需要加锁可以保证事务的隔离效果。 ref MVCC 原理 六、进阶功能视图存储过程什么是存储过程?存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需要创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。 存储过程和函数的区别?1)返回值的区别:函数有1个返回值,而存储过程是通过参数返回的,可以有多个或者没有。 2)调用的区别:,函数可以在查询语句中直接调用,而存储过程必须单独调用。 ref 存储过程(procedure)和函数(Function)的区别 触发器七、集群日志MySQL 中有哪些常见日志?
作用是确保事务的持久性。 redo 日志记录事务执行后的状态,用来恢复未写入 data file 的已提交事务数据。
作用是保证数据的原子性。 保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读。
常用于主从同步或数据同步中,也可用于数据库基于时间点的还原。
记录着 MySQL 启动和停止,以及服务器在运行过程中发生的错误的相关信息。在默认情况下,系统记录错误日志的功能是关闭的,错误信息被输出到标准错误输出。
记录了服务器接收到的每一个命令,无论命令语句是否正确,因此会带来不小开销,所以也是默认关闭的。
记录执行时间过长和没有使用索引的查询语句(默认 10s),同时只会记录执行成功的语句。
在从节点中存储接收到的 binlog 日志内容,用于主从同步。 ref MySQL中的几种日志了解 主从复制什么是主从复制?主从复制是用来建立一个与主数据库完全一样的数据库环境,即从数据库。主数据库一般是准实时的业务数据库。 主从复制的作用?
主从复制的实现或原理?ref MySQL主从复制面试之和原理 主从中常见问题以及解决?问题 2)从库只有一个sql Thread,主库写压力大,复制很可能延时。 解决 2)并行复制:从库多线程apply binlog,解决从库复制延迟的问题。 八、SQL语法SQL 是一门 ANSI 标准计算机语言,用来访问和操作数据库系统。通常 SQL 语句可以分为两类:
实践中,还有一种
常见的聚合查询?使用聚合函数的查询就是聚合查询。所有的聚合函数(UDAF)都应该支持分组查询,内置的聚合函数有:
ref SQL 聚合查询 几种关联查询?1) 内连接(自然连接):只返回匹配的行,如 Inner Join、Union Join。 2)外连接:返回一个表的全集,如 Left、Right、Full 和 Cross。 ref SQL多表查询 Where 和 Having 的区别?where 子句的作用是在对查询结果进行分组前,将不符合条件的行去掉,即在分组之前过滤数据,where条件中不能包含聚组函数,使用where条件过滤出特定的行。 having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件过滤出特定的组,也可以使用多个分组标准进行分组。 总结一下条件的过滤顺序: SQL 关键字的执行顺序?ref SQL的执行顺序 In 和 Exists 的区别?in 适合内表比外表数据小的情况,exists 适合内表比外表数据大的情况。如果查询的内外表大小相当,则二者效率差别不大。 Union 和 Union All 的区别?
Union 因为要进行重复值扫描,所以效率低。如果合并没有刻意要删除重复行,那么就使用Union All。 Drop、Delete 和 Truncate 的区别?虽然通过 delete、truncate、drop 这三个关键字都可以用来删除数据,但场景不同。 从执行速度上讲:
ref delete、truncate、drop的区别有哪些,该如何选择 优化一条 SQL 是如何执行的?ref sql执行过程 如何判断 SQL 是否走了索引?EXPLAIN 命令是查看查询优化器如何决定执行查询的主要方法,使用 EXPLAIN 只需在查询语句开头增加 EXPLAIN 这个关键字即。 其结果中的几个重要参数:
ID 代表执行 select 子句或操作表的顺序,如果包含子查询,则会出现多个 ID。值越大,优先级越高,越先被执行。值相同的按照由上至下的顺序执行。
查询类型主要用于区别普通查询、联合查询以及子查询等复杂查询。
查询扫描情况,最好到最差依次是:
显示可能应用在这张表中的索引,一个或多个。查询到的索引不一定是真正被使用。
实际使用的索引,如果为 null 则表示没有使用索引。因此会出现 possible_keys 列有可能被用到的索引,但是 key 列为 null。
表示索引中使用的字节数,在不损失精确性的情况下长度越短越好。key_len 显示的值为索引字段的最大可能长度,并非实际使用长度。即 key_len 是根据表定义计算而来。
显示索引的哪一列被使用了,如果可能的话是一个常数,哪些列或常量被用于查找索引列上的值。
根据表统计信息及索引选用情况,估算出找到所需的记录所需要读取的行数。
索引失效的几种情况?1)like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效; 2)or 语句前后没有同时使用索引。当 or 左右查询字段只有一个是索引,该索引失效,只有左右查询字段均为索引时,才会生效; 3)联合索引不使用第一列,索引失效; 4)数据类型出现隐式转化。如 varchar 不加单引号的话可能会自动转换为 int 型,使索引无效,产生全表扫描; 5)在索引列上使用 IS NULL 或 IS NOT NULL操作。最好给列设置默认值。 6)在索引字段上使用not,<>,!=。不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 优化方法: key<>0 改为 key>0 or key<0。 7)对索引字段进行计算操作、字段上使用函数。 8)当 MySQL 觉得全表扫描更快时(数据少); ref Mysql索引查询失效的情况 Where 子句如何优化?超大分页或深度分页如何处理?说道 MySQL 的分页,我们首先想到的就是 这是由于 MySQL 并不是跳过 offset 的行数,而是取 offset + limit 行,然后丢弃前 offset 行,返回 limit 行,当offset特别大的时候,效率就非常的低下。 此处我们就可以采用覆盖索引+延迟关联技术来减少偏移量的定位进行优化:
大表查询如何优化?可以从分库分表、读写分离以及缓存三个维度分别阐述。 实践几种常见名次问题ref MySQL排名函数实现 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 14:09:26- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |