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

MySQL分区总结

阅读更多
MySQL支持RANGE,LIST,HASH和KEY四种分区。其中,每个分区又都有一种特殊的类型。对于RANGE分区,有RANGE COLUMNS分区。对于LIST分区,有LIST COLUMNS分区。对于HASH分区,有LINEAR HASH分区。对于KEY分区,有LINEAR KEY分区。具体如下:

RANGE分区

RANGE即范围分区,根据区间来判断位于哪个分区,譬如,在下例中,如果store_id小于6,则新增或修改的记录会被分配到p0分区,如果大于6小于11,则记录会被分配到p1分区,依次类推。类似于编程语言中的if ... elseif ...语句。

格式如下:

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT NOT NULL,
    store_id INT NOT NULL
)
PARTITION BY RANGE (store_id) (
    PARTITION p0 VALUES LESS THAN (6),
    PARTITION p1 VALUES LESS THAN (11),
    PARTITION p2 VALUES LESS THAN (16),
    PARTITION p3 VALUES LESS THAN MAXVALUE
);

注意:

1. RANGE分区的返回值必须为整数。

2. PARTITION p3 VALUES LESS THAN MAXVALUE 是非必需的。

RANGE COLUMNS分区

RANGE COLUMNS是RANGE分区的一种特殊类型,它与RANGE分区的区别如下:

1. RANGE COLUMNS不接受表达式,只能是列名。而RANGE分区则要求分区的对象是整数。

2. RANGE COLUMNS允许多个列,在底层实现上,它比较的是元祖(多个列值组成的列表),而RANGE比较的是标量,即数值的大小。

3. RANGE COLUMNS不限于整数对象,date,datetime,string都可作为分区列。

格式如下:

CREATE TABLE rcx (
    a INT,
    b INT,
    c CHAR(3),
    d INT
)
PARTITION BY RANGE COLUMNS(a,d,c) (
    PARTITION p0 VALUES LESS THAN (5,10,'ggg'),
    PARTITION p1 VALUES LESS THAN (10,20,'mmmm'),
    PARTITION p2 VALUES LESS THAN (15,30,'sss'),
    PARTITION p3 VALUES LESS THAN (MAXVALUE,MAXVALUE,MAXVALUE)
);

同RANGE分区类似,它的区间范围必须是递增的,有时候,列涉及的太多,不好判断区间的大小,可采用下面的方式进行判断:

mysql> SELECT (5,10) < (5,12), (5,11) < (5,12), (5,12) < (5,12);
+-----------------+-----------------+-----------------+
| (5,10) < (5,12) | (5,11) < (5,12) | (5,12) < (5,12) |
+-----------------+-----------------+-----------------+
|               1 |               1 |               0 |
+-----------------+-----------------+-----------------+
1 row in set (0.07 sec)

关于RANGE COLUMNS的更多说明,可参考MySQL官方文档:

http://dev.mysql.com/doc/refman/5.6/en/partitioning-columns-range.html

LIST分区

LIST即列表分区。

格式如下:

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY LIST(store_id) (
    PARTITION pNorth VALUES IN (3,5,6,9,17),
    PARTITION pEast VALUES IN (1,2,10,11,19,20),
    PARTITION pWest VALUES IN (4,12,13,14,18),
    PARTITION pCentral VALUES IN (7,8,15,16)
);

LIST COLUMNS分区

LIST COLUMNS分区同样是LIST分区的一种特殊类型,它和RANGE COLUMNS分区较为相似,同样不接受表达式,同样支持多个列支持string,date和datetime类型。

格式如下:

CREATE TABLE customers_1 (
    first_name VARCHAR(25),
    last_name VARCHAR(25),
    street_1 VARCHAR(30),
    street_2 VARCHAR(30),
    city VARCHAR(15),
    renewal DATE
)
PARTITION BY LIST COLUMNS(renewal) (
    PARTITION pWeek_1 VALUES IN('2010-02-01', '2010-02-02', '2010-02-03',
        '2010-02-04', '2010-02-05', '2010-02-06', '2010-02-07'),
    PARTITION pWeek_2 VALUES IN('2010-02-08', '2010-02-09', '2010-02-10',
        '2010-02-11', '2010-02-12', '2010-02-13', '2010-02-14'),
    PARTITION pWeek_3 VALUES IN('2010-02-15', '2010-02-16', '2010-02-17',
        '2010-02-18', '2010-02-19', '2010-02-20', '2010-02-21'),
    PARTITION pWeek_4 VALUES IN('2010-02-22', '2010-02-23', '2010-02-24',
        '2010-02-25', '2010-02-26', '2010-02-27', '2010-02-28')
);

多列格式如下:

CREATE TABLE customers_2 (
    first_name VARCHAR(25),
    last_name VARCHAR(25),
    street_1 VARCHAR(30),
    street_2 VARCHAR(30),
    city VARCHAR(15),
    renewal DATE
)
PARTITION BY LIST COLUMNS(city,last_name,first_name) (
    PARTITION pRegion_1 VALUES IN (('Oskarshamn', 'Högsby', 'Mönsterås'),('Nässjö', 'Eksjö', 'Vetlanda')),
    PARTITION pRegion_2 VALUES IN(('Vimmerby', 'Hultsfred', 'Västervik'),('Uppvidinge', 'Alvesta', 'Växjo'))
);

HASH分区

和RANGE,LIST分区不同的是,HASH分区无需定义分区的条件。只需要指明分区数即可。

格式如下:

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY HASH(store_id)
PARTITIONS 4;

注意:

1. HASH分区可以不用指定PARTITIONS子句,如上文中的PARTITIONS 4,则默认分区数为1。

2. 不允许只写PARTITIONS,而不指定分区数。

3. 同RANGE分区和LIST分区一样,PARTITION BY HASH (expr)子句中的expr返回的必须是整数值。

4. HASH分区的底层实现其实是基于MOD函数。譬如,对于下表

CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATE)
    PARTITION BY HASH( YEAR(col3) )
    PARTITIONS 4;

如果你要插入一个col3为“2005-09-15”的记录,则分区的选择是根据以下值决定的:

MOD(YEAR('2005-09-01'),4)
=  MOD(2005,4)
=  1

LINEAR HASH分区

LINEAR HASH分区是HASH分区的一种特殊类型,与HASH分区是基于MOD函数不同的是,它基于的是另外一种算法。

格式如下:

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY LINEAR HASH( YEAR(hired) )
PARTITIONS 4;

说明:

1. 它的优点是在数据量大的场景,譬如TB级,增加、删除、合并和拆分分区会更快,缺点是,相对于HASH分区,它数据分布不均匀的概率更大。

2. 具体算法,可参考MySQL的官方文档

http://dev.mysql.com/doc/refman/5.6/en/partitioning-linear-hash.html

KEY分区

KEY分区其实跟HASH分区差不多,不同点如下:

1. KEY分区允许多列,而HASH分区只允许一列。

2. 如果在有主键或者唯一键的情况下,key中分区列可不指定,默认为主键或者唯一键,如果没有,则必须显性指定列。

3. KEY分区对象必须为列,而不能是基于列的表达式。

4. KEY分区和HASH分区的算法不一样,PARTITION BY HASH (expr),MOD取值的对象是expr返回的值,而PARTITION BY KEY (column_list),基于的是列的MD5值。

格式如下:

CREATE TABLE k1 (
    id INT NOT NULL PRIMARY KEY,
    name VARCHAR(20)
)
PARTITION BY KEY()
PARTITIONS 2;

在没有主键或者唯一键的情况下,格式如下:

CREATE TABLE tm1 (
    s1 CHAR(32)
)
PARTITION BY KEY(s1)
PARTITIONS 10;

LINEAR KEY分区

同LINEAR HASH分区类似。

格式如下:

CREATE TABLE tk (
    col1 INT NOT NULL,
    col2 CHAR(5),
    col3 DATE
)
PARTITION BY LINEAR KEY (col1)
PARTITIONS 3;

总结:

1. MySQL分区中如果存在主键或唯一键,则分区列必须包含在其中。

2. 对于原生的RANGE分区,LIST分区,HASH分区,分区对象返回的只能是整数值。

3. RANGE COLUMNS,LIST COLUMNS,KEY,LINEAR KEY分区对象只能是列,不能是基于列的表达式。
分享到:
评论

相关推荐

    mysql 数据库表分区

    总结来说,MySQL的表分区是处理大数据的关键技术,通过PHP类库可以方便地管理和操作分区,提高查询效率。TriggerController.class.php可能涉及到与分区表相关的触发器操作,这在数据管理和维护中是非常重要的。

    MySQL分区和分表技术总结.docx

    MySQL 分区和分表技术总结 MySQL 分区和分表技术是数据库性能优化的重要手段,特别是在大型数据库系统中。以下是 MySQL 分区和分表技术的详细介绍: 什么是分表? 分表是将一个大表按照一定的规则分解成多张具有...

    MySQL 分区和分表的干货总结.doc

    MySQL 分区和分表的干货总结.doc

    MySQL 基础知识的总结

    MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),它基于结构化查询语言(SQL)进行数据操作。本文将深入探讨MySQL的基础知识,...对于更复杂的需求,如性能优化、分区、复制等,还需要进一步学习高级特性。

    MySQL分区字段列有必要再单独建索引吗?

    总结来说,是否需要为MySQL的分区字段创建单独的索引,并无绝对的答案,而是取决于具体的应用场景、数据量、查询模式以及性能需求。在实际应用中,应根据业务需求进行测试和分析,通过实验来判断是否需要为分区字段...

    MySQL分区表的最佳实践指南

    总结,MySQL分区表是一种强大的工具,可显著提升大数据量表的性能。正确设计和使用分区策略,可以优化查询速度,简化数据管理,但同时也需要考虑分区带来的额外复杂性和维护成本。在实践中,应根据具体业务需求和...

    mysql数据库总结

    在这个“mysql数据库总结”中,我们将深入探讨MySQL的关键概念、操作以及最佳实践。 首先,让我们了解MySQL的基础知识。MySQL基于SQL(结构化查询语言),它允许用户通过简单的命令进行数据的查询、更新和管理。当...

    基于MySQL分区性能的详细介绍

    总结来说,MySQL分区是一种强大的数据库优化工具,它可以提升大数据环境下的查询效率,但需要根据实际业务需求和硬件条件合理选择分区策略,以充分发挥其效能。在设计和实施分区策略时,应充分考虑数据特性、查询...

    总结MySQL的分区

    前言  分区是指根据一定的规则将一个...mysql5.7以后查询语句支持指定分区例如:“ SELECT * FROM t PARTITION (p0,p1) WHERE c &lt; 5 ”指定分区同样适用DELETE, INSERT, REPLACE, UPDATE, and LOAD DATA, LOAD XML.

    mysql-存储分区-实验八.docx

    MySQL存储分区是数据库管理系统中一种优化查询性能和管理大量数据的技术。通过将大表分成多个较小、更易管理和处理的部分,存储分区可以提高查询效率,减少维护成本,并有助于数据的组织和备份。以下是对实验内容的...

    (mysql面试题)MySQL中的分区表的概念及其作用及代码展示.txt

    ### MySQL中的分区表概念及其作用 #### 一、分区表定义 在MySQL中,分区表是一种高级技术,它允许用户将一个大型表物理地分割成若干个较小的部分,即分区。这种分割方式不仅可以显著提高查询效率,还可以简化数据...

    MySql知识总结.docx

    MySQL还支持多种高级功能,如视图、存储过程、触发器、事务处理、分区表和全文搜索。这些特性使得MySQL能够满足复杂的企业级应用需求。总的来说,MySQL是一个强大而灵活的数据库解决方案,其广泛的应用场景和丰富的...

    MySQL入门基础知识总结

    以下是对MySQL入门基础知识的详细总结: 一、MySQL安装与配置 1. 安装:在Windows、Linux或Mac OS上,可以通过官方网站下载相应平台的安装包,按照向导进行安装。 2. 配置:安装完成后,需要配置MySQL服务器,包括...

    mysql ocp题库总结

    MySQL OCP(Oracle Certified Professional)是针对MySQL数据库管理员的一项专业认证,涵盖了一系列的MySQL知识和技能...在实际操作中,理解GTID的工作原理以及如何管理分区表对于维护高效、可靠的MySQL环境至关重要。

    MySql数据分区操作之新增分区操作

    总结起来,MySQL的分区功能允许我们在大型表上实现更高级别的组织和优化,通过创建、插入和删除分区,我们可以更有效地处理大量数据。但是,进行分区操作时需要注意,分区的创建和删除都会影响到数据分布,因此在...

    MySQL面试总结宝典.pdf

    - **分区与分片**:如何通过分区策略来提高大数据量的处理能力。 6. **安全性**: - **权限管理**:GRANT和REVOKE命令的使用,理解用户权限的层次结构。 - **加密与安全**:理解SSL连接、数据加密存储等安全措施...

    MYSQL学习资料

    MySQL水平分区表实际操作总结 Mysql水平分表 mysql水平分表和垂直分表和数据库分区 sysbench mysql 坚持不懈 sysbench安装和使用 SHOW INNODB STATUS 探秘 体验Innodb with Memcached –安装 数据切分及整合方案 ...

    mysql教程详细总结

    MySQL教程详细总结 引言 MySQL是一款开源、免费的关系型数据库管理系统,被广泛应用于Web应用程序中,因其高效、稳定和易用性而受到青睐。本教程将深入探讨MySQL的各个方面,帮助初学者和进阶者全面理解其核心概念...

    mysql使用教程之分区表的使用方法(删除分区表)

    总结来说,MySQL分区表是处理大量数据的有效工具,它提供了灵活的数据组织方式,能够提高查询效率和数据管理的便利性。了解并熟练掌握分区的创建、新增、删除等操作,对于优化数据库性能至关重要。在实际应用中,应...

Global site tag (gtag.js) - Google Analytics