1、请说下你对MySQL架构的了解
大体来说,MySQL可以分为Server层和存储引擎两部分
Server层包括:连接器、查询缓存、分析器、优化器、执行器等,涵盖了MySQL的大多数核心服务功能,以及所有的内置函数,所有跨存储引擎的功能都在这一层实现。
存储引擎层负责:数据的存储和提取。其架构是插件式的,支持InnoDB、MyISAM等多个存储引擎
2、一条SQL语句在数据库框架中的执行流程
1. 应用程序把查询SQL语句发送给服务器执行
2. 查询缓存,如果查询缓存是打开的,服务器在接收到查询请求后,并不会直接去数据库查询,而是在数据库的查询缓存中找是否有相对应的查询数据,如果存在,则直接返回给客户端。只有缓存不存在时,才会进行下面的操作
3. 查询优化处理,生成执行计划。这个阶段主要包括解析SQL、预处理、优化SQL执行计划
4. MySQL根据相应的执行计划完成整个查询
5. 将查询结果返回给客户端
3、数据库的三大范式是什么
* 第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项
* 第二范式:要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性
* 第三范式:任何非主属性不依赖于其他非主属性
4、char和varchar的区别
char(n):固定长度类型,比如:char(10),当你输入“abc"三个字符的时候,它们占的空间还是10个字节,其他7个是空字节。
varchar(n):可变长度,存储的值是每个值占用的字节再加上一个用来记录长度的字节的长度
5、索引的底层使用的是什么数据结构
索引的数据结构和具体存储引擎的实现有关。在MySQL中使用较多的索引有Hash索引、B+树索引等。而我们经常使用的InnoDB存储引擎的默认索引实现为B+树索引
6、谈谈你对B+树的理解
1. B+树是基于B树和叶子节点顺序访问指针进行实现,它具有B树的平衡性,并且能通过顺序访问指针来提高区间查询的性能
2. 进行查找操作时,首先在根节点进行二分查找,找到一个key所在的指针,然后递归的在指针所指向的节点进行查找。直到查找到叶子节点
3. 插入、删除操作会破坏平衡树的平衡性,因此在插入删除操作之后,需要对树进行一个分裂、合并、旋转操作来维持平衡性。
7、谈谈你对聚簇索引的理解
聚簇索引的叶子节点就是数据节点,一般情况下主键会默认创建聚簇索引
8、谈谈你对哈希索引的理解
哈希索引能以O(1)时间进行查找,但是失去了有序性。无法用于排序与分组、只支持精确查找,无法用于部分查找和范围查找
9、谈谈你对覆盖索引的认知?
如果一个索引包含了满足查询语句中字段与条件的数据就叫覆盖索引。具有以下优点:
* 索引通常小于数据行的大小,只能读取索引能够大大减少数据访问量
* 一些存储引擎(MyISAM)在内存中只缓存索引,而数据依赖于操作系统来缓存。因此,只访问索引可以不使用系统调用
* 对于InnoDB引擎,若辅助索引能够覆盖查询,则无需访问主索引
10、索引的分类?
- 从数据结构
- 树索引
- 哈希索引
- 从物理存储
- 聚簇索引
- 非聚簇索引
- 从逻辑角度
- 主键索引
- 唯一索引
- 联合索引
- 普通索引
- 全文索引
11、什么情况索引会失效
* 复合索引失效:未使用第一部分查询(最左匹配原则)
* 查询条件中用or会导致索引失效
* like的模糊查询(以%开头)
* 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来
* 在where子句中使用 <、>
* 在where子句中进行null值判断(当在查询中使用了 is not null 也会导致索引失效,而 is null 则会正常触发索引的,
* )
* 正则表达式
* 函数运算
* 索引列参与表达式运算
12、InnoDB和MyISAM的比較
1. 事务:InnoDB支持事务,MyISAM不支持事务
2. 全文索引:InnoD5.6之前不支持,MyISAM支持全文索引
3. 关于count函数:MyISAM存储总行数,InnoDB需要进行全表扫描
4. 锁:InnoDB支持行锁,MyISAM支持表锁
5. 外键:InnoDB支持外键,MyISAM不支持外键
13、主从复制中涉及到哪三个线程?
* binlog线程:负责读取主服务器上的数据更改写入二进制日志(Binary log)中
* I/O线程:负责从主服务器上读取二进制日志,并写入从服务器的重放日志(Relay log)中
* SQL线程:负责读取重放日志并重放其中的SQL语句。
14、请你描述事务的特性
1. 原子性:
2. 一致性
3. 隔离性
4. 持久性
15、谈谈你对事务隔离级别的理解
1. read_uncommitted(未提交读)
2. read_committed (提交读)
3. repeatable_read (可重复读)
4. serializble (串行化)