MySql(高可用,高拓展)
* 分区表原理
-
工作原理
对用户而言,分区表是一个独立的逻辑表,mysql底层将其分成了多个物理子表,每一个分区表都是一个独立的文件
-
适用场景
- 表非常大,无法全部存放在内存中,或者表的最后有热点数据,其他的都是历史数据
- 分区表更容易维护,可以对独立的分区进行操作
- 分区表可以分布在不同的服务器上
- 可以使用分区表避免某些特殊的瓶颈
- 可以恢复和备份独立的分区
-
限制
- 一个表只能有1024个分区
- 5.1版本中,分区表达式必须是整数
- 分区表字段中如果包含主键和唯一所以,那么主键和唯一列必须包含进去
- 分区表中不能使用外键约束
- 如果需要对现有表进行修改
- 所有分区表虚使用相同的存储引擎
- 某些引擎不支持分区
分库分表
- 工作原理
- 通过一些hash算法和工具实现将一张表的数据,垂直拆分和水平拆分
- 使用场景
- 单表记录数到达百万或者千万级别时候
- 解决表锁的问题
- 分表方式
- 水平分割
- 表很大,分割后降低在查询时候所需要读取的数据和索引的页数
- 使用场景
- 表中的数据具有独立性,比如说表中记录各个地区的数据或者不同时期的数据
- 需要把不同的数据存放在不同的介质
- 使用场景
- 缺点
- 给应用增加复杂度,查询某些数据的时候需要定位到数据在某张表
- 表很大,分割后降低在查询时候所需要读取的数据和索引的页数
- 垂直分割
- 将数据表的列进行分割,常用的列和不常用的列拆分成两个表
- 使用场景
- 一个表中一些列不常用,列外一些列常用
- 可以使数据行变小,一个数据也能存储更多的数据,查询时候减少IO次数
- 缺点
- 查询冗余,查询需要进行join操作
- 使用场景
- 将数据表的列进行分割,常用的列和不常用的列拆分成两个表
- 水平分割
mysql主从复制
- 工作原理
- 在主库上把数据更改记录到二进制文件,从库将 主库的日志复制到自己的中继日志当中。从库读取日志,将数据重写到从库数据当中。
- 主从复制解决的问题
- 数据分布:随意停止或开始复制
- 负载均衡:降低单个服务器压力
- 高可用和故障切换:某个节点失败后其他节点顶替其工作,避免程序崩溃
- 异步复制:也是默认的主从同步方式。这种方式的优点是效率高。缺点是不能保证数据一定会到达slave。可能会受到网络等原因出现延迟,导致主从数据不一致。当前对master中的表进行数据操作,master将事务Binlog事件写入到Binlog文件中,此时主库只会通知一下Dump线程发送这些新的Binlog到slave(slave的 I/O 线程读取并将事件写入relay-log中)然后主库就会继续处理提交操作,而此时不会保证这些Binlog传到任何一个从库节点上。
- 全同步复制:优点是能够保证数据的强一致性,缺点是效率太低。当master上有提交事务之后,Dump线程发送这些新的Binlog到slave上,并且必须等待所有的slave回复成功(所有从库将事件写入中继日志,并将数据写入数据库)才能继续下一步操作。
- 半同步复制:优点是在耗费少量性能的基础上能在一定程度上保证数据的一致性。当master上有提交事务之后,Dump线程发送这些新的Binlog到slave上,并且必须等待其中一个slave回复成功(slave将事件写入relay-log)才能继续下一步操作。