下面从数据库的读写分离和分库分表两方面讲讲如何进行数据库优化
数据库的读写分离
- 基本原理:让主数据库处理
事务性
查询,从数据库处理Select
查询,当然主数据库也可以提供查询服务。读写分离的最大作用是降低服务器的压力。- 好处:
- 增加了冗余
- 增加了机器处理能力
- 对于
以读为主
的应用,使用读写分离是最好的场景,因为可以确保写的服务器压力更小,而读又可以接受时间上的延迟。- 提高读写分离性能的主要原因:
- 物理服务器增加,负荷增加
- 主从服务器分别负责各自的读写,很大程度缓解了
X锁(排它锁)和S锁(共享锁)
争夺。- 从数据库可以配置
MyISAM引擎
,提高查询性能,节约系统开销- 从数据库同步主数据库与主数据库直接写还是有区别的,从数据库通过主数据库发送来的binlog恢复数据,但最最重要的区别是主数据库向从数据库发送binlog是异步的,从数据库恢复数据也是异步的。
- 读写分离适用于读多写少的场景。如果只有一台服务器 ,则当select很多时,update和delete会被这些select访问中的数据阻塞 ,等待select结束,并发性能并不高。对于读写 比例相近的应用,应该部署双主相互复制。
- 可以在从数据库启动时增加一些参数来提高其读的性能,例如:–skip-innodb, --skip-bdb, --low-priority-updates, 及–delay-key-write=ALL
- 分摊读取,假如我们有一个主数据库,和三个从数据库。假设一分钟有10条写入和150条读取,那么四个数据库一共40条写入,读取总数没变,平均下来,每个数据库承担了10条写入和50条读取(主数据库并不读取)。因此读取请求数大大分摊了,提高了性能。说白了,就是拿机器和带宽换性能。
- MySQL复制另一大功能就是增加冗余和提高可用性。
数据库分库分表
- 核心思路:将原本保存在单表中的过大的数据进行拆分,将数据分散保存在多个数据库的多个表中,避免因为单表数据量太大给数据的访问带来读写性能问题。
- 一个重要的原则:尽可能平均得拆分到后端的数据库中,如果拆分不均匀,还会产生数据访问热点。