由 ​​mysql的主从复制和读写分离​​ 原理可知,所谓主从复制,按惯用的基于语句复制模式,是从库将主库的日志里的各种SQL语句,在从库重新执行了一遍。

这就引出一个问题,主从复制、读写分离,真的可以提高性能吗?

如果一台机上的关系型数据库,既要写入数据,又要提供读取服务,那么在各种锁机制之下,可以想见,效率一定不高。现在读写分离,主机写,从机读,听上去真不错。——但是,仔细一想,就觉得不对。主机只有写入,并无读取,当然压力较小;但从机一方面供外部读取,一方面又要同步,同步机制仍然是执行SQL语句,这不是跟原来一样了吗?!

如果是一主多从,多台从机,可以利用负载均衡或路由算法,减轻压力,但如果是只有一台从机,那么从机的压力岂不是跟原来一样?

唯一得到的好处,是外部写入数据速度会快一些,因为外部只写入主库,没有读取。

不过,按照常理分析,主从复制、读写分离机制能够盛行,肯定是有比较明显的好处的,就算是一主一从,性能也一定不会像我想的那样没有提高。

其原因在于,系统提供的主从复制机制,和我们单纯通过SQL语句来更新还是差别很大的。一方面不需要做sql解析和复杂的写查询;另一方面,从机重放SQL的时候,只要回放到内存中,修改内存的数据就可以了,之后再持久化到磁盘,所以速度要快上许多。实际测试可以发现,实际上数据库至少一大半的cpu是消耗到sql解析处理的。SQL语句执行的性能取决于3部分:
1)解析SQL时间
2)执行SQL时间
3)执行结果获取时间


20210325
我忽然想到,数据库分为主从俩库,一种写,一种读,还有个好处就是可以加强优化和编程的针对性。比如说,用mysql,主库用innodb存储模式,从库是myisam,读起来会快些。编程方面,传说中有CQRS模式,命令查询职责分离,就是操作SQL的语句,不是CRUD了,而是分为命令和查询两大块,命令增删改,查询只负责查找,它们分开以后,就可以在代码方面加以针对性的优化。具体咋优化,没用过,不清楚。