MySQL复制原理与事务隔离级别解析

需积分: 40 895 下载量 22 浏览量 更新于2024-08-09 收藏 784KB PDF 举报
"MySQL 面试相关知识,包括缓存参数、事务隔离级别以及复制原理" 在MySQL中,缓存参数对于性能优化起着至关重要的作用。查询缓存(query cache)是MySQL的一种特性,允许服务器存储已解析并执行的查询结果,以便后续相同的查询可以直接从缓存中获取结果,而无需再次执行查询。以下是一些关键的缓存参数: 1. `query_cache_size`:这是设置MySQL查询缓存的最大大小,单位通常是字节。如果设置得太大,可能会占用过多内存,而设置得太小则可能无法充分利用缓存。 2. `query_cache_type`:此参数控制查询缓存的行为。它可以设置为`0`(禁用缓存)、`1`(对所有查询启用缓存,除非查询明确禁止)或`2`(只对那些显式请求被缓存的查询启用缓存)。 3. `query_cache_limit`:定义了单个查询结果能被缓存的最大大小。如果查询结果超过这个限制,该查询将不会被缓存。 4. `maximum_query_cache_size`:这是一个错误的参数,可能是拼写错误或者是版本更迭后的废弃参数,正确的应该是`query_cache_size`。 MySQL支持四种不同的事务隔离级别,这些级别决定了在一个事务中能读取到什么样的数据,从而影响并发事务间的数据一致性: 1. **读未提交(read uncommitted)**:最低的隔离级别,允许读取未被其他事务提交的数据,可能会出现脏读。 2. **读已提交(read committed)**:每次读取的数据都是在当前事务开始后其他事务已经提交的,避免了脏读,但可能出现不可重复读。 3. **可重复读(repeatable read)**:在同一个事务内多次读取同一数据块时,保证数据保持一致,不会出现不可重复读,但在某些情况下仍可能遇到幻读问题。 4. **串行化(serializable)**:最高的隔离级别,所有事务按顺序执行,确保无脏读、不可重复读和幻读,但可能导致性能下降,因为需要进行更多的锁定。 MySQL的复制功能是用于实现主从数据库间的同步,确保数据的一致性和高可用性。复制过程主要涉及三个线程: 1. **Master上的binlogdump线程**:当主数据库上发生事务提交时,会将binlog事件写入binlog文件,并通过这个线程传递到从库。 2. **Slave上的IO线程**:接收并存储来自Master的binlog事件到中继日志(relay log)。 3. **Slave上的SQL线程**:读取中继日志并执行其中的事件,将数据更新到从库。 为了保证数据一致性,MySQL引入了一些机制,例如在5.6版本后,使用`relay_log_info_repository=TABLE`可以将SQL线程的位置记录在数据库表中,提高一致性。另外,GTID(Global Transaction Identifier)复制和半同步复制也是提高复制一致性和数据安全的重要手段。半同步复制确保了在主库的事务提交前,其对应的binlog事件已被至少一个从库接收,以此来保证至少有一个从库与主库同步。