`
这些年
  • 浏览: 397862 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mysql分区(转)

 
阅读更多

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 表分区是一种高级的数据组织技术,它允许将大型表分成较小、更易管理和处理的部分。这种技术对于处理海量数据,尤其是超过亿级别的数据集非常有效,可以显著提升查询性能和数据管理效率...

    mysql实现自动创建与删除分区

    首先,我们需要理解MySQL分区的概念。分区是将一个大表逻辑上划分为多个较小的部分,每个部分称为一个分区。对于时间序列数据,如日志记录,根据日期或时间进行分区可以显著提高查询速度,因为查询通常针对特定时间...

    mysql分区文档

    MySQL 分区是数据库管理系统中的一种优化策略,它将大型表的数据分布在不同的物理存储上,以提高查询性能和便于管理大量数据。分区的本质是将一张大表逻辑上分成多个部分,但用户在操作时仍然将其视为单个表。MySQL ...

    mysql表分区

    MySQL表分区是数据库管理系统(DBMS)中用于提高大数据量表的存储性能和管理效率的一种技术。通过对一个大表进行分区,可以将数据分散存储到多个物理区域中,从而改善性能,尤其是在涉及大量读写操作的场景中。MySQL...

    MySQL 5.5.8 分区表性能测试

    MySQL 5.5.8 版本在数据库领域是一个重要的里程碑,它引入了许多性能改进和新特性,尤其是在分区表方面。分区表是大型数据库系统中优化查询性能的一种策略,通过将大表的数据逻辑上划分为更小、更易管理的部分。在...

    互联网公司为啥不使用mysql分区表

    "互联网公司为啥不使用mysql分区表" 在互联网公司中,mysql分区表是一个比较少用的技术,这是因为分区表存在一些缺陷和限制,使得互联网公司更多地选择自己分库分表来水平扩展数据库。 首先,分区表的设计需要考虑...

    MySQL分区实战

    #### 一、MySQL分区概述与应用场景 在当今互联网行业中,MySQL数据库作为最常用的关系型数据库之一,在数据管理方面扮演着极其重要的角色。随着数据量的不断增长,对数据库性能的要求也日益提高。为了提高查询效率...

    Mysql转oracle工具

    在转换过程中,可能需要将MySQL的数据分布策略转换为Oracle的表空间或分区策略。 5. **索引和约束**: MySQL与Oracle的索引类型和约束定义(如主键、外键)也有所不同,转换时需要注意。 6. **存储过程和函数**:...

    mysql 数据库表分区

    MySQL 数据库表分区是一种优化大数据查询的技术,尤其适用于存储海量数据的应用场景。通过将大表分成更小、更易管理的部分,分区可以提高查询性能,减少数据处理的时间,并且简化数据管理和备份过程。 1. **分区...

    mysql语句转postgres的工具

    2. **性能评估**:PostgreSQL可能有不同的性能优化策略,迁移后可能需要调整索引、分区、缓存等设置。 3. **应用程序修改**:如果应用程序直接与数据库交互,可能需要对SQL查询进行相应调整,以适应PostgreSQL的...

    Mysql主从与分区技术.pdf

    mysql主从复制与分区技术: 主讲:李健; QQ:89267659; 1、mysql用户授权; 2、mysql bin-log日志; 3、mysql主从复制; 4、mysql分区技术;

    MySQL数据库分区技术

    MySQL数据库分区技术,解决多并发问题,详细描述分区流程及操作步骤

    mysql分区.pdf

    MySQL分区是数据库管理系统MySQL中的一种数据存储管理技术,它允许用户将数据表拆分成多个较小的、更容易管理的片段。这些片段被称为分区。通过这种技术可以提高数据库的性能,便于维护和备份,并且可以对不同分区...

Global site tag (gtag.js) - Google Analytics