读一读

  1. 在主库上把数据更改记录到二进制日志中(二进制日志事件)。

  2. 备库将主库上的日志复制到自己的中继日志中。

  3. 备库读取中继日志中的事件,将其重放到备库数据上。

QQ图片20171024144940.png


Mysql内建的复制功能是构建基于Mysql的大规模,高性能应用的基础,这类应用使用所谓的“水平扩展”的架构。我们可以通过为服务器配置一个或多个备库的方式来进行数据同步。复制功能不仅有利于构建高性能的应用,同时也是高可用性、可扩展性、灾难恢复、备份以及数据仓库等工作的基础。


InnoDB使用日志减少提交事务的开销。因为日志中已经记录了事务,就无须在每个事务提交时把缓冲池的脏块刷新到磁盘中。事务修改的数据和索引通常会映射到表空间的随机位置,所以刷新这些变更到磁盘需要很多的随机I/O(磁头的移动耗时)。

InnoDB用日志把随机I/O变成顺序I/O。一旦日志安全写到磁盘,事务就持久化了,即使变更还没写到数据文件。(InnoDB可以重放日志并且恢复已经提交的事务)


线程缓存保存那些当前没有与链接关联但是准备为后面新的连接服务的线程。当一个新的链接创建时,如果缓存中有线程存在,Mysql从缓存中删除一个线程,并且把它分配给这个新的连接。当连接关闭时,如果线程缓存还有空间的话,Mysql又会把线程放回缓存。thread_cache_size变量指定了Mysql可以保持在缓存中的线程数。


如果大部分都是InnoDB表,InnoDB缓冲池或许比其他任何东西更需要内存。InooDB缓冲池并不仅仅缓存索引:它还会缓存行的数据,自适应哈希索引,插入缓冲,锁,以及其他内部数据结构。InnoDB还使用缓冲池来帮助延迟写入,这样就能合并多个写入操作,然后一起顺序地写回。

最重要的选项:

innodb_buffer_pool_size

innodb_log_file_size


  1. InnoDB缓冲池

  2. InnoDB日志文件和MyISAM数据的操作系统缓存

  3. MyISAM键缓存

  4. 查询缓存

  5. 无法手工配置的缓存,例如二进制日志和表定义文件的操作系统缓存


  1. 确定可以使用的内存上限。

  2. 确定每个连接Mysql需要使用多少内存,例如排序缓存和临时表。

  3. 确定操作系统需要多少内存才够用。

  4. 把剩下的内存全部给Mysql的缓存,例如InnoDB的缓冲池,这样做很有意义。


  1. 从服务器内存总量开始。

  2. 减去操作系统和其他程序的内存。

  3. 减去MySQL自身需要的内存。

  4. 减去足够让操作系统缓存InnoDB日志文件的内存,至少是足够缓存最近经常访问的部分。

  5. 减去其他配置的Mysql缓冲和缓存需要的内存。

  6. 除以1.05,这差不多接近InnoDB管理缓存池增加的自身管理开销。

  7. 结果四舍五入,向下取一个合理值。


配置项可以有多个作用域。有些设置是服务器级的(全局作用域),有些对每个链接是不同的(会话作用域),剩下的一些是对象级的。

除了在配置文件中设置变量,很多变量也可以在服务器运行时修改。MySQL把这些归为动态配置变量。动态地设置变量,可能会在MySql关闭时丢失这些设置。


配置文件通常分成多个部分,每个部分的开头是一个用方括号括起来的分段名称。MySQL程序通常读取跟它同名的分段部分,许多客户端程序还会读取client部分,这是一个存放公用设置的地方。服务器通常读取mysqld这一段。一定要确定配置项放在了文件正确的分段中,否则配置是不会生效的。