写在以前:不建议那种上来就是各类面试题罗列,而后背书式的去记忆,对技术的提高帮助很小,对正经面试也没什么帮助,有点东西的面试官深挖下就懵逼了。mysql
我的建议把面试题看做是费曼学习法中的回顾、简化的环节,准备面试的时候,跟着题目先本身讲给本身听,看看本身会满意吗,不满意就继续学习这个点,如此反复,好的offer离你不远的,奥利给面试
和其它数据库相比,MySQL有点不同凡响,它的架构能够在多种不一样场景中应用并发挥良好做用。主要体如今存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离。这种架构能够根据业务的需求和实际须要选择合适的存储引擎。sql
(海量免费测试资料加313782132,群内还会有同行一块儿交流哦~)数据库
链接层:最上层是一些客户端和链接服务。主要完成一些相似于链接处理、受权认证、及相关的安全方案。在该层上引入了线程池的概念,为经过认证安全接入的客户端提供线程。一样在该层上能够实现基于SSL的安全连接。服务器也会为安全接入的每一个客户端验证它所具备的操做权限。缓存
服务层:第二层服务层,主要完成大部分的核心服务功能, 包括查询解析、分析、优化、缓存、以及全部的内置函数,全部跨存储引擎的功能也都在这一层实现,包括触发器、存储过程、视图等安全
引擎层:第三层存储引擎层,存储引擎真正的负责了MySQL中数据的存储和提取,服务器经过API与存储引擎进行通讯。不一样的存储引擎具备的功能不一样,这样咱们能够根据本身的实际须要进行选取服务器
存储层:第四层为数据存储层,主要是将数据存储在运行于该设备的文件系统之上,并完成与存储引擎的交互架构
画出 MySQL 架构图,这种变态问题都能问的出来并发
MySQL 的查询流程具体是?or 一条SQL语句在MySQL中如何执行的?运维
客户端请求 ---> 链接器(验证用户身份,给予权限) ---> 查询缓存(存在缓存则直接返回,不存在则执行后续操做) ---> 分析器(对SQL进行词法分析和语法分析操做) ---> 优化器(主要对执行的sql优化选择最优的执行方案方法) ---> 执行器(执行时会先看用户是否有执行权限,有才去使用这个引擎提供的接口) ---> 去引擎层获取数据返回(若是开启查询缓存则会缓存查询结果)
说说MySQL有哪些存储引擎?都有哪些区别?
存储引擎是MySQL的组件,用于处理不一样表类型的SQL操做。不一样的存储引擎提供不一样的存储机制、索引技巧、锁定水平等功能,使用不一样的存储引擎,还能够得到特定的功能。
使用哪种引擎能够灵活选择,一个数据库中多个表可使用不一样引擎以知足各类性能和实际需求,使用合适的存储引擎,将会提升整个数据库的性能 。
MySQL服务器使用可插拔的存储引擎体系结构,能够从运行中的 MySQL 服务器加载或卸载存储引擎 。
-- 查看支持的存储引擎SHOW ENGINES -- 查看默认存储引擎SHOW VARIABLES LIKE 'storage_engine' --查看具体某一个表所使用的存储引擎,这个默认存储引擎被修改了!show create table tablename --准确查看某个数据库中的某一表所使用的存储引擎show table status like 'tablename'show table status from database where name="tablename"复制代码
-- 建表时指定存储引擎。默认的就是INNODB,不须要设置CREATE TABLE t1 (i INT) ENGINE = INNODB;CREATE TABLE t2 (i INT) ENGINE = CSV;CREATE TABLE t3 (i INT) ENGINE = MEMORY; -- 修改存储引擎ALTER TABLE t ENGINE = InnoDB; -- 修改默认存储引擎,也能够在配置文件my.cnf中修改默认引擎SET default_storage_engine=NDBCLUSTER;复制代码
默认状况下,每当 CREATE TABLE
或 ALTER TABLE
不能使用默认存储引擎时,都会生成一个警告。为了防止在所需的引擎不可用时出现使人困惑的意外行为,能够启用 NO_ENGINE_SUBSTITUTION SQL
模式。若是所需的引擎不可用,则此设置将产生错误而不是警告,而且不会建立或更改表
常见的存储引擎就 InnoDB、MyISAM、Memory、NDB。
InnoDB 如今是 MySQL 默认的存储引擎,支持事务、行级锁定和外键
文件存储结构对比
在 MySQL中创建任何一张数据表,在其数据目录对应的数据库目录下都有对应表的 .frm
文件,.frm
文件是用来保存每一个数据表的元数据(meta)信息,包括表结构的定义等,与数据库存储引擎无关,也就是任何存储引擎的数据表都必须有.frm
文件,命名方式为 数据表名.frm,如user.frm。
查看MySQL 数据保存在哪里:show variables like 'data%'
MyISAM 物理文件结构为:
.frm
文件:与表相关的元数据信息都存放在frm文件,包括表结构的定义信息等.MYD
(MYData
) 文件:MyISAM 存储引擎专用,用于存储MyISAM 表的数据.MYI
(MYIndex
)文件:MyISAM 存储引擎专用,用于存储MyISAM 表的索引相关信息InnoDB 物理文件结构为:
.frm
文件:与表相关的元数据信息都存放在frm文件,包括表结构的定义信息等
.ibd
文件或 .ibdata
文件: 这两种文件都是存放 InnoDB 数据的文件,之因此有两种文件形式存放 InnoDB 的数据,是由于 InnoDB 的数据存储方式可以经过配置来决定是使用共享表空间存放存储数据,仍是用独享表空间存放存储数据。
独享表空间存储方式使用.ibd
文件,而且每一个表一个.ibd
文件 共享表空间存储方式使用.ibdata
文件,全部表共同使用一个.ibdata
文件(或多个,可本身配置)
ps:正经公司,这些都有专业运维去作,数据备份、恢复啥的,让我一个 Javaer 搞这的话,加钱不?
面试这么回答
select count(*) from table
时须要全表扫描。而 MyISAM 用一个变量保存了整个表的行数,执行上述语句时只须要读出该变量便可,速度很快;对比项 | MyISAM | InnoDB |
---|---|---|
主外键 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
行表锁 | 表锁,即便操做一条记录也会锁住整个表,不适合高并发的操做 | 行锁,操做时只锁某一行,不对其它行有影响,适合高并发的操做 |
缓存 | 只缓存索引,不缓存真实数据 | 不只缓存索引还要缓存真实数据,对内存要求较高,并且内存大小对性能有决定性的影响 |
表空间 | 小 | 大 |
关注点 | 性能 | 事务 |
默认安装 | 是 | 是 |
一张表,里面有ID自增主键,当insert了17条记录以后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18仍是15 ?
若是表的类型是MyISAM,那么是18。由于MyISAM表会把自增主键的最大ID 记录到数据文件中,重启MySQL自增主键的最大ID也不会丢失;
若是表的类型是InnoDB,那么是15。由于InnoDB 表只是把自增主键的最大ID记录到内存中,因此重启数据库或对表进行OPTION操做,都会致使最大ID丢失。
哪一个存储引擎执行 select count(*) 更快,为何?
MyISAM更快,由于MyISAM内部维护了一个计数器,能够直接调取。
在 MyISAM 存储引擎中,把表的总行数存储在磁盘上,当执行 select count(*) from t 时,直接返回总数据。
在 InnoDB 存储引擎中,跟 MyISAM 不同,没有将总行数存储在磁盘上,当执行 select count(*) from t 时,会先把数据读出来,一行一行的累加,最后返回总数量。
InnoDB 中 count(*) 语句是在执行的时候,全表扫描统计总数量,因此当数据愈来愈大时,语句就愈来愈耗时了,为何 InnoDB 引擎不像 MyISAM 引擎同样,将总行数存储到磁盘上?这跟 InnoDB 的事务特性有关,因为多版本并发控制(MVCC)的缘由,InnoDB 表“应该返回多少行”也是不肯定的。
主要包括如下五大类:
(海量免费测试资料加313782132,群内还会有同行一块儿交流哦~)
CHAR 和 VARCHAR 的区别?
char是固定长度,varchar长度可变:
char(n) 和 varchar(n) 中括号中 n 表明字符的个数,并不表明字节个数,好比 CHAR(30) 就能够存储 30 个字符。
存储时,前者无论实际存储数据的长度,直接按 char 规定的长度分配存储空间;然后者会根据实际存储的数据分配最终的存储空间
相同点:
不一样点:
char是适合存储很短的、通常固定长度的字符串。例如,char很是适合存储密码的MD5值,由于这是一个定长的值。对于很是短的列,char比varchar在存储空间上也更有效率。
列的字符串类型能够是什么?
字符串类型是:SET、BLOB、ENUM、CHAR、TEXT、VARCHAR
BLOB和TEXT有什么区别?
BLOB是一个二进制对象,能够容纳可变数量的数据。有四种类型的BLOB:TINYBLOB、BLOB、MEDIUMBLO和 LONGBLOB
TEXT是一个不区分大小写的BLOB。四种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。
BLOB 保存二进制数据,TEXT 保存字符数据。