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

MySQL使用分区表的好处:

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

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

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

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

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.jb51.net

-> 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.jb51.net 
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.jb51.net 
    ->     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.jb51.net 
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)

(0)

相关推荐

  • MySQL的表分区详解

    一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了.如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区.当然也可根据其他的条件分区. 二.为什么要对表进行分区为了改善大型表以及具有各种访问模式的表的可伸缩性,可管理性和提高数据库效率.分区的一些优点包括:      1).与单个磁盘或文件系统分区相比,可以存储更多的数据.      2).对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有关的

  • mysql的分区技术详细介绍

    一.概述 当 MySQL的总记录数超过了100万后,会出现性能的大幅度下降吗?答案是肯定的,但是,性能下降>的比率不一而同,要看系统的架构.应用程序.还有>包括索引.服务器硬件等多种因素而定.当有网友问我这个问题的时候,我最常见的回答>就是:分表,可以根据id区间或者时间先后顺序等多种规则来分表.分表很容易,然而由此所带来的应用程序甚至是架构方面的改动工作却不>容小觑,还包括将来的扩展性等. 在以前,一种解决方案就是使用 MERGE 类型,这是一个非常方便的做饭.架构和程序基本上不

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

    如果想在已经建好的表上进行分区,如果使用alter添加分区的话,mysql会提示错误: 复制代码 代码如下: ERROR 1505 <HY000> Partition management on a not partitioned table is not possible 正确的方法是新建一个具有分区的表,结构一致,然后用insert into 分区表 select * from 原始表; 测试创建分区表文件 复制代码 代码如下: CREATE TABLE tr (id INT, name

  • 创建mysql表分区的方法

    表分区是最近才知道的哦 ,以前自己做都是分表来实现上亿级别的数据了,下面我来给大家介绍一下mysql表分区创建与使用吧,希望对各位同学会有所帮助.表分区的测试使用,主要内容来自于其他博客文章以及mysql5.1的参考手册mysql测试版本:mysql5.5.28mysql物理存储文件(有mysql配置的datadir决定存储路径)格式简介数据库engine为MYISAM frm表结构文件,myd表数据文件,myi表索引文件.INNODB engine对应的表物理存储文件innodb的数据库的物理

  • MySQL 5.5 range分区增加删除处理的方法示例

    介绍 RANGE分区基于一个给定的连续区间范围,早期版本RANGE主要是基于整数的分区.在5.7版本中DATE.DATETIME列也可以使用RANGE分区,同时在5.5以上的版本提供了基于非整形的RANGE COLUMN分区.RANGE分区必须的连续的且不能重叠.使用 "VALUES LESS THAN ()" 来定义分区区间,非整形的范围值需要使用单引号,并且可以使用MAXVALUE作为分区的最高值. 本文将给大家介绍MySQL 5.5 range分区增加删除处理的相关内容,分享给大

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

    MySQL使用分区表的好处: 1,可以把一些归类的数据放在一个分区中,可以减少服务器检查数据的数量加快查询.2,方便维护,通过删除分区来删除老的数据.3,分区数据可以被分布到不同的物理位置,可以做分布式有效利用多个硬盘驱动器. MySQL可以建立四种分区类型的分区: RANGE 分区:基于属于一个给定连续区间的列值,把多行分配给分区. LIST 分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择.  www.jb51.net HASH分区:基于用户

  • mysql 5.7.13 winx64安装配置方法图文教程(win10)

    本文实例为大家分享了mysql 5.7.13 winx64安装配置方法图文教程,供大家参考,具体内容如下 下载 地址:http://dev.mysql.com/downloads/file/?id=463242 安装 1.解压下载好的mysql-5.7.13-winx64.zip到你需要安转的目录(eg:D:\mysql): 2.配置解压目录下的my_default.ini中命名为my.ini 作相关的配置如下: # These are commonly set, remove the # an

  • mysql 5.7.21 winx64安装配置方法图文教程

    本文针对安装mysql5.7.21的笔记进行了总结,分享给大家 1.将下载好的mysql压缩包解压到安装目录下 2.新建文件 my.ini,放置到mysql安装目录下,内容如下: [mysql] # 设置mysql客户端默认字符集 default-character-set=utf8 [mysqld] #设置3306端口 port = 3306 # 设置mysql的安装目录 basedir=F:\work office\mysql-5.7.21\mysql-5.7.21-winx64 # 设置m

  • windows 10下mysql 5.7.21 winx64安装配置方法图文教程

    mysql 5.7.21 winx64安装配置方法: 下载社区版mysql,下载地址(下载前需要注册oracle帐号) 解压缩 配置环境变量 在系统变量path上加上:C:\mysql-5.7.21-winx64\bin(指向mysql 的bin路径) 初始化 用管理员身份打开cmd,输入命令(初始化的时候在安装目录下创建了data目录,否则会报路径不存在): mysqld --initialize --user=mysql --console 初始化的时候会生成root的临时密码,需要记住用户

  • Windows 8下MySQL Community Server 5.6安装配置方法图文教程

    本文记录了Windows 8下MySQL5.6安装配置教程,分享给大家. 1.1 下载与路径配置 首先先进入官网下载MySQL安装包 选择DOWNLOADS,Community版 下载完后解压 用bin目录的地址添加到环境变量里的路径(Path)里 1.3. 生成data文件: 以管理员身份运行cmd 进入C:\Users\lym96\Desktop\mysql-5.6.40-winx64\bin 下 执行命令:mysqld --initialize-insecure --user=mysql 

  • window下mysql 8.0.15 winx64安装配置方法图文教程

    本文为大家分享了mysql 8.0.15 winx64安装配置方法,供大家参考,具体内容如下 1.去官网下载最新版本的适用于window下的64位操作系统的mysql-8.0.15版本 下载地址 下载完成后将其解压到自定义目录下,我所有的工具都保存在D:\Project,解压完成后会看见以下目录: D:\Project\mysql-8.0.15-winx64 2 配置环境变量(配置环境变量的目的是在cmd终端命令下不用进入到相应的文件夹目录下直接就可以调用运行) 随后,配置环境变量(我的电脑点右

  • mysql 8.0.20 winx64安装配置方法图文教程

    本文为大家分享了mysql 8.0.20 winx64安装配置方法,记录如下. MySQL官网:链接 直接点击链接也可以下载:mysql 8.0.20 解压到指定目录 配置环境变量 系统变量: MYSQL_HOME D:\Develop\mysql-8.0.20-winx64 系统变量: Path %MYSQL_HOME%\bin 新建一个my.ini  用记事本打开,复制以下代码, 没有my.ini 数据库启动时无法初始化参数 [mysql] ; 设置mysql客户端默认字符集 default

  • mysql 8.0.16 压缩包安装配置方法图文教程

    本文为大家分享了mysql 8.0.16 压缩包安装配置方法,供大家参考,具体内容如下 运行环境:Windows 10 x64 1.下载zip安装包: MySQL8.0 For Windows zip包下载地址:,进入页面后可以不用登录.后点击底部"No thanks, just start my download."即可开始下载. 2.安装 2.1 解压zip包到安装目录 我的解压在了 E:\SQL\MySQL\mysql-8.0.16-winx64 ps:解压后的文件目录,缺失da

  • mysql 8.0.24版本安装配置方法图文教程

    本文记录了mysql 8.0.24版本安装配置方法,分享给大家 从Mysql官网下载mysql 下载完成后直接双击进行安装,打开后的页面如下所示: 选择自定义custom,接着下一步 将MySQL Server 展开,添加到右边(点击绿色箭头) 选择安装位置后点击ok 点击Next,点击MySQL Sever,选择后再点击Execute 下载完成后点击下一步(需要等待一小会儿) 直接下一步 下一步 一般情况下选择第二个即可,然后点击下一步 设置密码,设置的密码为默认root的密码 下一步 点击E

  • php结合mysql与mysqli扩展处理事务的方法

    本文实例讲述了php结合mysql与mysqli扩展处理事务的方法.分享给大家供大家参考,具体如下: 以下只是展示如何应用,具体用的时候要加上判断,如果都执行成功则提交,否则回滚 看前先分清mysqli与mysql扩展是不一样的 mysqli扩展处理事物: $mysqli=new mysqli('localhost','root','123456','test'); $mysqli->autocommit(false);//开始事物 $query="update a set money=m

随机推荐