Mysql的高可用性和高扩展性
Mysql的分表操作和分区的工作原理
分区表
1、原理
- 对于用户而言,分区表是一个独立的逻辑表,但是底层的Mysql将其分成了多个物理子表,对于用户来说是透明的,每一个分区表都会使用一个独立的表文件
- 创建表时使用partition by子句定义每个分区存放的数据,执行查询时,优化器会根据分区定义那些没有我们需要数据的分区,这样查询只需要查询我们需要数据的分区即可
- 分区的主要目的是将数据按照比较粗的颗粒度分在不同的表中,这样可以将相关的数据存放在一起,而且想一次性删除相关分区的数据也比较方便
2、适用场景
- 表非常大,无法全部存放在内存里,或者只在表的最后有热点数据,其他都是历史数据
- 分区表的数据更容易维护,可以对对立的分区表进行独立的操作
- 分区表的数据可以分布在不同的机器上,从而提高使用效率
- 可以使用分区表来避免某些特殊的瓶颈
- 可以备份和恢复独立的分区
3、限制
- 一个表最多只能有1024个分区
- 5.1版本中,分区表表达式只能是整数,5.5可以使用列分区
- 分区字段中如果有主键和唯一索引列,那么主键列和索引列和唯一列都必须包含进来
- 分区表中无法使用外键约束
- 需要对现表的结构进行修改
- 所有分区都必须使用相同的存储引擎
- 某写存储引擎是不支持分区的(MyISAM和InnoDB都是支持的)
- 对于MyISAM引擎的分区表,不能使用load index to cache
- 对与MyISAM表,使用分区表时需要打开更多的文件描述符
分库分表
1、原理
- 通过hash算法或工具实现将一张表数据垂直或水平进行物理切分
2、使用场景
- 单表数据记录达到百万或者千万级别时
- 解决表锁的问题
3、分表方式
分表方式 | 描述 |
---|---|
水平分割 | 表很大分割后可以降低在查询需要读的数据的和索引的页数,同时也降低了索引的层数,提高查询效率 |
垂直分表 | 把主键和一些列放在一张表,把主键和另外的列放在另一种表中 |
4、水平分表使用场景
- 表中数据本身就有独立性
- 需要把数据存放到多个介质上
5、水平分表的缺点
- 给应用增加复杂度,通常查询时需要多个表名,查询所有数都需union操作
- 在许多数据库应用中,这种复杂度会超过他带来的优点,查询的时候会增加一个索引层的磁盘次数