共计 3723 个字符,预计需要花费 10 分钟才能阅读完成。
前言
MySQL 在面试中常常被问到,本文总结了面试中的经典问题。
1. 数据库三大范式是什么?
第一范式:每个列都不能够再拆分。
第二范式:在第一范式的根底上,非主键列齐全依赖于主键,而不能是依赖于主键的一部分。
第三范式:在第二范式的根底上,非主键列只依赖于主键,不依赖于其余非主键。
在设计数据库构造的时候,要尽量恪守三范式,如果不恪守,必须有足够的理由。
比方性能。事实上咱们常常会为了性能而斗争数据库的设计。
2. mysql 无关权限的表都有哪几个?
MySQL 服务器通过权限表来管制用户对数据库的拜访,权限表寄存在 mysql 数据库里,由 mysql\_install\_db 脚本初始化。
这些权限表别离 user,db,table\_priv,columns\_priv 和 host。
user 权限表:记录容许连贯到服务器的用户帐号信息,外面的权限是全局级的。
db 权限表:记录各个帐号在各个数据库上的操作权限。
table\_priv 权限表:记录数据表级的操作权限。
columns\_priv 权限表:记录数据列级的操作权限。
host 权限表:配合 db 权限表对给定主机上数据库级操作权限作更粗疏的管制。这个权限表不受 GRANT 和 REVOKE 语句的影响。
3. 事务的四大个性 (ACID) 介绍一下?
原子性:事务是最小的执行单位,不容许宰割。
事务的原子性确保动作要么全副实现,要么齐全不起作用;
一致性:执行事务前后,数据保持一致,多个事务对同一个数据读取的后果是雷同的;
隔离性:并发拜访数据库时,一个用户的事务不被其余事务所烦扰,
各并发事务之间数据库是独立的;
持久性:一个事务被提交之后。它对数据库中数据的扭转是长久的,即便数据库产生故障也不应该对其有任何影响。
4. SQL 语句次要分为哪几类?
数据定义语言 DDL(Data Ddefinition Language)CREATE,DROP,ALTER
次要为以上操作 即对逻辑构造等有操作的,其中包含表构造,视图和索引。
数据查询语言 DQL(Data Query Language)SELECT
这个较为好了解 即查问操作,以 select 关键字。
各种简略查问,连贯查问等 都属于 DQL。
数据操纵语言 DML(Data Manipulation Language)INSERT,UPDATE,DELETE
次要为以上操作 即对数据进行操作的,
对应下面所说的查问操作 DQL 与 DML 独特构建了少数高级程序员罕用的增删改查操作。
而查问是较为非凡的一种 被划分到 DQL 中。
数据管制性能 DCL(Data Control Language)GRANT,REVOKE,COMMIT,ROLLBACK
次要为以上操作 即对数据库安全性完整性等有操作的,能够简略的了解为权限管制等。
5. MySQL 分库分表的目标是?
分库分表就是为了 解决因为数据量过大而导致数据库性能升高的问题,将原来独立的数据库拆分成若干数据库组成,将数据大表拆分成若干数据表组成,使得繁多数据库、繁多数据表的数据质变小,从而达到晋升数据库性能的目标。
分库分表罕用的中间件如下:
6. 什么是死锁?怎么解决?
死锁是指两个或多个事务在同一资源上互相占用,并申请锁定对方的资源,从而导致恶性循环的景象。
常见的解决死锁的办法
- 如果不同程序会并发存取多个表,尽量约定以雷同的程序拜访表,能够大大降低死锁机会。
- 在同一个事务中,尽可能做到一次锁定所须要的所有资源,缩小死锁产生概率;
- 对于非常容易产生死锁的业务局部,能够尝试应用降级锁定颗粒度,通过表级锁定来缩小死锁产生的概率;
如果业务解决不好能够用分布式事务锁或者应用乐观锁
7. 什么是脏读?幻读?不可反复读?
脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,因为某些起因,前一个 RollBack 了操作,则后一个事务所读取的数据就会是不正确的。
不可反复读(Non-repeatable read): 在一个事务的两次查问之中数据不统一,这可能是两次查问过程两头插入了一个事务更新的原有的数据。
幻读 (Phantom Read): 在一个事务的两次查问中数据笔数不统一,例如有一个事务查问了几列(Row) 数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查问中,就会发现有几列数据是它先前所没有的。
8. 视图有哪些特点?
视图的特点如下: 视图的列能够来自不同的表,是表的形象和在逻辑意义上建设的新关系。
视图是由根本表 (实表) 产生的表(虚表)。视图的建设和删除不影响根本表。
对视图内容的更新 (增加,删除和批改) 间接影响根本表。
当视图来自多个根本表时,不容许增加和删除数据。
视图的操作包含创立视图,查看视图,删除视图和批改视图。
9. SQL 的生命周期?
- 应用服务器与数据库服务器建设一个连贯
- 数据库过程拿到申请 sql
- 解析并生成执行打算,执行
- 读取数据到内存并进行逻辑解决
- 通过步骤一的连贯,发送后果到客户端
- 关掉连贯,开释资源
10. 主键应用自增 ID 还是 UUID?
举荐应用自增 ID,不要应用 UUID。
因为在 InnoDB 存储引擎中,主键索引是作为聚簇索引存在的,也就是说,主键索引的 B + 树叶子节点上存储了主键索引以及全副的数据(依照程序),如果主键索引是自增 ID,那么只须要一直向后排列即可,如果是 UUID,因为到来的 ID 与原来的大小不确定,会造成十分多的数据插入,数据挪动,而后导致产生很多的内存碎片,进而造成插入性能的降落。
总之,在数据量大一些的状况下,用自增主键性能会好一些。
对于主键是聚簇索引,如果没有主键,InnoDB 会抉择一个惟一键来作为聚簇索引,如果没有惟一键,会生成一个隐式的主键。
11. MySQL 数据库 cpu 飙升到 100% 的话怎么解决?
当 cpu 飙升到 100% 时,先用操作系统命令 top 命令察看是不是 mysqld 占用导致的。
如果不是,找出占用高的过程,并进行相干解决。
如果是 mysqld 造成的,show processlist,看看外面跑的 session 状况,是不是有耗费资源的 sql 在运行。找出耗费高的 sql,看看执行打算是否精确,index 是否缺失,或者切实是数据量太大造成。
一般来说,必定要 kill 掉这些线程 (同时察看 cpu 使用率是否降落),等进行相应的调整(比如说加索引、改 sql、改内存参数) 之后,再从新跑这些 SQL。
也有可能是每个 sql 耗费资源并不多,然而忽然之间,有大量的 session 连进来导致 cpu 飙升,这种状况就须要跟利用一起来剖析为何连接数会激增,再做出相应的调整,比如说限度连接数等。
12. MySQL 主从复制解决了哪些问题?
主从复制的作用是:
主数据库呈现问题,能够切换到从数据库。能够进行数据库层面的读写拆散。能够在从数据库上进行日常备份。
数据分布:随便开始或进行复制,并在不同地理位置散布数据备份
负载平衡:升高单个服务器的压力
高可用和故障切换:帮忙应用程序防止单点失败
降级测试:能够用更高版本的 MySQL 作为从库
13. 什么是 MySQL 的 GTID?
TID(Global Transaction ID,全局事务 ID)是全局事务标识符,是一个已提交事务的编号,并且是一个全局惟一的编号。
GTID 是从 MySQL 5.6 版本开始在主从复制方面推出的重量级个性。
GTID 实际上是由 UUID+TID 组成的。其中 UUID 是一个 MySQL 实例的惟一标识。
GTID 代表了该实例上曾经提交的事务数量,并且随着事务提交枯燥递增。
GTID 有如下几点作用:
- 依据 GTID 能够晓得事务最后是在哪个实例上提交的。
- GTID 的存在不便了 Replication 的 Failover。因为不必像传统模式复制那样去找 master\_log\_file 和 master\_log\_pos。
- 基于 GTID 搭建主从复制更加简略,确保每个事务只会被执行一次。
14. MySQL 罕用的备份工具有哪些?
罕用备份工具 mysql 复制
逻辑备份(mysqldump,mydumper)
物理备份(copy,xtrabackup)
备份工具差别比照:
- mysql 复制绝对于其余的备份来说,失去的备份数据比拟实时。
- 逻辑备份:分表比拟容易。mysqldump 备份数据时是将所有 sql 语句整合在同一个文件中;mydumper 备份数据时是将 SQL 语句依照表拆分成单个的 sql 文件,每个 sql 文件对应一个残缺的表。
- 物理备份:拷贝即可用,速度快。
copy: 间接拷贝文件到数据目录下,可能引起表损坏或者数据不统一。
xtrabackup 对于 innodb 表是不须要锁表的,对于 myisam 表依然须要锁表。
15. MySQL 备份打算如何制订
视库的大小来定,一般来说 100G 内的库,能够思考应用 mysqldump 来做,因为 mysqldump 更加笨重灵便,备份工夫选在业务低峰期,能够每天进行都进行全量备份(mysqldump 备份进去的文件比拟小,压缩之后更小)。
100G 以上的库,能够思考用 xtranbackup 来做,备份速度显著要比 mysqldump 要快。
个别是抉择一周一个全备,其余每天进行增量备份,备份工夫为业务低峰期。
文章中呈现的对于面试题的谬误请在评论区指出,我再进行改过优化。如果文章对你有所帮忙,请给团长一个收费的赞吧,感激大家。