1.MySQL 基础

  • 什么是关系型数据库?

    就是建立在关系模型的基础上的数据库,关系模型表名了数据库中数据之间的练习【一对一、一对多、多对多】(MySQL、Oracle、SQL Server】

  • 什么是 SQL?

    SQL 是一种结构化查询语言,目的是从数据库中读写数据。几乎所有主流的数据库都支持 SQL,适应性非常强。可以新建数据、表,进行增删改查的操作

  • MySQL 有什么优点?
    • 稳定、功能完善并且是开源免费的
    • 有详细的官方文档,操作简单,维护成本低
    • 兼容性好,支持常见的操作系统,也支持多种开发语言

2.MySQL 字段类型

  • MySQL 字段类型有哪些
    • 数值类型:整型(tinyint、smallint、mediumint、int 和 bigint)浮点型(float 和 double)定点型(decimal)
    • 字符串类型:char、varchar、tinytext、text、mediumtext、longtext等,常用的是 char 和 varchar
    • 日期时间类型:year、time、data、datatime 和 timestamp等
  • char 和 varchar 的区别是什么?
    • char 是定长字符串,varchar 是变长字符串
    • char 在存储的时候,会在右边填充空格来到达设置的长度,检索的时候去掉空格,varchar 在存储的时候需要使用 1 或 2 个额外字节来记录字符串长度,检索时不处理
    • char 更适合存储长度较短或者长度差不多的字符串,比如身份证。而 varchar 类型适合存储长度不确定或者差异较大的字符串,比如 用户名称等
  • varchar(100) 和 varchar(10) 的区别是什么?
    • varchar(100) 和 varchar(10) 都是变长类型,表示能最多存储 100 个字符和 10 个字符,varchar(100) 可以满足更大范围的字符存储需求,而 varchar(10) 存储超过 10 个字符的适合,就需要修改表结构才行
    • 虽然两者存储的字符范围不同,但如果存储相同的字符串,所占用自盘的空间是一样的,但 varchar(100) 会消耗更多的内存,是因为 varchar 类型在内存中操作的适合,通常会分配固定大小的内存块来保存这个值,也就是定义类型适合指定的长度【比如在排序的时候,varchar(100) 是按照 100 的长度来进行的,就会消耗更多的内存】
  • decimal 和 float/double 的区别是什么?

    decimal 是定点数,float/double 是浮点数。decimal 可以存储精确的小数值,float/double 只能存储近似的小数值。decimal 可以避免浮点数带来的精度失真问题【decimal 类型对应的就是 Java 中的 BigDecimal 类】

  • 为什么不推荐使用 text 和 blob?

    text 类型常用于存储长文本数据,比如博客的内容。blob 类型主要用于存储二进制大对象,比如图片、音频等。

    两者存在缺点和限制:1.不能有默认值。2.在遇到使用临时表的情况瞎,无法使用内存临时表。3.检索效率比 char 和 varchar 低。4.不能直接创建索引。5.会消耗大量的网络和 IO 带宽

  • datatime 和 timestamp 的区别是什么?
    • DateTime 类型没有时区信息,Timestamp 和时区有关
    • Timestamp 只需要使用 4 个字节的存储空间,而 DataTime 需要耗费 8 个字节的存储空间。这就说明Timestamp 表示的时间范围更小
    • DateTime:1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
    • Timestamp:1970-01-01 00:00:01 ~ 2037-12-31 23:59:59
  • Null 和 '' 的区别是什么?
    • Null 代表一个不确定的值,就算是两个 null ,两者也不一定相当【比如查询的时候条件 null = null 结果是 false,而使用 distinct、group by、order by 的时候,null 又被认为是相等的】
    • '' 的长度是 0,是不占用空间的,而 null 是需要占用空间的
    • null 会影响聚合函数的结果【比如 sum、mix、max和平均数等聚合函数会忽略 null 值】。count 的处理方式取决于参数的类型,如果参数是 * 那么则会统计所有的记录数,包括 null 值。如果参数是某个字段名,则会忽略 null,只统计非空值的个数
    • 查询 null 值的时候,必须使用 is null 或者是 is not null 来判断,不能使用比较运算符,而 '' 是可以使用这些比较运算符的

3.MySQL 存储引擎

  • MySQL 支持哪些存储引擎?默认使用哪个?

    MySQL 支持多种存储引擎【比如 InnoDB、MyISAM、Memory等】,可以通过 show engines 命令来查看

    MySQL 默认的存储引擎是 InnoDB,所有的存储引擎中只有 InnoDB 支持事务【5.5.5 之前 MyISAM 是MySQL 的默认存储引擎,5.5.5 版本之后是 InnoDB】

  • MySQL 存储引擎架构了解么?

    MySQL 存储引擎采用的是插件式架构,支持多种存储引擎,使用的时候可以为不同的数据库表设置不同的存储引擎【存储引擎是基于表的,而不是数据库】

  • MyISAM 和 InnoDB 有什么区别
    • MyISAM 只有表级锁,而 InnoDB 支持行级锁和表级锁,默认为行级锁

    • MyISAM 不提供事务支持,而 InnoDB 提供事务支持,实现了 SQL 标准定义了四个隔离级别,拒用提交和回滚事务的能力

    • MyISAM 不支持外键,而 InnoDB 支持外键
    • MyISAM 不支持数据库异常崩溃后的安全恢复,而 InnoDB 支持
    • InnoDB 的性能比 MyISAM 更强大【MyISAM 读写不能并发】
  • MyISAM 和 InnoDB 如何选择

    一般情况瞎,选择 InnoDB 是没有问题的,如果并不在乎可扩展能力和并发能力,也不需要事务支持和崩溃后的安全恢复问题,那也可以选择 MyISAM,但通常在项目中这些都需要考虑

4.MySQL 索引

  • 什么是索引?

    索引是一种用于快速查询和检索数据的数据结构,本质可以看作是一种排序号的数据结构【比如看书的时候,如果存在了目录,就可以通过目录来快速定位】

  • 索引的优缺点
    • 优点:1.使用索引可以加快数据的检索速度。2.通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
    • 缺点:1.创建索引和维护索引需要耗费很多时间。当进行对表中数据的增删改,如果数据有索引,那么索引页需要动态的修改,会降低 SQL 执行的效率。2.索引页需要存储,也会耗费一定的空间
  • 主键索引

    数据表的主键列使用的就是主键索引。一张数据表中只能有一个主键,并且主键不能为 null,不能重复【Mysql 的 InnoDB 的表中,当没有显示指定表的主键时候,InnoDB 会自动检查表中是否有唯一索引且不允许存储 null 值的字段,如果有,则选择该字段为默认的主键,没有 InnoDB 会自动创建一个自增主键】

5.MySQL 查询缓存

  • MySQL 查询缓存了解么?

    执行查询语句的时候,会先查询缓存,但 MySQL 8.0 后就移除了。开启查询缓存后在同样的查询条件以及数据情况瞎,会直接在缓存中返回结果。这里的查询条件包括查询本身、当前查询的数据库、客户端协议版本号等一些可能影响结果的信息

  • 查询缓存不命中的情况有哪些?
    • 如何两个查询在任何字符上的不同都会导致缓存不命中
    • 如果查询中包含任何用户自定义函数、存储函数、用户变量、临时表、MySQL 库中的系统表,其查询结果也不会被缓存
    • 缓存建立之后,MySQL 的查询缓存系统会跟踪查询中涉及的每张表,如果这些表发生了变化(数据或结构),那么和这张表相关的所有缓存数据都将失效
  • 查询缓存被移除的原因

    缓存虽然能够提升数据库的查询性能,但缓存同时也带来了额外的开销,每次查询后都要做一次缓存操作,失效后还要销毁,占用了大量的内存,还有就是影响并发性能【当并发用户越来越多的时候,这样的缓存机制就会导致大量请求阻塞在同一个锁上,从而降低了并发性能】

6.MySQL 事务

  • 什么是事务?

    为了保证数据的一致性,事务是逻辑上的一组操作,这一组操作要么都执行成功,要么都执行失败【比如张三要给李四转账1000,张三余额减少 1000和李四余额增加 1000,这两个操作要么都成功,要么都失败】

  • 什么是数据库事务

    数据库事务可以保证多个对数据库的操作构成一个整体,这个整体对数据库的操作要遵循:要么全部成功,要么全部失败

  • 关系型数据库特性(ACID)
    • 原子性(Atomicity):事务是不可分割的最小单位,要么全部成功,要么全部失败
    • 一致性(Consistency):执行事务前后,数据必须保持一致
    • 隔离性(Isolation):并发访问数据库的时候,一个用户的事务不被其它事务所干扰,各并发事务之间数据库是独立的
    • 持久性(Durability):一个事务被提交后,对数据库中数据的改变是持久的,即使数据库发生了故障也不会有任何的影响
  • 并发事务带来了哪些问题?
    • 脏读:比如事务1读取了数据 A = 20,并修改为 A = 19,这个修改对于其它事务是可见的,即使事务 1 没有提交。这时候另一个事务 2 读取了还没提交的数据 A = 19,这时候事务 1 进行回滚,导致数据并没有提交到数据库,那么事务 2 读取的这个数据就是脏数据,称为脏读
    • 丢失修改:比如事务 1 读取了数据 A = 20,另一个事务 2 也访问了该数据,随后事务 1 修改了数据 A = 19 后,事务 2 也修改了相同的数据,这样事务 1 修改的被丢失,因此称为丢失修改
    • 不可重复读:指在一个事务内多次读同一数据。比如事务 1 读取了数据 A = 20,还没有结束的时候,另一个事务 2 也访问了该数据,那么在事务 1 中两次读数据之间,事务 2 吧数据 A 改为了 19,导致了事务 1 两次读取的数据不一样。着就发生了一个事务内两次读到的数据不一样的情况,称为不可重复读
    • 幻读:欢度与不可重复读相似,它发生在一个事务读取了几行数据,接着另一个并发事务插入了一些数据时,在随后的查询中,第一个事务就会发现多了一些原本没有的记录,就好像发生幻觉了一样,所以称为幻读
  • 不可重复读和幻读有什么区别?

    不可重复读的重点是内容修改或者记录减少,比如多次读取一条数据发现有些记录的值被修改。幻读的重点在于记录新增比如多次执行同一条查询语句时候,发现查到的记录增加了

results matching ""

    No results matching ""