`

MySQL分区表的使用介绍

 
阅读更多
MySQL使用分区表的好处:
1,可以把一些归类的数据放在一个分区中,可以减少服务器检查数据的数量加快查询。
2,方便维护,通过删除分区来删除老的数据。
3,分区数据可以被分布到不同的物理位置,可以做分布式有效利用多个硬盘驱动器。

MySQL可以建立四种分区类型的分区:
          RANGE 分区:基于属于一个给定连续区间的列值,把多行分配给分区。
·         LIST 分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。  www.2cto.com  
·         HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。
·         KEY 分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL 服务器提供其自身的哈希函数。必须有一列或多列包含整数值。
一般用得多的是range分区和list分区。
RANGE分区
这里以一个销售的业务来做测试
销售表有日期/商品/销售额三个字段
测试数据从2010年1月1日至2010年9月31日
以“月”为单位进行分区
初期分区定义
首先需要查看,当前数据库是否支持分区
mysql>SHOW VARIABLES LIKE '%partition%';
+-------------------+-------+
| Variable_name     | Value |
 
 
 
 
 
+-------------------+-------+
| have_partitioning | YES   |
 
+-------------------+-------+
1 row in set (0.03 sec)
创建分区表,按照年月的方式分区。
mysql> CREATE TABLE sale_data (
    ->   sale_date  DATETIME NOT NULL,
 
    ->   sale_item  VARCHAR(2) NOT NULL ,
 
    ->   sale_money DECIMAL(10,2) NOT NULL
 
    -> )  www.2cto.com  
 
    -> PARTITION BY RANGE (YEAR(sale_date)*100+MONTH(sale_date)) (
 
    ->   PARTITION p201001 VALUES LESS THAN (201002),
 
    ->   PARTITION p201002 VALUES LESS THAN (201003),
 
    ->   PARTITION p201003 VALUES LESS THAN (201004),
 
    ->   PARTITION p201004 VALUES LESS THAN (201005),
 
    ->   PARTITION p201005 VALUES LESS THAN (201006),
 
    ->   PARTITION p201006 VALUES LESS THAN (201007),
 
    ->   PARTITION p201007 VALUES LESS THAN (201008),
 
    ->   PARTITION p201008 VALUES LESS THAN (201009),
 
    ->   PARTITION p201009 VALUES LESS THAN (201010),
 
    ->   PARTITION pcatchall VLAUES LESS THAN MAXVALUE
    -> );
 
Query OK, 0 rows affected (0.20 sec)
新增分区
mysql> ALTER TABLE sale_data
    ->   ADD PARTITION (PARTITION p201010 VALUES LESS THAN (201011));
 
Query OK, 0 rows affected (0.36 sec)
Records: 0  Duplicates: 0  Warnings: 0
 
删除分区
--当删除了一个分区,也同时删除了该分区中所有的数据。
mysql> ALTER TABLE sale_data DROP PARTITION p201010;
Query OK, 0 rows affected (0.22 sec)  www.2cto.com  
Records: 0  Duplicates: 0  Warnings: 0
 
分区的合并
下面的SQL,将p201001 - p201009 合并为3个分区p2010Q1 - p2010Q3
 
mysql> ALTER TABLE sale_data
    ->   REORGANIZE PARTITION p201001,p201002,p201003,
 
    ->                        p201004,p201005,p201006,
 
    ->                        p201007,p201008,p201009 INTO
 
    -> (
 
    ->   PARTITION p2010Q1 VALUES LESS THAN (201004),
 
    ->   PARTITION p2010Q2 VALUES LESS THAN (201007),
 
    ->   PARTITION p2010Q3 VALUES LESS THAN (201010)
 
    -> );
 
Query OK, 0 rows affected (1.14 sec)
Records: 0  Duplicates: 0  Warnings: 0
 
分区的拆分
下面的SQL,将p2010Q1 分区,拆分为s2009 与s2010 两个分区
 
mysql> ALTER TABLE sale_data REORGANIZE PARTITION p2010Q1 INTO (
 
    ->     PARTITION s2009 VALUES LESS THAN (201001),
             www.2cto.com  
    ->     PARTITION s2010 VALUES LESS THAN (201004)
 
    -> );
 
Query OK, 0 rows affected (0.36 sec)
Records: 0  Duplicates: 0  Warnings: 0
 
一个利用不同物理位置数据源做分区的例子:
CREATE TABLE ts (id INT, purchased DATE) 
    ENGINE=innodb 
    PARTITION BY RANGE(YEAR(purchased)) 
    SUBPARTITION BY HASH(id) 
    ( 
        PARTITION p0 VALUES LESS THAN (1990) 
        ( 
            SUBPARTITION s0                  //在大的分区下又有小的分区
            DATA DIRECTORY='/usr/local/mysql/data0'      //数据源
            INDEX DIRECTORY='/usr/local/mysql/index0',   //索引数据源
            SUBPARTITION s1 
            DATA DIRECTORY='/usr/local/mysql/data1' 
            INDEX DIRECTORY='/usr/local/mysql/index1' 
        ), 
        PARTITION p1 VALUES LESS THAN (MAXVALUE) 
        ( 
            SUBPARTITION s2 
            DATA DIRECTORY='/usr/local/mysql/data1' 
            INDEX DIRECTORY='/usr/local/mysql/index1', 
            SUBPARTITION s3 
            DATA DIRECTORY='/usr/local/mysql/data2' 
            INDEX DIRECTORY='/usr/local/mysql/index2' 
        ) 
    ); 
分区索引的局限:
1,所有分区都要使用同样的引擎。
2,分区表的每一个唯一索引必须包含由分区函数引用的列。
3,mysql能避免查询所有的分区,但仍然锁定了所有分区。
4,分区函数能使用的函数和表达式有限,例如函数有上面的4种。
5,分区不支持外键。  www.2cto.com  
6,不能使用LOAD INDEX INTO CACHE
7,分区并不能总是改善性能,要进行性能评测。
例如可以使用expalin partitions 来查看查询语句是否使用分区过滤了数据:
mysql> explain partitions select * from fenqubiao where day<'2011-09-12';
+----+-------------+-----------+---------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table     | partitions    | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-----------+---------------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | fenqubiao | p_2010,p_2011 | ALL  | NULL          | NULL | NULL    | NULL |    2 | Using where |
+----+-------------+-----------+---------------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)
分享到:
评论

相关推荐

    MySQL分区表自动创建及删除存储过程

    MySQL分区表是一种优化大型数据表查询效率的技术,它将一个大表分成多个逻辑上相连但物理上独立的部分,每个部分称为一个分区。分区可以按照不同的策略进行,如范围、哈希、列表或复合分区。这样做有助于提高数据...

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

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

    创建mysql表分区的方法

    本文将详细介绍MySQL表分区的原理、优势以及如何创建和使用分区。 **表分区的优势** 1. **存储优化**:分区可以存储更多数据,且可跨多个磁盘分布,提高存储容量。 2. **数据清理**:通过删除特定分区,可以快速...

    MySQL 5.5.8 分区表性能测试

    压缩包中的“count.xls”文件可能是测试结果的记录,可能包含了在不同场景下对MySQL 5.5.8分区表性能的具体测试数据,例如查询时间、CPU使用率、内存消耗等指标。通过分析这些数据,我们可以深入了解分区表在实际...

    mysql表分区

    例如,可以先使用DROP TABLE IF EXISTS语句来删除已存在的分区表,然后使用CREATE TABLE语句来创建新的分区表,并在其中定义分区规则。 总的来说,MySQL表分区通过将一个大表的数据分散存储到多个物理位置,从而...

    mysql数据库表分区教程

    HASH 分区基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。 4. KEY 分区 KEY 分区类似于按 HASH 分区,区别在于 KEY 分区只支持计算一列或多列,且 MySQL ...

    mysql 数据库表分区

    - 在分区表的上下文中,触发器可能用于在数据插入或更新时自动调整分区,确保数据分布合理。 7. **维护与备份**: - 分区使得大型表的备份和恢复更加高效,因为可以分别处理每个分区,而非整个表。 - 数据迁移和...

    MySQL分区表:万字详解与实践指南

    ### MySQL分区表:万字详解与实践指南 #### 一、引言 在现代数据库管理中,随着数据量的不断增长,如何高效管理和查询数据成为了一个重要的课题。MySQL作为广泛使用的开源关系型数据库管理系统之一,提供了多种强大...

    MySQL分区分表方案实践手册

    #### 三、MySQL分区表常用操作示例 接下来通过具体的示例来展示如何创建不同类型的分区表: 1. **创建RANGE分区**: - 基于员工工资创建范围分区:`CREATE TABLE emp (empno VARCHAR(20) NOT NULL, empname ...

    详解MySQL分区表

    【MySQL分区表详解】 分区表是数据库管理中一种高级的数据组织策略,主要目的是为了提高大表的查询效率和数据管理的便利性。在MySQL中,分区表是通过`PARTITION BY`子句来实现的,它允许我们将一个大的表根据特定的...

    MySQL 分区

    MySQL分区是一种数据库优化技术,它将大型表分成更小、更易管理的部分,每个部分称为一个分区。这种技术有助于提高查询性能,特别是对于那些需要处理大量数据或执行复杂查询的应用程序。MySQL支持多种分区类型,包括...

    通过实例学习MySQL分区表原理及常用操作

    MySQL分区表是一种数据库管理策略,它将一个大表的数据分散到多个物理存储单元,从而提高数据管理和查询性能。本文将深入探讨分区表的概念、优点、限制以及常见的分区类型。 首先,分区表的基本概念是根据特定的...

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

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

    Mysql分区表的管理与维护

    MySQL分区表是一种优化大型数据库性能的技术,它将一个大表分成多个较小的部分,每个部分称为一个分区,从而提高查询效率和管理能力。分区通常应用于处理大量数据的表,特别是那些有明确范围或时间属性的数据,如...

    MySQL分区表的最佳实践指南

    MySQL分区表是一种优化大型数据库性能的技术,它将大表逻辑上划分为更小、更易管理的部分,以提高查询速度和数据管理效率。本文将深入探讨MySQL分区表的最佳实践,包括分区的目的、类型、操作示例以及适用场景。 1....

    MySQL的表分区详解

    然而,值得注意的是,尽管MySQL分区提供了许多优势,但在实际应用中,需要根据具体业务需求和查询模式来决定是否使用分区,以及如何设计分区策略。在创建分区表后,可以通过调整分区方案来优化常见查询的性能。此外...

    mysql 实现定时给表追加分区

    实现mysql 每天定时自动给数据库表追加分区,包含存储计划和存储过程

Global site tag (gtag.js) - Google Analytics