一、mysql为什么要做主从复制
二、如何设置mysql的主从复制
三、mysql主从复制的原理是什么?
MySQL 使用3个线程来执行复制功能,其中1个在主服务器上,另两个在从服务器上。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。
主服务器创建一个线程将二进制日志中的内容发送到从服务器。该线程可以识别为主服务器上SHOW PROCESSLIST的输出中的Binlog Dump线程。
从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。
第3个线程是SQL线程,是从服务器创建用于读取中继日志并执行日志中包含的更新。
四、mysql为什么要做读写分离
五、如何设置mysql的读写分离
六、mysql读写分离的原理是什么?
七、使用读写分离后有什么问题,该如何解决?
八、什么是分库分表?
分库分表就是为了解决由于数据量过大导致的数据库性能降低的问题,我们可以将原来的较大的数据库拆分成多个数据库,原来较大的数据表拆分成多个表,从而降低单个数据库或数据表中的数据量,可以提升数据库的性能
九、为什么需要分库分表?
十、如何实现分库分表?
分库分表包括分库和分表两个部分,在生产中通常包括:垂直分库、水平分库、垂直分表、水平分表四种方式。
10.1 垂直分表
垂直分表定义:将一个表按照字段分成多表,每个表存储其中一部分字段。
垂直分表带来的提升:
(1)避免了IO争抢并减少了锁表的几率
(2)充分发挥了热门数据的操作效率,当我们浏览热门数据时,是高效的,不会被那些低效率的操作所拖累。
为什么大字段IO效率低:
第一是由于数据量本身大,需要更长的读取时间;
第二是跨页,页是数据库存储单位,很多查找及定位操作都是以页为单位,单页内的数据行越多数据库整体性能越好,而大字段占用空间大,单页内存储行数少,因此IO效率较低。
第三,数据库以行为单位将数据加载到内存中,这样表中字段长度较短且访问频率较高,内存能加载更多的数据,命中率更高,减少了磁盘IO,从而提升了数据库性能。
通常我们按以下原则进行垂直拆分:
(1)把不常用的字段单独放在一张表;
(2)把text,blob等大字段拆分出来放在附表中;
(3)经常组合查询的列放在一张表中
10.2 垂直分库
垂直分库是指按照业务将表进行分类,分布到不同的数据库上面,每个库可以放在不同的服务器上,它的核心理念是专库专用。
它带来的提升是:
(1)解决业务层面的耦合,业务清晰
(2)能对不同业务的数据进行分级管理、维护、监控、扩展等
(3)高并发场景下,垂直分库一定程度的提升IO、数据库连接数、降低单机硬件资源的瓶颈
10.3 水平分库
#水平分库是把同一个表的数据按一定规则拆到不同的数据库中,每个库可以放在不同的服务器上
它带来的提升是:
(1)解决了单库大数据,高并发的性能瓶颈。
(2)提高了系统的稳定性及可用性。
10.4 水平分表
水平分表是在同一个数据库内,把同一个表的数据按一定规则拆到多个表中
它带来的提升是:
(1)优化单一表数据量过大而产生的性能问题
(2)避免IO争抢并减少锁表的几率
(3)库内的水平分表,解决了单一表数据量过大的问题,分出来的小表中只包含一部分数据,从而使得单个表的数据量变小,提高检索性能
总结
(1)垂直分表:可以把一个宽表的字段按访问频次、是否是大字段的原则拆分为多个表,这样既能使业务清晰,还能提升部分性能。拆分后,尽量从业务角度避免联查,否则性能方面将得不偿失。
(2)垂直分库:可以把多个表按业务耦合松紧归类,分别存放在不同的库,这些库可以分布在不同服务器,从而使访问压力被多服务器负载,大大提升性能,同时能提高整体架构的业务清晰度,不同的业务库可根据自身情况定制优化方案。但是它需要解决跨库带来的所有复杂问题。
(3)水平分库:可以把一个表的数据(按数据行)分到多个不同的库,每个库只有这个表的部分数据,这些库可以分布在不同服务器,从而使访问压力被多服务器负载,大大提升性能。它不仅需要解决跨库带来的所有复杂问题,还要解决数据路由的问题(数据路由问题后边介绍)。
(4)水平分表:可以把一个表的数据(按数据行)分到多个同一个数据库的多张表中,每个表只有这个表的部分数据,这样做能小幅提升性能,它仅仅作为水平分库的一个补充优化。
一般来说,在系统设计阶段就应该根据业务耦合松紧来确定垂直分库,垂直分表方案,在数据量及访问压力不是特别大的情况,首先考虑缓存、读写分离、索引技术等方案。若数据量极大,且持续增长,再考虑水平分库水平分表方案。