听说面试官喜欢问这些MySQL知识

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS(Relational Database Management System,关系数据库管理系统) 应用软件之一。

01前言


MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS(Relational Database Management System,关系数据库管理系统) 应用软件之一。

MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其开放源码这一特点,一般中小型和大型网站的开发都选择 MySQL 作为网站数据库。

除了基本的学会使用MySQL的技巧以外,MySQL的这些基础知识也是必须要掌握的,尤其是在面试的时候,面试官经常会问到。

02MySQL的并发控制


我们平常说的并发控制通常是指系统代码层面的并发控制,但是在数据库层面也有着并发控制的概念,这个并发是读与写的并发控制,共享锁和排它锁,分别称为:读锁和写锁。还有表锁和行锁,如下:读锁:是共享的,线程互不阻塞的,多个客户同时访问读取同一个资源,互不干扰。
写锁:是排他的,一个写锁会阻塞其他的写锁和读锁。表锁:锁定整张表,一个用户在对表进行写操作时,会先获得写锁,阻塞其他用户对该表的所有读和写操作。仅当没有写锁时,其他用户才能获得读锁,读锁之间是互不阻塞的。行级锁:行级锁可以最大程度的支持并发处理(同时锁开销也最大),InnoDB和XtraDB以及一些存储引擎中,实现了行级锁。

通常我们系统中用大部分都是用行级锁即可解决常见的问题了,更高级别的并发控制问题,还是需要在系统代码层面来控制。

03数据库的事务


事务是一组原子性的SQL查询,或者说一个独立的工作单元。如果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么就执行该组查询。如果其中有任何一条语句因为崩溃或者其他原因无法执行,那么所有的语句都不会执行。简单说就是,事务内的语句,要么全部执行成功,要么全部执行失败。

数据库的事务包含有4个基本特征:ACID原子性、一致性、隔离性和持久性。

原子性:表示一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,不可能只执行其中一部分。

一致性:数据库总是从一个一致性的状态转换到另外 一个一致性的状态。

隔离性:一个事务所做的修改在最终提交以前,对其他事务是不可见的。

持久性:一旦事务提交,则其所做的修改就会永久保存到数据库中。

举个简单例子:银行的数据库有2张表,支票表和储蓄表,现在用户要从支票账户转200元到她的储蓄账户,那么至少需要三个步骤:

1、检查支票账户的余额高于200元

2、从支票账户余额中减去200元

3、在储蓄账户余额中增加200元

上述三个步骤的操作必须打包在一个事务中,任何一个步骤失败,则必须回滚所有步骤。

事务SQL样本如下:

6cb5e11760c0c742a3810b897afb5ebe_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

试想,如果执行到第四条语句时,服务器崩溃了,会发生什么?用户可能会损失200元;再假如,执行到第三条语句和第四条语句之间时,另外一个进程要删除支票账户的所有余额,那么结果可能就是银行在不知道这个逻辑的前提下,白白给了用户200元。因此一个运行良好的系统,必须具有事务的这四个特征:原子性、一致性、隔离性、持久性。

04隔离级别


隔离性其实比想象的要复杂,SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的。较低级别的隔离通常可以执行更高的并发,系统的开销也更低。

读未提交(READ UNCOMMITTED)在读未提交级别,事务中的修改,即使没有提交,对其他事务也都是可见的。也就是说一个用户可以读取另一个用户还未提交的事务处理数据,也称为“脏读”。

读提交(READ COMMITTED):除了mysql,其他数据库大多数的默认隔离级别为读提交。这个级别的隔离性解决了前面的脏读,也就是说一个事务只能等到前面事务提交了修改等操作,才能看到修改后的数据。这个级别也叫做不可重复读吗,即两次执行相同的查询,可能出现不一样的结果(因为后一次读取时事务提交了)。

可重复读(REPEATABLE READ):REPEATABLE READ解决了脏读的问题,保证在同一个事务中多次读取同样记录的结果是一致的。理论上,可重复读还是无法解决另一个幻读的问题,幻读是指当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,之前的事务再次读取时会产生幻行的现象。

可串行化(SERIALIZABLE):SERIALIZABLE是最高的隔离级别。通过强制事务串行执行,避免了幻读问题。它会在读取的每一行数据上都加锁,可能导致大量的超时和锁争用的问题。实际应用很少用到,仅在非常需要确保数据的一致性而且可以接受无并发的情况下,才考虑使用。

308bc0a6bef0eb4083282bc3413e6ab3_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


05死锁


死锁是指两个或者多个事务在同一资源上互相占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。多个事务试图以不同的顺序锁定资源时,就可能会产生死锁。多个事务同时锁定同一个资源时,也会产生死锁。例如,设想下面两个事务同时处理StockPrice表:

9b3ed8d286c217ad79fe772d421d018a_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

如果凑巧,两个事务都执行了第一条update语句,更新了一行数据,同时也锁定了该行数据,接着每个事务都尝试去执行第二条update语句,却发现该行记录已经被对方锁定,然后两个事务都等待对方释放锁,同时又持有对方需要的锁,则陷入死循环。需要外部因素介入才能解除死锁。InnoDB有死锁检测和死锁超时机制,当检测到死锁的循环依赖时,会立即返回一个错误,另一种方式是,当查询的时间达到锁等待超时的设定之后,放弃锁请求。InnoDB目前处理死锁的方法是,将持有的最少行级排他锁的事务进行回滚。


06存储引擎


存储引擎也是很多公司面试喜欢问到的一个知识点,在实际工作中其实很少用到或涉及到这一块的知识概念,但是学习和掌握存储引擎的知识是必要的,因为当数据库一旦出现这方面的问题,如果你掌握这方面的知识,解决起来就如鱼得水非常简单了。

命令show table status可以查询数据库某个表的信息:

cb0a15866518c7be7c30c3da17084274_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

8f305e2d2275c224367d478275e694df_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

61f903c3ac5f6eea1771bfa6cb0092fd_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

6.1  InnoDB存储引擎

InnoDB是MySQL的默认事务型引擎,也是最重要、使用最广泛的存储引擎。被设计用来处理大量的短期事务,短期事务大部分情况是正常提交的,很少被回滚。支持了事务的四个级别,默认是可重复读REAPATABLE READ 加上间隙锁策略防止幻读的出现。

InnoDB表是基于聚族索引建立,聚族索引对主键的查询有很高的性能,二级索引必须包含主键列,如果主键列很大其他的索引都会很大。

InnoDB从磁盘读取数据时采用可预测性读,自动在内存中创建hash索引以加速读操作的自适应哈希索引,可加速插入操作的插入缓冲区等。

InnoDB通过一些机制和工具支持热备份。

6.2 MyISAM存储引擎

mysql5.1之前默认的存储引擎是MyISAM,它提供了大量的特性,包括:全文索引、压缩、空间函数等,不支持事务和行级锁,崩溃后无法安全恢复。对于只读的数据,表比较小、可以忍受修复等操作,依然还可以继续使用MyISAM。

存储:MyISAM将表存储在两个文件中,即数据文件和索引文件,分别以.MYD 和.MYI为扩展名,可包含动态和静态行,根据表的定义来决定采取哪种格式。受限于磁盘空间,或者系统中单个文件的最大尺寸。

特性:加锁和并发,对整张表加锁,读取时对读到的所有表加共享锁,写入时则对表加排他锁。

修复:对于MySQL的MyISAM表,可手工或自动执行检查和修复操作,执行修复可能会导致数据丢失,修复操作很慢。

索引特性:BLOB和TEXT等长字段,可以基于500个字符创建索引,支持全文索引,支持复杂查询。

延迟更新索引键:每次修改完,不会立即将修改的索引数据写入磁盘,而是会写到内存中的键缓冲区,清理缓冲区或者关闭表的时候,才会将对应的索引快写入到磁盘。

MyISAM最典型的问题是表锁,查询到长期处于“Locked”状态时,大概率是表锁引起。

6.3 其他索引

除了innoDB 和MyISAM,还有诸如:ARchive引擎只支持select和insert操作;blackhole引擎没有任何存储机制,会丢失插入的数据,不做任何保存,服务器记录日志;CSV引擎处理普通的CSV文件,不支持索引;Fedrated引擎访问其他mysql服务器的代理,创建远程mysql服务器的客户端连接,将查询传输到远程服务器执行,提取或发送需要的数据;memory引擎快速访问不被修改的数据,重启以后丢失也没关系时,使用memory表很合适,它比MyISAM快一个数量级,在内存中操作,不需要进行磁盘I/O,重启后表结构还在,数据丢失了。

942ff6b7915f8911eb723320e5734281_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

merge引擎是MyISAM的一个变种,由多个MyISAM合并而来的虚拟表;NDB引擎等,还有第三方引擎OLTP引擎、面向列的存储引擎、社区存储引擎。

在实际的业务场景里面,选择合适的存储引擎是有必要的。开发者应该结合数据库和实际业务需求来制定一套存储引擎策略。

07写在最后


以上介绍了MySQL数据库的一些常见的基本知识,包含了简介、并发控制、数据库事务、隔离级别、死锁、存储引擎其中后面五项都是非常基本的原理和知识,作为使用和MySQL的开发者是必须要掌握的知识。做到不仅仅知其然还要知其所以然。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
10天前
|
SQL 关系型数据库 MySQL
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
MySQL慢查询优化、索引优化,是必知必备,大厂面试高频,本文深入详解,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
|
1月前
|
存储 关系型数据库 MySQL
阿里面试:为什么要索引?什么是MySQL索引?底层结构是什么?
尼恩是一位资深架构师,他在自己的读者交流群中分享了关于MySQL索引的重要知识点。索引是帮助MySQL高效获取数据的数据结构,主要作用包括显著提升查询速度、降低磁盘I/O次数、优化排序与分组操作以及提升复杂查询的性能。MySQL支持多种索引类型,如主键索引、唯一索引、普通索引、全文索引和空间数据索引。索引的底层数据结构主要是B+树,它能够有效支持范围查询和顺序遍历,同时保持高效的插入、删除和查找性能。尼恩还强调了索引的优缺点,并提供了多个面试题及其解答,帮助读者在面试中脱颖而出。相关资料可在公众号【技术自由圈】获取。
|
25天前
|
SQL 缓存 关系型数据库
美团面试:Mysql 有几级缓存? 每一级缓存,具体是什么?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴因未能系统梳理MySQL缓存机制而在美团面试中失利。为此,尼恩对MySQL的缓存机制进行了系统化梳理,包括一级缓存(InnoDB缓存)和二级缓存(查询缓存)。同时,他还将这些知识点整理进《尼恩Java面试宝典PDF》V175版本,帮助大家提升技术水平,顺利通过面试。更多技术资料请关注公号【技术自由圈】。
美团面试:Mysql 有几级缓存? 每一级缓存,具体是什么?
|
19天前
|
SQL 算法 关系型数据库
面试:什么是死锁,如何避免或解决死锁;MySQL中的死锁现象,MySQL死锁如何解决
面试:什么是死锁,死锁产生的四个必要条件,如何避免或解决死锁;数据库锁,锁分类,控制事务;MySQL中的死锁现象,MySQL死锁如何解决
|
26天前
|
SQL 关系型数据库 MySQL
美团面试:Mysql如何选择最优 执行计划,为什么?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴面试美团时遇到了关于MySQL执行计划的面试题:“MySQL如何选择最优执行计划,为什么?”由于缺乏系统化的准备,小伙伴未能给出满意的答案,面试失败。为此,尼恩为大家系统化地梳理了MySQL执行计划的相关知识,帮助大家提升技术水平,展示“技术肌肉”,让面试官“爱到不能自已”。相关内容已收录进《尼恩Java面试宝典PDF》V175版本,供大家参考学习。
|
1月前
|
SQL 关系型数据库 MySQL
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
尼恩,一位40岁的资深架构师,通过其丰富的经验和深厚的技術功底,为众多读者提供了宝贵的面试指导和技术分享。在他的读者交流群中,许多小伙伴获得了来自一线互联网企业的面试机会,并成功应对了诸如事务ACID特性实现、MVCC等相关面试题。尼恩特别整理了这些常见面试题的系统化解答,形成了《MVCC 学习圣经:一次穿透MYSQL MVCC》PDF文档,旨在帮助大家在面试中展示出扎实的技术功底,提高面试成功率。此外,他还编写了《尼恩Java面试宝典》等资料,涵盖了大量面试题和答案,帮助读者全面提升技术面试的表现。这些资料不仅内容详实,而且持续更新,是求职者备战技术面试的宝贵资源。
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
|
1月前
|
SQL 关系型数据库 MySQL
京东面试:什么情况下 mysql RR不能解决幻读? RR隔离mysql如何实现?
老架构师尼恩在其读者交流群中分享了关于MySQL事务隔离级别的深入解析,特别针对RR级隔离如何解决幻读问题进行了详细讨论。文章不仅解释了ACID中的隔离性概念,还列举了四种事务隔离级别(未提交读、提交读、可重复读、串行读)的特点及应用场景。尼恩通过具体的例子和图表,清晰地展示了不同隔离级别下的并发事务问题(脏读、不可重复读、幻读)及其解决方案,特别是RR级隔离下的MVCC机制如何通过快照读和当前读来防止幻读。此外,尼恩还提供了相关面试题的解答技巧和参考资料,帮助读者更好地准备技术面试。更多详细内容和实战案例可在《尼恩Java面试宝典》中找到。
|
1月前
|
SQL 安全 关系型数据库
MySQL 增删操作面试题
MySQL 增删操作面试题
124 1
|
1月前
|
SQL 关系型数据库 MySQL
美团面试:mysql 索引失效?怎么解决? (重点知识,建议收藏,读10遍+)
本文详细解析了MySQL索引失效的多种场景及解决方法,包括破坏最左匹配原则、索引覆盖原则、前缀匹配原则、`ORDER BY`排序不当、`OR`关键字使用不当、索引列上有计算或函数、使用`NOT IN`和`NOT EXISTS`不当、列的比对等。通过实例演示和`EXPLAIN`命令分析,帮助读者深入理解索引失效的原因,并提供相应的优化建议。文章还推荐了《尼恩Java面试宝典》等资源,助力面试者提升技术水平,顺利通过面试。
|
1月前
|
存储 关系型数据库 MySQL
面试官:MySQL一次到底插入多少条数据合适啊?
本文探讨了数据库插入操作的基础知识、批量插入的优势与挑战,以及如何确定合适的插入数据量。通过面试对话的形式,详细解析了单条插入与批量插入的区别,磁盘I/O、内存使用、事务大小和锁策略等关键因素。最后,结合MyBatis框架,提供了实际应用中的批量插入策略和优化建议。希望读者不仅能掌握技术细节,还能理解背后的原理,从而更好地优化数据库性能。
下一篇
无影云桌面