MySQL

1.MySql优点

1.成熟稳定,功能完善。
2.开源免费。
3.文档丰富。
4.开箱即用,操作简单,维护成本低。
5.支持分库分表,读写分离,高可用。
6.事务支持优秀,

2.varchar(100)和varcar(10)的区别?

都是变长类型,一个存储100个字符一个存储10个字符,超过指定范围需要修改表结构
虽然长度不同,但是存储相同的字符串时,所占用的磁盘空间一样。
但是varchar(100)会消耗更多的内存。

3.NULL和''的区别是什么?

NULL跟''是两个完全不一样的值。
NULL代表一个不确定的值,就算是两个NULL,他俩也不一定相等。
''的长度是0,是不占空间的,而NULL是需要占用空间的。
查询NULL值时,必须使用IS NULL 或 IS NOT NULL 来判断,而不能用=、!=、<、>之类的比较运算符。而''可以用比较运算符。

4.客户端的一条sql语句在MySQL内部如何执行?

1.连接器:身份认证和权限相关。
2.查询缓存:执行查询语句的时候,会先查询缓存。
3.分析器:没有命中缓存的话,SQL语句就会经过分析器,查看SQL语句要干什么,检查SQL语句语法是否正确。
4.优化器:按照MySQL认为最优的方案去执行。
5.执行器:执行语句,然后从存储引擎返回数据。执行之前会判断是否有权限,如果没有,则报错。
6.插件式储存引擎:主要负责数据的存储和读取,采用的是插件式架构,支持InnoDB等多种存储引擎。

5.MySQL5.5.5之后InnoDB是默认存储引擎。

6.InnoDB支持安全恢复,这个恢复的过程依赖 redo log

7.InnoDB和MyIsam都是使用B+树作为索引结构。

8.MySQL三个重要的日志

binlog(归档日志)、binlog是逻辑日志,属于MySQL Server层,数据库的备份主要靠binlog来同步,保证数据一致性。
redo log(重做日志)、redo log是物理日志,属于InnoDB存储引擎、MySQL实例挂了或宕机,使用redo log恢复数据,保证数据的持久性和完整性。
undo log(回滚日志)、undo log属于逻辑日志,记录SQL语句,每一个事务对数据的修改都会被记录到undo log,当执行事务过程中出现错误或者需要执行回滚操作的话,MySQL可以利用undo log将数据恢复到事务开始之前的状态。
总结:MySQL InnoDB引擎使用redo log(重做日志)保证事务的持久性,使用undo log(回滚日志)来保证事物的原子性
MySQL数据库的数据备份、主备、主主、主从都离不开binlog,需要依靠binlog来同步数据,保证数据的一致性

9.MySQL自增主键一定是连续的吗?

MySQL的自增主键并不能保证一定连续递增
MySQL8.0版本以前MySQL的自增值可能会随着重启MySQL实例失效,而8.0以后的版本,自增值变更放在了redo.log中,提供了自增持久化功能。
不连续场景

  1. 自增初始值和自增步长设置不为 1,指定的id比自增值大的时候。
  2. 唯一索引字段重复插入时,插入失败会造成自增值不连续。
  3. 执行插入数据直接进行回滚。
  4. 执行批量插入时,同一语句每次申请道德自增id个数都是上次的两倍。

10.数据库的事务

什么是事务?:多条sql语句,要么全部成功,要么全部失败。
事物的特性:原子性(A)、一致性(C)、隔离性(I)、持久性(D)。简称ACID。
原子性:组成一个事务的多个数据库操作是一个不可分割的原子单元,只有所有操作都成功,整个事务才会提交。
一致性:事务操作成功后,数据库所处的状态和他们的业务规则是一致的。
隔离性:并发操作时,不会对彼此产生干扰。
持久性:一旦事务提交成功,事务中的所有操作都必须持久化到数据库中。