`

MySQL分区表的使用介绍

 
阅读更多

MySQL使用分区表的好处:

1,可以把一些归类的数据放在一个分区中,可以减少服务器检查数据的数量加快查询。

2,方便维护,通过删除分区来删除老的数据。

3,分区数据可以被分布到不同的物理位置,可以做分布式有效利用多个硬盘驱动器。

MySQL可以建立四种分区类型的分区:

          RANGE 分区:基于属于一个给定连续区间的列值,把多行分配给分区。

·         LIST 分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。

·         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

 

    -> )

 

    -> 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)

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),

 

    ->     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,分区不支持外键。

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 数据库表分区

    - 在分区表的上下文中,触发器可能用于在数据插入或更新时自动调整分区,确保数据分布合理。 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分区表的最佳实践,包括分区的目的、类型、操作示例以及适用场景。 1....

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

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

    MySQL的表分区详解

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

    mysql 实现定时给表追加分区

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

Global site tag (gtag.js) - Google Analytics