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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 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的开发者是必须要掌握的知识。做到不仅仅知其然还要知其所以然。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
存储 SQL 关系型数据库
MySQL进阶突击系列(03) MySQL架构原理solo九魂17环连问 | 给大厂面试官的一封信
本文介绍了MySQL架构原理、存储引擎和索引的相关知识点,涵盖查询和更新SQL的执行过程、MySQL各组件的作用、存储引擎的类型及特性、索引的建立和使用原则,以及二叉树、平衡二叉树和B树的区别。通过这些内容,帮助读者深入了解MySQL的工作机制,提高数据库管理和优化能力。
|
3月前
|
存储 关系型数据库 MySQL
美团面试:MySQL为什么 不用 Docker部署?
45岁老架构师尼恩在读者交流群中分享了关于“MySQL为什么不推荐使用Docker部署”的深入分析。通过系统化的梳理,尼恩帮助读者理解为何大型MySQL数据库通常不使用Docker部署,主要涉及性能、管理复杂度和稳定性等方面的考量。文章详细解释了有状态容器的特点、Docker的资源隔离问题以及磁盘IO性能损耗,并提供了小型MySQL使用Docker的最佳实践。此外,尼恩还介绍了Share Nothing架构的优势及其应用场景,强调了配置管理和数据持久化的挑战。最后,尼恩建议读者参考《尼恩Java面试宝典PDF》以提升技术能力,更好地应对面试中的难题。
|
5月前
|
SQL 关系型数据库 MySQL
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
MySQL慢查询优化、索引优化,是必知必备,大厂面试高频,本文深入详解,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
|
22天前
|
消息中间件 NoSQL 关系型数据库
去哪面试:1Wtps高并发,MySQL 热点行 问题, 怎么解决?
去哪面试:1Wtps高并发,MySQL 热点行 问题, 怎么解决?
去哪面试:1Wtps高并发,MySQL 热点行 问题, 怎么解决?
|
6月前
|
存储 关系型数据库 MySQL
阿里面试:为什么要索引?什么是MySQL索引?底层结构是什么?
尼恩是一位资深架构师,他在自己的读者交流群中分享了关于MySQL索引的重要知识点。索引是帮助MySQL高效获取数据的数据结构,主要作用包括显著提升查询速度、降低磁盘I/O次数、优化排序与分组操作以及提升复杂查询的性能。MySQL支持多种索引类型,如主键索引、唯一索引、普通索引、全文索引和空间数据索引。索引的底层数据结构主要是B+树,它能够有效支持范围查询和顺序遍历,同时保持高效的插入、删除和查找性能。尼恩还强调了索引的优缺点,并提供了多个面试题及其解答,帮助读者在面试中脱颖而出。相关资料可在公众号【技术自由圈】获取。
|
2月前
|
SQL 关系型数据库 MySQL
京东面试:MySQL MVCC是如何实现的?如何通过MVCC实现读已提交、可重复读隔离级别的?
1.请解释什么是MVCC,它在数据库中的作用是什么? 2.在MySQL中,MVCC是如何实现的?请简述其工作原理。 3.MVCC是如何解决读-写和写-写冲突的? 4.在并发环境中,当多个事务同时读取同一行数据时,MVCC是如何保证每个事务看到的数据版本是一致的? 5.MVCC如何帮助提高数据库的并发性能?
京东面试:MySQL MVCC是如何实现的?如何通过MVCC实现读已提交、可重复读隔离级别的?
|
3月前
|
存储 SQL 关系型数据库
MySQL 面试题
MySQL 的一些基础面试题
|
5月前
|
SQL 缓存 关系型数据库
美团面试:Mysql 有几级缓存? 每一级缓存,具体是什么?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴因未能系统梳理MySQL缓存机制而在美团面试中失利。为此,尼恩对MySQL的缓存机制进行了系统化梳理,包括一级缓存(InnoDB缓存)和二级缓存(查询缓存)。同时,他还将这些知识点整理进《尼恩Java面试宝典PDF》V175版本,帮助大家提升技术水平,顺利通过面试。更多技术资料请关注公号【技术自由圈】。
美团面试:Mysql 有几级缓存? 每一级缓存,具体是什么?
|
5月前
|
SQL 算法 关系型数据库
面试:什么是死锁,如何避免或解决死锁;MySQL中的死锁现象,MySQL死锁如何解决
面试:什么是死锁,死锁产生的四个必要条件,如何避免或解决死锁;数据库锁,锁分类,控制事务;MySQL中的死锁现象,MySQL死锁如何解决
|
5月前
|
SQL 关系型数据库 MySQL
美团面试:Mysql如何选择最优 执行计划,为什么?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴面试美团时遇到了关于MySQL执行计划的面试题:“MySQL如何选择最优执行计划,为什么?”由于缺乏系统化的准备,小伙伴未能给出满意的答案,面试失败。为此,尼恩为大家系统化地梳理了MySQL执行计划的相关知识,帮助大家提升技术水平,展示“技术肌肉”,让面试官“爱到不能自已”。相关内容已收录进《尼恩Java面试宝典PDF》V175版本,供大家参考学习。

热门文章

最新文章