`
flowercat
  • 浏览: 361805 次
社区版块
存档分类
最新评论

[MySQL 5.1 体验]MySQL 分区

阅读更多
一、概述

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

在以前,一种解决方案就是使用 MERGE
类型,这是一个非常方便的做饭。架构和程序基本上不用做改动,不过,它的缺点是显见的:

    * 只能在相同结构的 MyISAM 表上使用
    * 无法享受到 MyISAM 的全部功能,例如无法在 MERGE 类型上执行 FULLTEXT 搜索
    * 它需要使用更多的文件描述符
    * 读取索引更慢

这个时候,MySQL 5.1 中新增的分区(Partition)功能的优势也就很明显了:

    * 与单个磁盘或文件系统分区相比,可以存储更多的数据
    * 很容易就能删除不用或者过时的数据
    * 一些查询可以得到极大的优化
    * 涉及到 SUM()/COUNT() 等聚合函数时,可以并行进行
    * IO吞吐量更大

分区允许可以设置为任意大小的规则,跨文件系统分配单个表的多个部分。实际上,表的不同部分在不同的位置被存储为单独的表。
二、分区的类型

    * RANGE 分区:基于属于一个给定连续区间的列值,把多行分配给分区。参见18.2.1节,RANGE分区
    * LIST 分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。参见18.2.2节,LIST分区
    * HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包>含MySQL中有效的、产生非负整数值的任何表达式。参见18.2.3节,HASH分区
    * KEY
      分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含>整数值。
      参见18.2.4节,KEY分区

三、分区例子:
      DATA DIRECTORY INDEX DIRECTORY 适用于MyISAM引擎,对InnoDB引擎,需要手动做符合连接
    * RANGE 类型

      CREATE TABLE users (
          uid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
          name VARCHAR(30) NOT NULL DEFAULT '',
          email VARCHAR(30) NOT NULL DEFAULT ''
      )
      PARTITION BY RANGE (uid) (
          PARTITION p0 VALUES LESS THAN (3000000)
          DATA DIRECTORY = '/data0/data'
          INDEX DIRECTORY = '/data1/idx',

          PARTITION p1 VALUES LESS THAN (6000000)
          DATA DIRECTORY = '/data2/data'
          INDEX DIRECTORY = '/data3/idx',

          PARTITION p2 VALUES LESS THAN (9000000)
          DATA DIRECTORY = '/data4/data'
          INDEX DIRECTORY = '/data5/idx',

          PARTITION p3 VALUES LESS THAN MAXVALUE    DATA DIRECTORY = '/data6/data'
          INDEX DIRECTORY = '/data7/idx'
      );

      在这里,将用户表分成4个分区,以每300万条记录为界限,每个分区都有自己独立的数据、索引文件的存放目录,与此同时,这些目录所在的>
      物理磁盘分区可能也都是完全独立的,可以多大提高了磁盘IO吞吐量。
    * LIST 类型

      CREATE TABLE category (
          cid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
          name VARCHAR(30) NOT NULL DEFAULT ''
      )
      PARTITION BY LIST (cid) (
          PARTITION p0 VALUES IN (0,4,8,12)
          DATA DIRECTORY = '/data0/data'
          INDEX DIRECTORY = '/data1/idx',
         
          PARTITION p1 VALUES IN (1,5,9,13)
          DATA DIRECTORY = '/data2/data'
          INDEX DIRECTORY = '/data3/idx',
         
          PARTITION p2 VALUES IN (2,6,10,14)
          DATA DIRECTORY = '/data4/data'
          INDEX DIRECTORY = '/data5/idx',
         
          PARTITION p3 VALUES IN (3,7,11,15)
          DATA DIRECTORY = '/data6/data'
          INDEX DIRECTORY = '/data7/idx'
      ); 

      分成4个区,数据文件和索引文件单独存放。
    * HASH 类型

      CREATE TABLE users (
          uid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
          name VARCHAR(30) NOT NULL DEFAULT '',
          email VARCHAR(30) NOT NULL DEFAULT ''
      )
      PARTITION BY HASH (uid) PARTITIONS 4 (
          PARTITION p0
          DATA DIRECTORY = '/data0/data'
          INDEX DIRECTORY = '/data1/idx',

          PARTITION p1
          DATA DIRECTORY = '/data2/data'
          INDEX DIRECTORY = '/data3/idx',

          PARTITION p2
          DATA DIRECTORY = '/data4/data'
          INDEX DIRECTORY = '/data5/idx',

          PARTITION p3
          DATA DIRECTORY = '/data6/data'
          INDEX DIRECTORY = '/data7/idx'
      );

      分成4个区,数据文件和索引文件单独存放。
    * KEY 类型

      REATE TABLE users (
          uid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
          name VARCHAR(30) NOT NULL DEFAULT '',
          email VARCHAR(30) NOT NULL DEFAULT ''
      )
      PARTITION BY KEY (uid) PARTITIONS 4 (
          PARTITION p0
          DATA DIRECTORY = '/data0/data'
          INDEX DIRECTORY = '/data1/idx',
         
          PARTITION p1
          DATA DIRECTORY = '/data2/data'
          INDEX DIRECTORY = '/data3/idx',
         
          PARTITION p2
          DATA DIRECTORY = '/data4/data'
          INDEX DIRECTORY = '/data5/idx',
         
          PARTITION p3
          DATA DIRECTORY = '/data6/data'
          INDEX DIRECTORY = '/data7/idx'
      ); 

      分成4个区,数据文件和索引文件单独存放。
    * 子分区
      子分区是针对 RANGE/LIST 类型的分区表中每个分区的再次分割。再次分割可以是 HASH/KEY 等类型。例如:

      CREATE TABLE users (
          uid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
          name VARCHAR(30) NOT NULL DEFAULT '',
          email VARCHAR(30) NOT NULL DEFAULT ''
      )
      PARTITION BY RANGE (uid) SUBPARTITION BY HASH (uid % 4) SUBPARTITIONS 2(
          PARTITION p0 VALUES LESS THAN (3000000)
          DATA DIRECTORY = '/data0/data'
          INDEX DIRECTORY = '/data1/idx',

          PARTITION p1 VALUES LESS THAN (6000000)
          DATA DIRECTORY = '/data2/data'
          INDEX DIRECTORY = '/data3/idx'
      );

      对 RANGE 分区再次进行子分区划分,子分区采用 HASH 类型。

      或者

      CREATE TABLE users (
          uid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
          name VARCHAR(30) NOT NULL DEFAULT '',
          email VARCHAR(30) NOT NULL DEFAULT ''
      )
      PARTITION BY RANGE (uid) SUBPARTITION BY KEY(uid) SUBPARTITIONS 2(
          PARTITION p0 VALUES LESS THAN (3000000)
          DATA DIRECTORY = '/data0/data'
          INDEX DIRECTORY = '/data1/idx',

          PARTITION p1 VALUES LESS THAN (6000000)
          DATA DIRECTORY = '/data2/data'
          INDEX DIRECTORY = '/data3/idx'
      );

      对 RANGE 分区再次进行子分区划分,子分区采用 KEY 类型。

四、分区管理

    * 删除分区

      ALERT TABLE users DROP PARTITION p0;

      删除分区 p0。
    * 重建分区
          o RANGE 分区重建

            ALTER TABLE users REORGANIZE PARTITION p0,p1 INTO (PARTITION p0 VALUES LESS THAN (6000000));

            将原来的 p0,p1 分区合并起来,放到新的 p0 分区中。
          o LIST 分区重建

            ALTER TABLE users REORGANIZE PARTITION p0,p1 INTO (PARTITION p0 VALUES IN(0,1,4,5,8,9,12,13));

            将原来的 p0,p1 分区合并起来,放到新的 p0 分区中。
          o HASH/KEY 分区重建

            ALTER TABLE users REORGANIZE PARTITION COALESCE PARTITION 2;

            用 REORGANIZE 方式重建分区的数量变成2,在这里数量只能减少不能增加。想要增加可以用 ADD PARTITION 方法。
    * 新增分区
          o 新增 LIST 分区

            ALTER TABLE category ADD PARTITION (PARTITION p4 VALUES IN (16,17,18,19)
            DATA DIRECTORY = '/data8/data'
            INDEX DIRECTORY = '/data9/idx');

            新增一个LIST分区。
          o 新增 HASH/KEY 分区

            ALTER TABLE users ADD PARTITION PARTITIONS 8;

            将分区总数扩展到8个。
分享到:
评论

相关推荐

    MySQL 5.1 版数据库

    - 表分区是MySQL 5.1引入的新特性,允许将大表分成多个逻辑部分,提高查询性能,简化管理和备份。 5. **触发器和存储过程**: - MySQL 5.1支持创建触发器和存储过程,提供了更复杂的业务逻辑处理能力,可以在...

    mysql5.1详解简体中文版

    MySQL 5.1是MySQL数据库管理系统的一个重要版本,它在5.0的基础上进行了多项改进和增强,为开发者提供了更高效...这个“mysql5.1详解简体中文版”的教程文件,将帮助读者深入理解这些概念,提升数据库管理和开发技能。

    详细介绍Mysql5.1分区技术

    详细介绍mysql5.1 分区技术,通过对list range hash key四种分区技术的举例阐述Mysql分区,18.2.1. RANGE分区 18.2.2. LIST分区 18.2.3. HASH分区 18.2.4. KEY分区 18.2.5. 子分区 18.2.6. MySQL分区处理NULL值的...

    MySQL_5.1_zh.rar_MYSQL_MySQL_5.1_zh_mysql 中文

    2. **分区功能增强**:在 MySQL 5.1 中,用户可以对大表进行分区,以提高查询性能。分区可以基于哈希、范围、列表或线性哈希等多种方式。 3. **复制功能优化**:MySQL 5.1 提供了半同步复制,确保主库上的事务在被...

    mysql5.1CHM.zip

    这篇文档将基于提供的"mysql5.1CHM.zip"压缩包,深入探讨MySQL 5.1的主要特性和开发相关的知识。 1. **SQL语言与查询优化**: MySQL 5.1支持标准的SQL语法,包括SELECT、INSERT、UPDATE、DELETE等操作。其查询优化...

    mysql5.1参考手册.rar

    MySQL 5.1是MySQL数据库管理系统的一个重要版本,它提供了许多功能和改进,旨在提高性能、稳定性和可扩展性。本参考手册详细介绍了这个版本的各项特性和使用方法,是学习和工作中不可或缺的参考资料。 首先,MySQL ...

    mysql5.1中文教程

    其次,MySQL 5.1加强了分区功能。分区允许大型表的数据分散到多个物理存储上,从而提高查询速度。支持多种分区策略,如范围、哈希、列表和复合分区,可以根据不同的业务需求灵活选择。 在查询优化方面,MySQL 5.1的...

    MySQL 5.1参考手册.zip

    2. **分区功能**:MySQL 5.1引入了表分区,允许将大表划分为更小、更易管理的部分,从而提高查询性能和管理效率。 3. **触发器和存储过程**:MySQL 5.1支持触发器和存储过程,可以实现复杂的业务逻辑,减少应用程序...

    MYSQL5.1+简体中文参考文档

    这份“MYSQL5.1+简体中文参考文档”是开发者和数据库管理员的重要参考资料,它包含了关于 MySQL 5.1 的详细信息,包括 SQL 语法、数据库配置、管理操作以及性能调优等内容。 一、SQL 语法 MySQL 5.1 支持标准的 SQL...

    mysql5.1官方中文版

    对于“可视化MySQL5.1中文版”标签,这意味着该版本提供了中文界面和文档,使得中国用户可以更方便地使用和理解MySQL的功能。可视化工具如phpMyAdmin、MySQL Workbench等可以帮助用户直观地管理数据库,创建、编辑和...

    mysql5.1中文文档

    “性能调优”章节是进阶内容,讲述了如何通过优化查询、配置参数、使用分区和复制等手段来提升MySQL的性能。此外,还有关于备份和恢复策略的介绍,这对于数据安全至关重要。 “安全性”部分讲解了如何设置用户权限...

    Mysql5.1的安装包

    2. **MySQL 5.1版本特点**:MySQL 5.1带来了增强的性能和可扩展性,包括InnoDB存储引擎的改进,支持更大的表和索引,以及分区功能。此外,它还引入了存储过程、触发器、视图和事务处理等高级数据库特性。 3. **安装...

    Mysql 5.1 和 Mysql驱动

    2. **分区功能**:MySQL 5.1引入了表分区功能,允许将大表分成多个逻辑部分,提高查询性能和管理效率。根据时间、范围、哈希等多种方式进行分区,可以优化特定类型的查询。 3. **查询优化器**:MySQL 5.1的查询优化...

    MySQL5.1.chm.zip

    1. **分区功能增强**:MySQL 5.1支持更广泛的分区策略,如线性哈希、范围和列表分区,这有助于改善大数据量表的查询性能和管理效率。 2. **存储引擎多样化**:InnoDB作为默认的事务处理引擎,在5.1版本中得到进一步...

    MySQL 5.1参考手册(英文版)

    MySQL 5.1参考手册是数据库管理员、开发者和IT专业人士的重要资源,它详细阐述了MySQL 5.1版本的功能、语法、配置以及优化策略。这个英文版的手册涵盖了从基本查询到复杂的数据处理和系统管理的所有方面,适用于从...

    Mysql 5.1 安装程序

    在这个例子中,"MySQL5.1官方中文版"应该是包含了安装程序的压缩包。 2. **解压文件**:下载完成后,使用解压缩工具(如WinRAR或7-Zip)打开压缩包,提取所有文件。文件“说明.htm”可能会包含详细的安装指南和注意...

    稳定的Mysql5.1开发手册

    MySQL 5.1支持RANGE、LIST、HASH、KEY分区,理解不同分区策略的适用场景。 8. **安全性**:理解用户权限管理,如GRANT和REVOKE命令,以及如何创建和管理SSL连接以增强数据传输的安全性。 9. **备份与恢复**:定期...

    SQLyog10-MySQL5.1

    【SQLyog10-MySQL5.1】是一款专为MySQL数据库管理设计的图形化工具,主要用于简化数据库的管理和操作。MySQL5.1是这款工具所支持的一个版本,它是一款开源的关系型数据库管理系统,以其高效、稳定和易用性在全球范围...

    MySQL5.1官方文档(中文)

    2. **分区功能**:MySQL5.1扩展了分区功能,允许用户将大表分成多个逻辑部分,以提高查询速度和管理效率。支持多种分区类型,如范围分区、哈希分区、列表分区等,可以根据日期、ID或其他列值进行分区。 3. **复制...

Global site tag (gtag.js) - Google Analytics