1.MySQL、基础架构(SQL语句执行流程、更新语句执行流程)、字段类型

1.MySQL的索引有哪些
索引在什么层面:
  索引是在存储引擎层实现的,而不是在服务器层实现的,所以不同存储引擎具有不同的索引类型和实现。
B+树索引:是大多数 MySQL 存储引擎的默认索引类型。
哈希索引:哈希索引能以 O(1) 时间进行查找,但是失去了有序性;InnoDB 存储引擎有一个特殊的功能叫“自适应哈希索引”,当某个索引值被使用的非常频繁时,会在 B+Tree 索引之上再创建一个哈希索引,这样就让 B+Tree 索引具有哈希索引的一些优点,比如快速的哈希查找。
全文索引:MyISAM 存储引擎支持全文索引,用于查找文本中的关键词,而不是直接比较是否相等。查找条件使用 match against,而不是普通的 WHERE。全文索引一般使用倒排索引实现,它记录着关键词到其所在文档的映射。InnoDB 存储引擎在 MySQL 5.6.4 版本中也开始支持全文索引。
空间数据索引:MyISAM 存储引擎支持空间数据索引(R-Tree),可以用于地理数据存储。空间数据索引会从所有维度来索引数据,可以有效地使用任意维度来进行组合查询。
 
2.什么是B+树,为什么B+树成为主要SQL数据库的索引实现
  B+ Tree 是基于 B Tree 和叶子节点顺序访问指针进行实现,它具有 B Tree 的平衡性,并且通过顺序访问指针来提高区间查询的性能。在 B+ Tree 中,一个节点中的 key 从左到右非递减排列,如果某个指针的左右相邻 key 分别是 keyi 和 keyi+1,且不为 null,则该指针指向节点的所有 key 大于等于 keyi 且小于等于 keyi+1。
 
3.什么是关系型数据库
  关系型数据库:一种建立在关系上的数据库,关系模型表明了数据库中所存储数据之间的联系。是指采用了关系模型来组织数据的数据库,以行和列形式存储数据,以便用户理解。
  常见关系型数据库:MySQL、PostgreSQL、Oracle、SQL Server、SQLite
什么是SQL:SQL是一种结构化查询语言,专门用来与数据库打交道,目的是提供一种从数据库中读写数据的简单有效的方法。
什么是MySQL:MySQL是一种关系型数据库,主要用于持久化存储我们的系统中的一些数据。
 
4.MySQL有什么优点?为什么如此流行?
成熟稳定、功能完善。
开源免费
文档丰富
开箱即用
支持分库分表,读写分离、高可用
 
5.一个 SQL 语句在 MySQL 中的执行流程:
  ·连接器:身份认证和权限相关(登录 MySQL 的时候)。
  ·查询缓存:执行查询语句的时候,会先查询缓存(MySQL 8.0 版本后移除,因为这个功能不太实用)。
  ·分析器:没有命中缓存的话,SQL 语句就会经过分析器,分析器说白了就是要先看你的 SQL 语句要干嘛,再检查你的 SQL 语句语法是否正确。
  ·优化器:按照 MySQL 认为最优的方案去执行。
  ·执行器:执行语句,然后从存储引擎返回数据。

 

6. 从准备更新一条数据到事务的提交流程描述
(1)首先执行器根据 MySQL 的执行计划来查询数据,先是从缓存池中查询数据,如果没有就会去数据库查询,如果查询到了就将其放到缓存池中
(2)在数据被缓存到缓存池的同时,会写入undo log日志文件
(3)更新动作是在BufferPool中完成的,同时会将更新后的数据添加到redo log buffer中
(4)完成以后就可以提交事务,在提交的同时会做以下三件事: 
(5)将redo log buffer中的数据刷入到redo log文件中 (prepare状态)
(6)将本次操作记录写入到bin log文件中
(7)将bin log文件名字和更新内容在bin log中的位置记录到redo log中,同时在redo log最后添加commit标记  (commit状态)

总结
· MySQL主要分为Server层和引擎层,Server 层主要包括连接器、查询缓存、分析器、优化器、执行器,同时还有一个日志模块(binlog),这个日志模块所有执行引擎都可以共用,redolog只有InnoDB有。
· 引擎层是插件式的,目前主要包括 MyISAM,InnoDB,Memory 等。
· 查询语句的执行流程如下:权限校验(如果命中缓存)--->查询缓存--->分析器--->优化器--->权限校验--->执行器--->引擎
· 更新语句执行流程如下:分析器---->权限校验---->执行器--->引擎---redo log(prepare 状态)--->binlog--->redo log(commit状态)
 
7.字段类型

整数类型的 UNSIGNED 属性有什么用?

  MySQL 中的整数类型可以使用可选的 UNSIGNED 属性来表示不允许负值的无符号整数。使用 UNSIGNED 属性可以将正整数的上限提高一倍,因为它不需要存储负数值。

VARCHAR(100)和 VARCHAR(10)的区别是什么?

  VARCHAR(100)和 VARCHAR(10)都是变长类型,表示能存储最多 100 个字符和 10 个字符。但二者存储相同的字符串,所占用磁盘的存储空间其实是一样的,这也是很多人容易误解的一点。不过,VARCHAR(100) 会消耗更多的内存,例如在进行排序的时候,VARCHAR(100)是按照 100 这个长度来进行的。

DECIMAL 和 FLOAT/DOUBLE 的区别是什么?

  DECIMAL 和 FLOAT 的区别是:DECIMAL 是定点数,FLOAT/DOUBLE 是浮点数。DECIMAL 可以存储精确的小数值,FLOAT/DOUBLE 只能存储近似的小数值。

Boolean 类型如何表示?

  MySQL 中没有专门的布尔类型,而是用 TINYINT(1) 类型来表示布尔值。TINYINT(1) 类型可以存储 0 或 1,分别对应 false 或 true。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

posted @ 2023-09-18 20:56  壹索007  阅读(2)  评论(0编辑  收藏  举报