mysq中有一种机制是表锁定和行锁定,是为了保证数据的完整性。表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行。行锁定也一样,别的sql必须等我对这条数据操作完了,才能对这条数据进行操作。当出现这种情况时,我们可以考虑分表或分区。
一、分表
分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。这些表可以分布在同一块磁盘上,也可以在不同的机器上。app读写的时候根据事先定义好的规则得到对应的表名,然后去操作它。分表的目的就是减小数据库的负担,缩短查询时间。
1、分表的类型
(1)垂直切分
是指数据表列的拆分,把一张列比较多的表拆分为多张表。
(2)水平切分
是指数据表行的拆分,把一张的表的数据拆成多张表来存放。
2、利用merge存储引擎来实现分表
(1)创建一个完整表,存储着所有的成员信息(表名为member)
(2)把member分成两个表tb_member1,tb_member2
(3)查看tb_member表的结构
注:查看子表和主表的字段定义要一致
(4)把数据分到两个表中:
注:总表只是一个外壳,存取数据发生在一个一个的子表里面。
每个子表都有自己独立的相关表文件,而主表只是一个壳,没有完整的相关表文件
二、分区
分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,分区后,表还是一张表,但数据散列到多个位置了。app读写的时候操作的还是表名字,db自动去组织分区的数据。
1、分区的两种形式
(1)水平分区
对表的行进行分区,所有在表中定义的列在每个数据集中都能找到,所以表的特性依然得以保持。
(2)垂直分区
是通过对表的垂直划分来减少目标表的宽度,使某些特定的列被划分到特定的分区,每个分区都包含了其中的列所对应的行。
2、分区的技术支持
3、测试
(1)创建range分区表
(2)插入一些数据
(3)到存放数据库文件的地方看一下
4、分区的合并和删除
5、分区表和未分区表的性能测试
结果表明分区表比未分区表的执行时间少的多。
通过explain语句分析执行情况
创建索引后测试
创建索引后分区表和未分区表相差不大
6、将不同分区放到不同存储位置
(1)建表时,提前创建好存储目录,并授权给mysql;
(2)创建表格
(3)查看分区情况
查看默认数据存储位置的文件:
Mysql分区类型:
RANGE分区、LIST分区、HASH分区、key分区、columns分区
三、Mysql分表和分区的区别