"这篇资料是关于MySQL数据库面试的常见问题集锦,涵盖了事务的ACID特性、隔离级别、存储引擎的对比、优化策略等多个关键知识点。"
1. 事务的ACID特性:
- Atomicity(原子性):事务中的所有操作要么全部成功,要么全部失败,不允许部分执行。
- Consistency(一致性):事务完成后,数据库的状态将从一个一致状态转换到另一个一致状态。
- Isolation(隔离性):在事务处理过程中,确保并发执行的事务不会互相干扰,避免数据不一致。
- Durability(持久性):一旦事务提交,其对数据库的修改就是永久的,即使系统故障也不会丢失。
2. MySQL的四种事务隔离级别:
- Read Uncommitted(读未提交):最低级别,可能存在脏读、不可重复读和幻读。
- Read Committed(读已提交):每次读取的数据都是已提交的,能避免脏读,但可能出现不可重复读。
- Repeatable Read(可重复读):MySQL默认级别,防止了脏读和不可重复读,但在某些情况下可能出现幻读。
- Serializable(串行化):最高级别,完全避免了脏读、不可重复读和幻读,但性能较低。
3. 死锁:
- 如果两个事务A和B相互等待对方释放资源,就会形成死锁。解决方法包括超时回滚、死锁检测与解除等。
4. 存储引擎:
- MyISAM:非事务安全,适用于只读或写少的场景,占用空间小,但不支持行级锁定。
- InnoDB:提供事务支持,包括ACID特性,支持行级锁定,更适合处理大量写操作的场景。
- HEAP:内存表,速度快但数据不持久化。
- InnoDB和MyISAM的对比还包括:InnoDB支持外键,而MyISAM不支持;InnoDB使用MVCC(多版本并发控制)提高并发性能,MyISAM则不具备此机制。
5. InnoDB优化策略:
- Insert Buffer:用于合并插入操作,减少对主键索引的直接写入。
- Double Write:保证数据页的完整性,避免数据丢失。
- Adaptive Hash Index(ahi):自适应哈希索引,根据查询模式自动创建哈希索引,提高查询速度。
- Read Ahead:预读技术,提前加载即将使用的数据页。
6. 查询性能:
- MyISAM对`SELECT COUNT(*)`操作更快,因为它记录了行数;而InnoDB需要扫描全表。
- InnoDB支持行级锁定,适合大数据量的并发查询。
7. 索引类型:
- 单列索引、组合索引、唯一索引、主键索引、全文索引等,选择合适的索引类型可以显著提升查询效率。
8. 数据库设计:
- 正确设计数据库模式,避免冗余数据,遵循第三范式和BCNF(巴斯-科德范式)以减少数据不一致。
9. SQL语句优化:
- 使用JOIN替代子查询提高性能。
- DELETE和INSERT语句中避免使用LIMIT,这会导致全表扫描。
- 使用EXISTS代替IN,避免大结果集的临时表。
- HAVING用于聚合函数后的条件过滤,WHERE用于原始数据筛选,合理使用能提高效率。
- 避免在WHERE子句中使用!=或<>操作符,这可能导致全表扫描。
10. 数据类型选择:
- 选择合适的数据类型,如日期时间类型(DATE, TIME)、字符串(CHAR, VARCHAR)、二进制(BLOB)、数字(INT, BIGINT)等,合理节省存储空间。
- 对于IP地址,可以使用INET_ATON和INET_NTOA进行转换和存储。
- 枚举(ENUM)类型可以节省存储空间,但需谨慎使用,避免枚举值过多导致维护困难。
以上是MySQL数据库面试题中涉及的一些核心知识点,深入理解和掌握这些内容对于通过面试和实际工作都至关重要。