简单说⼏个MySQL⾼频⾯试题
前⾔:
在各类技术岗位⾯试中,似乎 MySQL 相关问题经常被问到。⽆论你⾯试开发岗位或运维岗位,总会问⼏道数据库问题。经常有⼩伙伴私信我,询问如何应对 MySQL ⾯试题。其实很多⾯试题都是⼤同⼩异的,提前做准备还是很有必要的。本篇⽂章简单说下⼏个常见的⾯试题,⼀起来学习下吧。
1.什么是关系型数据库?谈谈你对 MySQL 的认识。
这是⼀道基础题,考察⾯试者对数据库的了解程度,⼀般可以简单讲下⾃⼰的认知,有条理即可。⽐如:
关系型数据库是指采⽤了关系模型来组织数据的数据库,其以⾏和列的形式存储数据。关系型数据库最⼤的特点是⽀持事务。常见的关系型数据库有 MySQL、Oracle、SQLServer 等。MySQL 是当下最流⾏的开源数据库。由于其体积⼩、速度快、总体拥有成本低,尤其是开放源码这⼀特点,使得很多公司都采⽤ MySQL 数据库以降低成本,⽬前被⼴泛地应⽤在 Internet 上的中⼩型⽹站中,尤其适⽤于 OLTP 领域。
2.MySQL 常见的存储引擎有哪些,有什么区别?
这个问题也经常被问到,和『InnoDB 与 MyISAM 引擎的区别』问题相似。
常见的⼏种存储引擎:
InnoDB: MySQL 默认的存储引擎,⽀持事务、MVCC、外键、⾏级锁和⾃增列。
MyISAM: ⽀持全⽂索引、压缩、空间函数、表级锁,不⽀持事务,插⼊速度快。
Memory: 数据都在内存中,数据的处理速度快,但是安全性不⾼。
ARCHIVE: 常⽤于历史归档表,占⽤空间⼩,数据不能更新删除。
InnoDB 与 MyISAM 引擎的⼏点区别:
pencil怎么读InnoDB ⽀持事务,MyISAM 不⽀持事务。
InnoDB ⽀持外键,⽽ MyISAM 不⽀持。
InnoDB 不⽀持全⽂索引,⽽ MyISAM ⽀持。
InnoDB 是聚簇索引,MyISAM 是⾮聚簇索引。
InnoDB 不保存表的具体⾏数,⽽ MyISAM ⽤⼀个变量保存了整个表的⾏数。
InnoDB 最⼩的锁粒度是⾏锁,MyISAM 最⼩的锁粒度是表锁。
存储结构不同,MyISAM 表分为 frm MYD MYI 三个,InnoDB ⼀般分为 frm ibd 两个。jre和jdk的区别
3.描述下 MySQL 基础架构。
这个问题考察⾯试者对 MySQL 架构的了解,和『⼀条 select 语句执⾏流程』问题相似。
MySQL的逻辑架构图(来源:《MySQL实战45讲》)
MySQL的逻辑架构主要分为3层:
1. 第⼀层:对客户端的连接处理、安全认证、授权等,每个客户端连接都会在服务端拥有⼀个线程,每个连接发起的查询都会在对应的
单独线程中执⾏。
2. 第⼆层:MySQL的核⼼服务功能层,包括查询解析、分析、查询缓存、内置函数、存储过程、触发器、视图等,select操作会先检查
是否命中查询缓存,命中则直接返回缓存数据,否则解析查询并创建对应的解析树。
3. 第三层:存储引擎,负责数据的存储和提取,MySQL服务器通过API与存储引擎通信,屏蔽了各种引擎之间的差异,常见的存储引擎
有:InnoDB、MyISAM。
⼀条 select 语句执⾏流程:
客户端通过连接器与 MySQL 服务器建⽴连接,并获取了⽤户的读写权限,然后提交查询语句。
⾸先 MySQL 会在查询缓存中对提交的语句进⾏查询,如果命中且⽤户对表有操作权限,会直接返回查询缓存中查询结果作为本次查询的结果,查询到此结束。
如果查询缓存未命中,会来到分析器,分析器会解析语句并检查其合法性。如果语句不符合 MySQL 的语法规范,执⾏器会报错,查询到此结束。
若语句合法,会来到优化器,优化器会为 SQL 语句选择最优的执⾏计划。
最后来到执⾏器,如果⽤户对表有操作权限,执⾏器会调⽤存储引擎提供的接⼝来执⾏ SQL 语句,然后将查询结果返回给客户端,查询到此结束。
4.说说常⽤的⼏种字段类型。
这个问题考察⾯试者对 MySQL 字段类型的了解程度,可以延伸出很多⼩问题,例如 char 与 varchar 的区别。
常⽤的字段类型分类:
数值型:
字符串类型:
⽇期和时间类型:
int(M)中的 M 代表最⼤显⽰宽度,"最⼤显⽰宽度"我们第⼀反应是该字段的值最⼤能允许存放的值的宽度,以为我们建了int(1),就不能存放数据10了, 其实不是这个意思,int(5)和int(10)可存储的范围⼀样。
CHAR类型是定长的,MySQL总是根据定义的字符串长度分配⾜够的空间。当保存CHAR值时,在它们的右边填充空格以达到指定的长度,当检索到CHAR值时,尾部的空格被删除掉。VARCHAR类型⽤于存储可变长字符串,存储时,如果字符没有达到定义的位数,也不会在后⾯补空格。char(M) 与 varchar(M)中的的 M 都表⽰保存的最⼤字符数,单个字母、数字、中⽂等都是占⽤⼀个字符。
substring截取5.讲讲索引的作⽤及结构及使⽤规范。
关于索引,能有好多好多问题,可能⼏篇⽂章也写不明⽩。简单分享下这类问题的回答:
索引的⽬的在于提⾼查询效率。可以类⽐字典中的⽬录,查字典内容时可以根据⽬录查到数据的存放位置,然后直接获取即可。索引是表的⽬录,在查内容之前可以先在⽬录中查索引位置,以此快速定位查询数据。
mysql面试题基础知识InnoDB 引擎下,主要使⽤的是 B+Tree 索引,每个索引其实都是⼀颗B+树,B+树是为了磁盘及其他存储辅助设备⽽设计的⼀种平衡查树(不是⼆叉树),在B+树中,所有的数据都在叶⼦节点,且每⼀个叶⼦节点都带有指向下⼀个节点的指针,形成了⼀个有序的链表。
从物理存储⾓度来看,InnoDB 索引可分为聚簇索引(clustered index)和⼆级索引(secondary index)或辅助索引。聚簇索引的叶⼦节点存的是整⾏数据,当某条查询使⽤的是聚簇索引时,只需要扫描聚簇索引⼀颗B+树即可得到所需记录,如果想通过⼆级索引来查完整的记录的话,需要通过回表操作,也就是在通过⼆级索引到主键值之后再到聚簇索引中查完整的记录。
索引的优点显⽽易见是可以加速查询,但创建索引也是有代价的。⾸先每建⽴⼀个索引都要为它建⽴⼀棵B+树,会占⽤额外的存储空间;其次当对表中的数据进⾏增加、删除、修改时,索引也需要动态的维护,降低了数据的维护速度。所以,索引的创建及使⽤时有原则的,⼀般只为⽤于搜索、排序、分组、连接的列创建索引,选择性差的列尽量不创建索引。
6.讲下 MySQL 事务的特性及隔离级别。
MySQL 事务相关问题也经常被问到,⼀些原理性的东西还是需要深⼊去学习的。
ACID 四个特性:
A(Atomicity,原⼦性):⼀个事务中的操作要么都成功,要么都失败。
C(Consistency,⼀致性):数据库总是从⼀个⼀致性状态转换到另⼀个⼀致性状态,若破坏约束,则不满⾜⼀致性条件。
shell脚本写计时脚本I(Isolation,隔离性):⼀个事务的执⾏不能其它事务⼲扰。即⼀个事务内部的操作及使⽤的数据对其它并发事务是隔离的,并发执⾏的各个事务之间不能互相⼲扰。
D(Durability,持久性):事务在提交以后,它所做的修改就会被永久保存到数据库。
事务隔离级别:
读未提交(Read Uncommitted):事务中的修改,即便没有提交,对其他事务也都是可见的。
读已提交(Read Committed):事务中的修改只有在提交之后,才会对其他事务可见。
可重复读(Repeatable Read):⼀个事务中多次查询相同的记录,结果总是⼀致的(默认的隔离级别)。
可串⾏化(Serializable):事务都是串⾏执⾏的,读会加读锁,写会加写锁。
并发事务带来的问题:
脏读(Dirty Reads):事务A读取了事务B未提交的数据,然后B回滚操作,那么A读取到的数据是脏数据。
javascript权威指南7
不可重复读(Non-Repeatable Reads):事务 A 多次读取同⼀数据,事务B在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同⼀数据时,结果不⼀致。
幻读(Phantom Reads):幻读与不可重复读类似。它发⽣在⼀个事务A读取了⼏⾏数据,接着另⼀个并发事务B插⼊了⼀些数据时。
在随后的查询中,事务A就会发现多了⼀些原本不存在的记录,就好像发⽣了幻觉⼀样,所以称为幻读。
参考:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论