`
yintaoxue
  • 浏览: 22870 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

mysql的分区(Partitioning)

阅读更多

partitioning 是mysql5.1 以后出现的特性,一般来说,分区主要是两种方式:
1.水平切分(Horizontal partitioning) 
一个系统的用户表(user),可以把userid<1w 的用户信息放入到user1表,把1w<=userid<2w的放入user2表, 而user1 和user2这两个表的表结构(schema)是完全一样的.
比较常用的用到水平切分的技术有:
归档文件 , 旧的放入到一个表中,新的可以放入到另一个表中。
分片(sharding), 把 user1表放到server1上,user2表放到server2上。
2. 垂直切分 (Vertical partitioning)
用户表有很多列(column),我们可以把用户的一部分信息(比如:address信息)存入到一个表,而把另一部分信息 存入到另外一个表中。这里这两个表当然要有一个相同的主键userid连接两个表。这种方式也称为:row splitting。
我们可以把一些很少变动的列放在一个表(table1), 然后把一些经常变动的列放入到另外一个表中(table2),这样我们就可以利用table1的query cache,来提升这部分数据的查询速度。若是改造现有的表的话,我们可以用视图(view)来对应用隐藏这些变动,当然这样会损失一部分性能。

mysql中水平切分的算法有以下几种:
RANGE:比如,id<5000放入一个表, id>=5000的放入另一个表。
LIST:根据一些 整数值来选择数据的分区,例如:gender列中用1表示男,2表示女,那么gender 为 1的数据放入user1,gender为2的放入user2。
HASH:根据hash值来选择分区。
KEY:mysql的一个内部算法,mysql根据key来选择分区。
还有一种composite :RANGE 和LIST 可以是 HASH 和 KEY的子分区。
总的来说就是根据某个partition key(必须是整数) 来决定数据所在的分区。

如果一个表有primary key,那么这个primary key 必须包含所有的partition key 的列, 如果这个表没有primary key,而有 unique key ,那么同样的,这个unique key必须包含所有的partition key 的列。当然没有primary key 和 unique key也可以用partition.

下面就来看看具体到底怎么来partition吧。
RANGE  partitioning
如果是新建一个表则可以用如下语句:
CREATE TABLE `test_partition` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` char(50) NOT NULL DEFAULT '',
`birthday` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
/*!50100 PARTITION BY RANGE (id)
(PARTITION p0 VALUES LESS THAN (3) ENGINE = MyISAM,
PARTITION p2 VALUES LESS THAN (6) ENGINE = MyISAM,
PARTITION plast VALUES LESS THAN MAXVALUE ENGINE = MyISAM) */

假若已经用以下语句创建了表:
CREATE TABLE `test_partition` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` char(50) NOT NULL DEFAULT '',
`birthday` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
那么 就需要用到alter语句来 修改表 :
alter table test_partition 
partition by range(id)(
partition p0 values less than (3) ENGINE = MyISAM ,
partition p1 values less than (6) ENGINE = MyISAM, 
PARTITION plast VALUES LESS THAN MAXVALUE ENGINE = MyISAM); 
这里 我们 如果 需要用到 DATE, DATETIME or TIMESTAMP类型来 分区的话可以 用  YEAR() 和  TO_DAYS()来 把日期转换为整型。

LIST partitioning
CREATE TABLE employees_by_region (
emp_id INT NOT NULL,
f_name VARCHAR(30) NOT NULL,
l_name VARCHAR(30) NOT NULL,
store_id INT NOT NULL
)
PARTITION BY LIST (store_id) (
PARTITION Southeast VALUES IN (1,2,3,4,5,6,7,8,9,10,15,17,18,20,21,24),
PARTITION Midatlantic VALUES IN (11,12,13,14,16,19,22,23,25,26,27,28),
PARTITION Northeast VALUES IN (29,30,33,38,40,41,50,56,64,65,75)
);

HASH partitioning
CREATE TABLE employees_by_region (
emp_id INT NOT NULL,
f_name VARCHAR(30) NOT NULL,
l_name VARCHAR(30) NOT NULL,
store_id INT NOT NULL
)
PARTITION BY HASH (store_id)
PARTITIONS 16;
(这里其实就是  store_id % 16 , 可以指定用  LINEAR HASH )

KEY partitioning

CREATE TABLE employees_by_region (
emp_id INT NOT NULL,
f_name VARCHAR(30) NOT NULL,
l_name VARCHAR(30) NOT NULL,
store_id INT NOT NULL
)
PARTITION BY KEY(store_id)
PARTITIONS 16;
key partitioning 用的 是一种类似PASSWORD() 的 hash算法 。
NDB 用  MD5() 来作为key partitioning 的hash算法.
可以指定用  LINEAR KEY

Composite partitioning
...待续...


注:
1 可以用 show variables like '%partition%'; 来查看你的mysql 是否支持partition
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| have_partitioning | YES   | 
+-------------------+-------+
2 /*!50100   */ 表示mysql只有高于5.1的版本才有效,对低于5.1版本的就相当于注释一样。
3 我们可以 用  EXPLAIN PARTITIONS 来查看 包含partition信息的 查询计划。

参考
mysql administartor's bible
http://dev.mysql.com/tech-resources/articles/mysql_5.1_partitions.html
http://dev.mysql.com/tech-resources/articles/performance-partitioning.html

分享到:
评论

相关推荐

    MySQL分区分表方案实践手册

    ### MySQL分区分表方案实践手册知识点详述 #### 一、MySQL分区简介 数据库分区是一项重要的物理数据库设计技术,主要用于优化数据库性能并简化数据管理。MySQL的分区主要包括两种形式:水平分区和垂直分区。 - **...

    mysql如何进行分区-mysql分区有哪些方法.docx

    为了解决这一问题,MySQL 提供了分区(Partitioning)功能,以提高查询效率和管理大量数据的能力。 分区是将一个大表逻辑上划分为多个独立的部分,每个部分称为一个分区,可以分布在不同的物理存储上。这样做有以下...

    mysql如何进行分区-mysql分区有哪些方法.pdf

    针对大规模数据存储,MySQL 提供了一种高效的管理策略——分区(Partitioning),这有助于提高查询性能,尤其是在处理海量数据时。分区是将一个大表划分为逻辑上独立的部分,每个部分(或称为分区)可以在物理上分散...

    MySQL分区分表的设计及实现-收藏备用.pdf

    ### MySQL分区分表的设计及实现 #### 一、引言 随着信息技术的飞速发展,数据量呈现爆炸式增长,海量数据的管理和处理成为了一项挑战。尤其在关系型数据库中,如MySQL这样的系统,当单个表的数据量达到一定规模后...

    MYSQL 通过分区(Partition)提升MySQL性能

    #### MySQL分区类型 MySQL支持多种类型的分区方式,主要包括: - **水平分区(Horizontal Partitioning)**:根据行数据进行划分,将不同的行分配到不同的分区中。例如,可以通过某一列值的范围来决定行数据属于...

    Oracle10个分区和Mysql分区区别详解

    - 在分区维护方面,Oracle 提供了更多的工具和功能,如 Partitioning Advisor,可以帮助优化分区策略。 总的来说,Oracle 的分区功能更为强大,提供了更丰富的分区策略和组合方式,适合大型企业级应用。MySQL 的...

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

    分区可以分为两种:水平分区(Horizontal Partitioning)和垂直分区(Vertical Partitioning)。 水平分区是对表的行进行分区,通过这样的方式不同分组里面的物理列分割的数据集得以组合,从而进行个体分割(单分区...

    MySQL中创建数据表Range分区.pdf

    在介绍MySQL中创建数据表的Range分区之前,首先需要了解分区的概念。分区是将一个表中的数据分成多个更小的、更易于管理的部分的技术。这通常用于大型数据库,可以提高查询性能,便于数据维护和备份。MySQL支持多种...

    mysql-分区

    以下是对MySQL分区的一些关键知识点的详细解释: 1. **分区类型**: - **Range分区**:根据列值的范围进行分区,如日期范围。 - **List分区**:根据列值的列表进行分区,列值必须属于预定义的列表。 - **Hash...

    MySQL交换分区的实例详解

    MySQL交换分区是数据库管理系统中的一种高级操作,它允许用户在不使用复杂的SQL语句或备份恢复的情况下,将分区表中的一个分区与一个普通表的数据进行互换。这在处理大量数据时非常有用,例如在数据迁移、数据清理或...

    总结MySQL的分区

    MySQL分区技术是一种将大表水平切分成多个小表的技术,有助于提高性能、方便管理和维护。分区可以让逻辑上的表数据分布于不同的物理存储介质上,从而提升查询效率和方便数据的归档删除。MySQL从5.7版本开始对分区表...

    mysql中如何判断是否支持分区

    如果输出结果中的`have_partitioning`变量值为`YES`,则表示MySQL服务器支持分区功能。此外,也可以通过`SHOW PLUGINS;`命令查看所有加载的插件,如果其中包含`partition`且状态为`ACTIVE`,则意味着分区引擎已经...

    Database Partitioning-Table Partitioning and MDC for DB2 9

    在《Database Partitioning, Table Partitioning, and MDC for DB2 9》一书中,作者们深入探讨了数据库分区技术的各个方面,包括数据库分区、表分区以及多维聚类(MDC)等技术。 ##### 1.1.1 数据库概念 在讨论...

    MySQL的分区表(PartitionedTable)功能详解

    然而,MySQL分区也存在一些限制,例如: - 分区键不能为NULL,否则可能导致数据分配不均。 - 分区键通常应为INT类型,以确保数据分布的效率和哈希函数的正确性。 - 在某些情况下,分区可能并不适合所有类型的查询,...

    mysql-5.5.27-win32.zip

    3. **Partitioning**:支持表分区,提高大数据量时的查询效率。 4. **复制优化**:并行复制功能提高了主从复制的速度和效率。 5. **Performance Schema**:提供了一个性能监控框架,用于收集和分析MySQL服务器的性能...

    mysql-5.5.32.tar.gz

    - **Partitioning增强**:增加了分区功能的灵活性,如线性哈希分区和按表达式分区。 - **Performance Schema**:这是一个监控和分析MySQL性能的新特性,提供了详细的系统资源和SQL语句的执行情况。 - **线程池支持...

    mysql5.6参考手册

    - **Partitioning**: 分区表的设计和实现方法,以提高性能和管理大量数据。 #### 连接器与API - **Connector/J**: Java应用程序接口,用于Java程序访问MySQL数据库。 - **Connector/ODBC**: ODBC驱动程序,允许非...

Global site tag (gtag.js) - Google Analytics