mysql分区的分区,简单来说是将一个表根据指定的条件,水平切分.
将一张物理表,切为多个物理表,但在数据库表现上还是一张表.
这样的好处是, 当查询条件可以判定到某张分区表的时候,会只查询这张分区表,而不用整表扫描.
值得注意的是,有外键关联的表不能进行分区. 直到现在这个情况也没有改变. 当前mysql最新版本为5.5.
一. 查看数据库是否支持分区
1
|
SHOW VARIABLES LIKE '%partition%' ;
|
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| have_partition_engine | YES |
+-----------------------+-------+
1 row in set (0.00 sec)
二. 创建分区
分区目前有4个类型 RANGE, LIST, HASH, KEY, 这篇博客要讲的是RANGE类型. 手册里如下描述.
1
|
RANGE : 基于属于一个给定连续区间的列值,把多行分配给分区。 |
注意:RANGE的值只能从小到大,而且,标识列必须包含在主键里.
创建range分区有2种方式,1种是创建表时就创建分区,另1种是创建表后再创建分区.
1.创建表时就创建分区
1
2
3
4
5
6
7
8
9
10
11
12
|
CREATE TABLE members (
id INT ,
fname VARCHAR (25),
entry_time DATETIME,
PRIMARY KEY (`id`,`entry_time`)
) PARTITION BY RANGE(entry_time) (
PARTITION p0 VALUES LESS THAN ( '2013-06-30 23:59:59' ) ENGINE = InnoDB,
PARTITION p1 VALUES LESS THAN ( '2013-12-31 23:59:59' ) ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN ( '2014-06-30 23:59:59' ) ENGINE = InnoDB,
PARTITION p3 VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB
); |
2.创建表后再创建分区
1
2
3
4
5
6
|
ALTER TABLE members PARTITION BY RANGE(entry_time) (
PARTITION p0 VALUES LESS THAN ( '2013-06-30 23:59:59' ) ENGINE = InnoDB,
PARTITION p1 VALUES LESS THAN ( '2013-12-31 23:59:59' ) ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN ( '2014-06-30 23:59:59' ) ENGINE = InnoDB,
PARTITION p3 VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB
); |
分区后, Mysql 将会 members 分成 4个表, 将 '2013-06-30 23:59:59' 以前注册的都放在p0里, 将 '2013-12-31 23:59:59'以前注册的都放在p1里,以此类推,
2014年7月份和以后的都放在p3里.
三. 测试分区
使用 explain partitions 测试查询语句是否精确到单个分区.
1
2
3
4
5
6
7
8
|
explain partitions select count (*) from members where entry_time = '2013-03-01 23:59:59' ;
+ ----+-------------+--------+------------+-------+---------------+-----------+---------+------+------+--------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra |
+ ----+-------------+--------+------------+-------+---------------+-----------+---------+------+------+--------------------------+
| 1 | SIMPLE | school | p0 | index | PRIMARY | id | 8 | NULL | 2 | Using where ; Using index |
+ ----+-------------+--------+------------+-------+---------------+-----------+---------+------+------+--------------------------+
1 row in set (0.00 sec)
|
四. 获取分区信息
1
|
mysql> SHOW CREATE TABLE members\G
|
显示如下
1
2
3
4
5
6
7
8
9
10
11
|
CREATE TABLE members (
id INT ,
fname VARCHAR (25),
entry_time DATETIME
) PARTITION BY RANGE(entry_time) (
PARTITION p0 VALUES LESS THAN ( '2013-06-30 23:59:59' ) ENGINE = InnoDB,
PARTITION p1 VALUES LESS THAN ( '2013-12-31 23:59:59' ) ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN ( '2014-06-30 23:59:59' ) ENGINE = InnoDB,
PARTITION p3 VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB
); |
五. 修改分区(拆分,合并)
拆分
上边 member 的分区,只分到了2014年6月份.现在我们将p3分区重拆分为多个分区.
1
2
3
4
5
6
7
|
ALTER TABLE members REORGANIZE PARTITION p3 INTO (
PARTITION p4 VALUES LESS THAN ( '2014-12-31 23:59:59' ) ENGINE = InnoDB,
PARTITION p5 VALUES LESS THAN ( '2015-06-30 23:59:59' ) ENGINE = InnoDB,
PARTITION p6 VALUES LESS THAN ( '2015-12-31 23:59:59' ) ENGINE = InnoDB,
PARTITION p7 VALUES LESS THAN ( '2016-06-30 23:59:59' ) ENGINE = InnoDB,
PARTITION p8 VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB
); |
合并
再次声明:RANGE的值只能从小到大,而且,标识列必须包含在主键里.
现在将p0,p1,p2合并到m1里.
1
2
3
|
ALTER TABLE members REORGANIZE PARTITION p0,p1,p2 INTO (
PARTITION m1 VALUES LESS THAN ( '2014-06-31 23:59:59' ) ENGINE = InnoDB
); |
六. 重新分区
语法与创建分区一样, 直接 alter by 就可以了.Mysql会将旧分区逻辑删除掉.
比如更改分区 标志列.
1
2
3
4
5
6
|
ALTER TABLE members PARTITION BY RANGE(id) (
PARTITION p0 VALUES LESS THAN (10000) ENGINE = InnoDB,
PARTITION p1 VALUES LESS THAN (20000) ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN (30000) ENGINE = InnoDB,
PARTITION p3 VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB
); |
还可以更改为其他分区类型 如 LIST,HASH等. 举一个HASH的例子, 将id平均分布到5分区表.
1
|
ALTER TABLE members PARTITION BY HASH (id) PARTITIONs 5;
|
七. 删除分区以及分区数据
如非必要,尽量不要用,使用 拆分合并更好一点.
1
|
ALTER TABLE tr DROP PARTITION p1;
|
相关推荐
MySQL分区表是一种优化大型数据表查询效率的技术,它将一个大表分成多个逻辑上相连但物理上独立的部分,每个部分称为一个分区。分区可以按照不同的策略进行,如范围、哈希、列表或复合分区。这样做有助于提高数据...
MySQL分区是一种数据库优化技术,它将大型表分成更小、更易管理的部分,每个部分称为一个分区。这种技术有助于提高查询性能,特别是对于那些需要处理大量数据或执行复杂查询的应用程序。MySQL支持多种分区类型,包括...
### MySQL分区分表方案实践手册知识点详述 #### 一、MySQL分区简介 数据库分区是一项重要的物理数据库设计技术,主要用于优化数据库性能并简化数据管理。MySQL的分区主要包括两种形式:水平分区和垂直分区。 - **...
【MySQL 表分区详解】 MySQL 表分区是一种高级的数据组织技术,它允许将大型表分成较小、更易管理和处理的部分。这种技术对于处理海量数据,尤其是超过亿级别的数据集非常有效,可以显著提升查询性能和数据管理效率...
首先,我们需要理解MySQL分区的概念。分区是将一个大表逻辑上划分为多个较小的部分,每个部分称为一个分区。对于时间序列数据,如日志记录,根据日期或时间进行分区可以显著提高查询速度,因为查询通常针对特定时间...
MySQL 分区是数据库管理系统中的一种优化策略,它将大型表的数据分布在不同的物理存储上,以提高查询性能和便于管理大量数据。分区的本质是将一张大表逻辑上分成多个部分,但用户在操作时仍然将其视为单个表。MySQL ...
MySQL表分区是数据库管理系统(DBMS)中用于提高大数据量表的存储性能和管理效率的一种技术。通过对一个大表进行分区,可以将数据分散存储到多个物理区域中,从而改善性能,尤其是在涉及大量读写操作的场景中。MySQL...
MySQL 5.5.8 版本在数据库领域是一个重要的里程碑,它引入了许多性能改进和新特性,尤其是在分区表方面。分区表是大型数据库系统中优化查询性能的一种策略,通过将大表的数据逻辑上划分为更小、更易管理的部分。在...
"互联网公司为啥不使用mysql分区表" 在互联网公司中,mysql分区表是一个比较少用的技术,这是因为分区表存在一些缺陷和限制,使得互联网公司更多地选择自己分库分表来水平扩展数据库。 首先,分区表的设计需要考虑...
#### 一、MySQL分区概述与应用场景 在当今互联网行业中,MySQL数据库作为最常用的关系型数据库之一,在数据管理方面扮演着极其重要的角色。随着数据量的不断增长,对数据库性能的要求也日益提高。为了提高查询效率...
在转换过程中,可能需要将MySQL的数据分布策略转换为Oracle的表空间或分区策略。 5. **索引和约束**: MySQL与Oracle的索引类型和约束定义(如主键、外键)也有所不同,转换时需要注意。 6. **存储过程和函数**:...
MySQL 数据库表分区是一种优化大数据查询的技术,尤其适用于存储海量数据的应用场景。通过将大表分成更小、更易管理的部分,分区可以提高查询性能,减少数据处理的时间,并且简化数据管理和备份过程。 1. **分区...
2. **性能评估**:PostgreSQL可能有不同的性能优化策略,迁移后可能需要调整索引、分区、缓存等设置。 3. **应用程序修改**:如果应用程序直接与数据库交互,可能需要对SQL查询进行相应调整,以适应PostgreSQL的...
mysql主从复制与分区技术: 主讲:李健; QQ:89267659; 1、mysql用户授权; 2、mysql bin-log日志; 3、mysql主从复制; 4、mysql分区技术;
MySQL数据库分区技术,解决多并发问题,详细描述分区流程及操作步骤
MySQL分区是数据库管理系统MySQL中的一种数据存储管理技术,它允许用户将数据表拆分成多个较小的、更容易管理的片段。这些片段被称为分区。通过这种技术可以提高数据库的性能,便于维护和备份,并且可以对不同分区...