一. MySQL数据库基础
MySQL是一款开源免费并且比较成熟的关系型数据库。
优点:
- 成熟稳定,功能完善。
- 开源免费。
- 文档丰富,既有详细的官方文档,又有非常多优质文章可供参考学习。
- 开箱即用,操作简单,维护成本低。
- 兼容性好,支持常见的操作系统,支持多种开发语言。
- 社区活跃,生态完善。
- 事务支持优秀, InnoDB 存储引擎默认使用 REPEATABLE-READ 并不会有任何性能损失,并且,InnoDB 实现的 REPEATABLE-READ 隔离级别其实是可以解决幻读问题发生的。
- 支持分库分表、读写分离、高可用。
1.MySQL字段类型
MySQL 字段类型可以简单分为三大类:
- 数值类型:整型(TINYINT、SMALLINT、MEDIUMINT、INT 和 BIGINT)、浮点型(FLOAT 和 DOUBLE)、定点型(DECIMAL)
- 字符串类型:CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB 等,最常用的是 CHAR 和 VARCHAR。
- 日期时间类型:YEAR、TIME、DATE、DATETIME 和 TIMESTAMP 等。
整数类型的UNSIGNED属性有什么用?
MySQL 中的整数类型可以使用可选的 UNSIGNED 属性来表示不允许负值的无符号整数。使用 UNSIGNED 属性可以将正整数的上限提高一倍,因为它不需要存储负数值。
例如, TINYINT UNSIGNED 类型的取值范围是 0 ~ 255,而普通的 TINYINT 类型的值范围是 -128 ~ 127。INT UNSIGNED 类型的取值范围是 0 ~ 4,294,967,295,而普通的 INT 类型的值范围是 -2,147,483,648 ~ 2,147,483,647。
对于从 0 开始递增的 ID 列,使用 UNSIGNED 属性可以非常适合,因为不允许负值并且可以拥有更大的上限范围,提供了更多的 ID 值可用。
(1)CHAR和VARCHAR的区别?
CHAR 是定长字符串,VARCHAR 是变长字符串。
(2)VARCHAR(100)和VARCHAR(10)的区别?
它们分别最多能存储100个和10个字符,因此100能满足更大范围的字符存储需求。虽然它们能存储的字符范围不同,但二者存储相同的字符串,所占用磁盘的存储空间其实是一样的。但VARCHAR(100)会消耗更多内存。
(3)DECIMAL和FLOAT/DOUBLE的区别?
DECIMAL 和 FLOAT 的区别是:DECIMAL 是定点数,FLOAT/DOUBLE 是浮点数。DECIMAL 可以存储精确的小数值,FLOAT/DOUBLE 只能存储近似的小数值。
(4)为什么 MySQL 不建议使用 NULL 作为列默认值?
-
空间浪费:当一个列的默认值设置为 NULL 时,每行数据都会占用额外的存储空间用于表示该列的空值。这会导致数据表占用更多的磁盘空间,特别是当表的规模很大时,空间浪费会变得明显。
-
索引问题:当一个列的默认值设置为 NULL 时,该列的索引会变得更加复杂。在 MySQL 中,B-tree 索引不包含 NULL 值,因此将 NULL 作为默认值会导致索引变得更大、更长,查找和维护索引的性能也会受到影响。
-
不明确的语义:使用 NULL 作为默认值会模糊列的语义,不清楚 NULL 代表什么含义。例如,一个名称列的默认值为 NULL,那么不清楚 NULL 表示该列缺失值还是未知值,可能会引起混淆和错误的解读。
-
查询复杂性:在查询时,如果一个列的默认值为 NULL,则需要额外的条件判断以处理 NULL 值的情况。这增加了查询的复杂性和开发的难度。
-
补充:' ' 空字符串长度为0,不占用空间;在查询时可以使用=、<、>、!=之类的比较运算符,而NULL需要使用IS NULL或者IS NOT NULL来判断。
(5)MySQL中没有专门的布尔类型。
通常会用TINYINT(1)来表示,它可以存储0或1,用来对应false和true。
2.MySQL基础架构
- 连接器: 身份认证和权限相关(登录 MySQL 的时候)。
- 查询缓存: 执行查询语句的时候,会先查询缓存(MySQL 8.0 版本后移除,因为这个功能不太实用)。
- 分析器: 没有命中缓存的话,SQL 语句就会经过分析器,分析器说白了就是要先看你的 SQL 语句要干嘛,再检查你的 SQL 语句语法是否正确。
- 优化器: 按照 MySQL 认为最优的方案去执行。
- 执行器: 执行语句,然后从存储引擎返回数据。 执行语句之前会先判断是否有权限,如果没有权限的话,就会报错。
- 插件式存储引擎:主要负责数据的存储和读取,采用的是插件式架构,支持 InnoDB、MyISAM、Memory 等多种存储引擎
一个 SQL 语句在 MySQL 中的执行流程是什么?
分别经过连接器、查询缓存、分析器解析SQL、优化器优化SQL、执行器执行SQL。
3.MySQL存储引擎
MySQL 5.5.5 之前,MyISAM 是 MySQL 的默认存储引擎。5.5.5 版本之后,InnoDB 是 MySQL 的默认存储引擎。
(1)MySQL存储引擎架构。
MySQL 存储引擎采用的是 插件式架构 ,支持多种存储引擎,甚至可以为不同的数据库表设置不同的存储引擎以适应不同场景的需要。存储引擎是基于表的,而不是数据库。
(2)MyISAM和InnoDB的区别?
- 是否支持行级锁。MyISAM 只有表级锁(table-level locking),而 InnoDB 支持行级锁(row-level locking)和表级锁,默认为行级锁。也就是MyISAM只能锁住整张表,而InnoDB可以锁住某行。
- 是否支持事务。M