什么是分区?

这里讲的分区,此“区”非彼“区”,这里讲的分区的意思是指将同一表中不同行的记录分配到不同的物理文件中,几个分区就有几个.idb文件,不是我们刚刚说的区。MySQL在5.1时添加了对水平分区的支持。分区是将一个表或索引分解成多个更小,更可管理的部分。每个区都是独立的,可以独立处理,也可以作为一个更大对象的一部分进行处理。这个是MySQL支持的功能,业务代码无需改动。要知道MySQL是面向OLTP的数据,它不像TIDB等其他DB。

什么情况使用分区?

我们的数据库数据越来越大,随之而来的是单个表中数据太多。以至于查询速度变慢,而且由于表的锁机制导致应用操作也受到严重影响,出现了数据库性能瓶颈。mysql数据库的分区技术,可以有效地解决大数据量引起的读写效率低的问题。

数据库分区技术是mysql5.1版本以后才有的,该技术实现的目的大致上与数据库的分表技术类同,不过对于php开发人员来说不用修改所读取的表名,大大减少了由于分为多个水平表引起的维护代价。

一般来说一个数据库超过了1000万条时,各种查询开销都会很多,如果使用索引,索引占用内存与CPU也是很大的,这时候就需要考虑分表或者分区了,分表之后引起了代码维护量过多,这里建议分区,分区其实也会生成多个物理上的文件,但是逻辑上还是同一个表。

mysql中有一种机制是表锁定和行锁定,是为了保证数据的完整性。表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行。行锁定也一样,别的sql必须等我对这条数据操作完了,才能对这条数据进行操作。当出现这种情况时,我们可以考虑分表或分区。

如何mysql是否能分区呢:

可以输入以下命令:mysql>SHOW PLUGINS;

如果可以分区会在表中找到以下行:




mysql 创建二级分区hash mysql分区表加分区_数据库


分区表在逻辑上为一个表,在物理上存储在多个文件中:


mysql 创建二级分区hash mysql分区表加分区_数据库_02

该表是正常未分区表


mysql 创建二级分区hash mysql分区表加分区_mysql 创建二级分区hash_03

该表是已分区表


按照hash分区:

  • 根据分区键分区数的值把数据行存储到表的不同分区
  • 数据可以平局分到各个区
  • HASH分区键值必须是INT类型或通过函数可以转为int类型

按照范围(RANGE)分区(适用于分区键为日期与时间类型,最好查询中包括分区键,特别适用于定期按照分区范围清理历史数据):

  • 根据分区键值的范围把数据行存储到表中不同分区中;
  • 多个分区的范围连续但是不能重叠