MySQL数据库分表方式

87 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。


当MySQL单表记录数过大时,数据库的CRUD性能会明显下降,一些常见的优化措施如下

l 限定数据的范围: 务必禁止不带任何限制数据范围条件的查询语句。比如:我们当用户在查询订单历史的时候,我们可以控制在一个月的范围内。;

l 读/写分离: 经典的数据库拆分方案,主库负责写,从库负责读;

l 缓存:使用MySQL的缓存,另外对重量级、更新少的数据可以考虑使用应用级别的缓存;  

还有就是通过分库分表的方式进行优化。主要有垂直分区、垂直分表、水平分区、水平分表

1. 数据库分表方式****

 

(1) 垂直分区****

简单来说垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表

垂直拆分的优点:使得行数据变小,在查询时减少读取的Block数,减少I/O次数

垂直拆分的缺点:主键会出现冗余,需要管理冗余列,并会引起Join操作,让事务变得更加复杂

(1) 垂直分表****

把主键和一些列放在一个表,然后把主键和另外的列放在另一个表中

优点:

①减少不必要数据的查询:比如一个表中某些列常用,另外一些列不常用

②可以使数据行变小,一个数据页能存储更多数据,查询时减少I/O次数

缺点:

①扩展性较差:有些分表的策略基于应用层的逻辑算法,一旦逻辑算法改变,整个分表逻辑都会改变

②增加开发成本:对于应用层来说,逻辑算法增加开发成本

③管理冗余列,查询所有数据需要join操作

 

(2) 水平分区****

保持数据表结构不变,把一张表的数据分成N多个区块,区块可以在同一个磁盘上,也可以在不同的磁盘上

一张大表进行分区后,他还是一张表,不会变成二张表,只不过把存放数据的文件分成了许多小块

 

优点:突破磁盘I/O瓶颈,高磁盘的读写能力

水平拆分可以支持非常大的数据量,应用端改造也少,水平拆分最好分库

缺点:分片事务难以解决 ,跨界点Join性能较差,逻辑复杂

 

(3) 水平分表****

一张表分成N多个小表,mysql的分表是真正的分表,一张表分成很多表后,每一个小表都是完整的一张表

取数据的时候,我们可以通过总表来取,总表他不是一张表,没有数据,数据都放在分表里面,可以把总表理解成一个外壳,或者是联接池

 

优点:

①提高单表的并发能力:查寻一次所花的时间变短了,总表可以根据不同 的查询,将并发压力分到不同的小表里面

②提高磁盘I/O性能:本来一个非常大的.MYD文件现在也分摊到各个小表的.MYD中去了

 

 

(4) 水平分区和水平分表的区别****

 

MyIsam 引擎:

一张表对应三个文件,一个.MYD数据文件,.MYI索引文件,.frm表结构文件。

分表是把数据文件MYD和索引文件MYI以及表结构文件frm都进行拆分

分区是根据一定的规则把数据文件MYD和索引文件MYI进行了分割,还多出了一个.par文件,用来记录张表的分区信息

 

InnoDB引擎:

一张表对应两个文件.frm表结构文件和.ibd索引和数据文件

分表是把数据文件.frm文件和.ibd文件进行拆分

分区是根据一定的规则把数据文件.ibd文件进行拆分,新增.par文件(从MySql 5.7.6开始,不再创建.par文件,分区定义存储在内部数据字典中)

 

分区和分表的测重点不同,分表重点是存取数据时,如何提高mysql并发能力上;

而分区呢,如何突破磁盘的读写能力,从而达到提高mysql性能的目的

 

www.cnblogs.com/langtianya/…

blog.csdn.net/weixin_4078…