MySQL十问
一.char和varchar区别
在 MySQL 中,CHAR 和 VARCHAR 是两种用于存储字符串的数据类型,它们有一些关键的区别:
存储方式
- CHAR:固定长度字符类型。如果存储的字符串长度小于定义的长度,MySQL 会在右边填充空格以达到定义的长度。例如,CHAR(10)会存储一个长度为 10 的字符串,如果实际存储的字符串长度为 5,那么会在右边填充 5 个空格。
- VARCHAR:可变长度字符类型。存储时只占用实际字符长度加上一个或两个字节的长度前缀(长度前缀的长度取决于字符串的最大长度)。例如,VARCHAR(10)会存储一个最多长度为 10 的字符串,但实际存储时会根据字符串的实际长度动态调整。
性能:
- CHAR:由于长度固定,查询和比较时性能可能会稍微好一些,因为不需要计算长度。另外,对于短字符串,使用 CHAR 可能会减少碎片化。
- VARCHAR:由于长度可变,存储和检索时需要额外的步骤来计算长度,但这通常不会对性能产生显著影响,特别是在字符串长度变化较大的情况下。
存储需求:
- CHAR:无论存储的字符串长度如何,都会占用定义长度的存储空间。例如,CHAR(100) 总是占用 100 个字符的空间。
- VARCHAR:存储时只需要实际字符长度加上长度前缀的空间。例如,VARCHAR(100) 存储一个长度为 20 的字符串时,只需要 20
个字符加上 1 或 2 个字节的长度前缀的空间。
使用场景:
- CHAR:适用于存储长度固定且变化不大的字符串,例如邮政编码、国家代码等。
- VARCHAR:适用于存储长度变化较大的字符串,例如姓名、电子邮件地址等。
索引和排序:
在使用索引和排序时,CHAR 和 VARCHAR 的行为可能有所不同,特别是在涉及填充空格和区分大小写的情况下。
最大长度:
- CHAR 的最大长度是 255 个字符。
- VARCHAR 的最大长度取决于字符集和最大行大小限制,但通常可以达到 65,535 个字节(减去其他列和长度前缀的开销)。
二.innodb的一次更新事务流程是什么?
InnoDB的一次更新事务流程通常涉及多个关键步骤,这些步骤共同确保了事务的原子性、一致性、隔离性和持久性(ACID特性)。以下是InnoDB更新事务的详细流程:
1.加载数据到缓存中(Buffer Pool):
- InnoDB首先会在缓冲池(Buffer Pool)中查找该记录是否已经在内存中。
- 如果记录不在内存中,会将需要更新的数据从磁盘文件加载到内存的缓冲池中。
2.记录Undo Log:
- 在修改操作前,InnoDB会在Undo Log中记录修改前的数据。
- Undo Log用于保证事务的原子性和一致性,以便在事务回滚时能够撤销所做的更改。
3.获取行锁:
- 在读取或修改数据之前,InnoDB会获取相应行的锁,以确保数据的一致性和避免并发冲突。
- 通常使用行级锁(row-level lock)来锁定要更新的行。
4.更新内存数据:
- InnoDB在缓冲池中更新数据,即修改已经加载到内存中的数据页。
- 此时,缓冲池中的数据页被标记为“脏页”,表示与磁盘上的数据不一致。
5.记录Redo Log:
- InnoDB会将更新操作写入Redo Log中,以便在系统崩溃时能够恢复事务修改后的状态。
- Redo Log是一种物理日志,记录了事务对数据库的修改操作。
6.提交事务:
- 当事务完成所有的更新操作后,事务被提交。
- 在提交事务时,InnoDB会将Redo Log从内存中的Redo Log Buffer写入到磁盘上的Redo Log文件中,以确保事务的持久性。
7.记录Binlog:
- 在提交事务时,InnoDB还会将事务提交的信息记录到Binlog中。
- Binlog是MySQL的二进制日志,用于记录数据库的所有修改操作,并可用于数据恢复、主从复制等场景。
8.刷新脏页到磁盘:
- 在提交事务后,InnoDB会将缓冲池中的脏页刷新到物理磁盘上的数据文件中。
- 这个过程称为“刷脏”,通过刷脏操作将内存中的修改同步到磁盘上,确保数据的持久性。
- 需要注意的是,刷脏操作通常是由后台线程异步执行的,因此可能会有一定的延迟。
9.释放行锁:
- 在更新完成并且数据被写回磁盘后,InnoDB会释放之前获取的行锁,使得其他事务可以访问这些数据。
三.mysql的innodb为什么使用b+树作为索引
查询效率高:
- B+树是一种平衡树,其所有叶子节点都在同一层,且通过指针相连形成有序链表。这种结构使得在进行查询操作时,能够利用二分查找法快速定位和检索所需数据,从而降低数据检索的时间复杂度,提高查询效率。
- 由于B+树的内部节点只存储索引信息而不存储实际数据,因此可以存储更多的索引信息,提高索引的覆盖度,减少回表操作(即根据索引找到主键后,再通过主键索引查询整行记录的过程)。
支持排序和范围查询:
- B+树的叶子节点形成了一个有序链表,这为实现排序和范围查询提供了极大的便利。对于需要排序的数据,可以