`
tottichen
  • 浏览: 13505 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

MySQL数据库分区的一些应用

阅读更多
分区的一些优点:
1)与单个磁盘或文件系统分区相比,可以存储更多的数据。
2)对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有关的分区,很容易地删除那些数据。相反地,在某些情况下,添加新数据的过程又可以通过为那些新数据专门增加一个新的分区来很方便地实现。
3)一些查询可以得到极大的优化,这主要是借助于满足一个给定where 语句的数据可以只保存在一个或多个分区内,这样在查找时就不用查找其他剩余的分区。因为分区可以在创建了分区表后进行修改,所以在第一次配置分区方案时还不曾这么做时,可以重新组织数据,来提高那些常用查询的效率。
4)涉及到例如sum() 和 count()这样聚合函数的查询,可以很容易地进行并行处理。这种查询的一个简单例子如 “select salesperson_id, count(orders) as order_total from sales group by salesperson_id;”。通过“并行”,这意味着该查询可以在每个分区上同时进行,最终结果只需通过总计所有分区得到的结果。
5)通过跨多个磁盘来分散数据查询,来获得更大的查询吞吐量。

mysql支持的分区类型
  • range 分区
  • 基于属于一个给定连续区间的列值进行分配
    create table employees (
        id int not null,
        fname varchar(30),
        lname varchar(30),
        hired date not null default '1970-01-01',
        separated date not null default '9999-12-31',
        job_code int not null,
        store_id int not null
    )
    partition by range (store_id) (
        partition p0 values less than (6),
        partition p1 values less than (11),
        partition p2 values less than (16),
        partition p3 values less than maxvalue
    );
  • list 分区:
  • 类似range分区,它们的主要区别在于,list分区中每个分区的定义和选择是基于某列的值从属于一个集合,而range分区是从属于一个连续区间值的集合
    create table employees (
        id int not null,
        fname varchar(30),
        lname varchar(30),
        hired date not null default '1970-01-01',
        separated date not null default '9999-12-31',
        job_code int,
        store_id int
    )
    partition by list(store_id)
        partition pnorth values in (3,5,6,9,17),
        partition peast values in (1,2,10,11,19,20),
        partition pwest values in (4,12,13,14,18),
        partition pcentral values in (7,8,15,16)
    )

    如果试图插入列值(或分区表达式的返回值)不在分区值列表中的一行时,那么“insert”查询将失败并报错。
  • hash分区:
  • 基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含mysql 中有效的、产生非负整数值的任何表达式。
    hash分区主要用来确保数据在预先确定数目的分区中平均分布。在range和list分区中,必须明确指定一个给定的列值或列值集合应该保存在哪个分区中;而在hash分区中,mysql 自动完成这些工作,你所要做的只是基于将要被哈希的列值指定一个列值或表达式,以及指定被分区的表将要被分割成的分区数量。
    要使用hash分区来分割一个表,要在create table 语句上添加一个“partition by hash (expr)”子句,其中“expr”是一个返回一个整数的表达式。它可以仅仅是字段类型为mysql 整型的一列的名字。此外,你很可能需要在后面再添加一个“partitions num”子句,其中num 是一个非负的整数,它表示表将要被分割成分区的数量。
    create table employees (
        id int not null,
        fname varchar(30),
        lname varchar(30),
        hired date not null default '1970-01-01',
        separated date not null default '9999-12-31',
        job_code int,
        store_id int
    )
    partition by hash(year(hired))
    partitions 4;

    mysql还支持线性哈希功能,它与常规哈希的区别在于,线性哈希功能使用的一个线性的2的幂(powers-of-two)运算法则,而常规 哈希使用的是求哈希函数值的模数。
    线性哈希分区和常规哈希分区在语法上的唯一区别在于,在“partition by” 子句中添加“linear”关键字,如下面所示:
    create table employees (
        id int not null,
        fname varchar(30),
        lname varchar(30),
        hired date not null default '1970-01-01',
        separated date not null default '9999-12-31',
        job_code int,
        store_id int
    )
    partition by linear hash(year(hired))
    partitions 4;

    按照线性哈希分区的优点在于增加、删除、合并和拆分分区将变得更加快捷,有利于处理含有极其大量(1000g)数据的表。它的缺点在于,与使用常规hash分区得到的数据分布相比,各个分区间数据的分布不大可能均衡。
  • key 分区:
  • 按照key进行分区类似于按照hash分区,除了hash分区使用的用户定义的表达式,而key分区的 哈希函数是由mysql服务器提供。mysql 簇(cluster)使用函数md5()来实现key分区。
    对于使用其他存储引擎的表,服务器使用其自己内部的哈希函数,这些函数是基于与password()一样的运算法则
    通过线性key分割一个表也是可能的。下面是一个简单的例子:
    create table tk (
        col1 int not null,
        col2 char(5),
        col3 date
    )
    partition by linear key (col1)
    partitions 3;
  • 子分区:
  • 子分区是分区表中每个分区的再次分割
    create table ts (id int, purchased date)
        partition by range(year(purchased))
        subpartition by hash(to_days(purchased))
        (
            partition p0 values less than (1990)
            (
                subpartition s0,
                subpartition s1
            ),
            partition p1 values less than (2000)
            (
                subpartition s2,
                subpartition s3
            ),
            partition p2 values less than maxvalue
            (
                subpartition s4,
                subpartition s5
            )
        );

    子分区可以用于特别大的表,在多个磁盘间分配数据和索引。假设有6个磁盘,分别为/disk0, /disk1, /disk2等。现在考虑下面的例子:
    create table ts (id int, purchased date)
        partition by range(year(purchased))
        subpartition by hash(to_days(purchased))
        (
            partition p0 values less than (1990)
            (
                subpartition s0
                    data directory = '/disk0/data'
                    index directory = '/disk0/idx',
                subpartition s1
                    data directory = '/disk1/data'
                    index directory = '/disk1/idx'
            ),
            partition p1 values less than (2000)
            (
                subpartition s0
                    data directory = '/disk2/data'
                    index directory = '/disk2/idx',
                subpartition s1
                    data directory = '/disk3/data'
                    index directory = '/disk3/idx'
            ),
            partition p2 values less than maxvalue
            (
                subpartition s0
                    data directory = '/disk4/data'
                    index directory = '/disk4/idx',
                subpartition s1
                    data directory = '/disk5/data'
                    index directory = '/disk5/idx'
            )
        )

    分区管理
    从一个按照range或list分区的表中删除一个分区,可以使用带一个drop partition子句的alter table命令来实现:
    alter table tr drop partition p2;

    由“alter table … drop partition”语句引起的、从表中删除的行数并没有被服务器报告出来。
    如果希望改变表的分区而又不丢失数据,使用“alter table … reorganize partition”语句。
    一个reorganize partition语句也可以用来合并相邻的分区。可以使用如下的语句恢复成员表到它以前的分区:
    alter table members reorganize partition s0,s1 into (
        partition p0 values less than (1970)
    );

    使用“reorganize partition”拆分或合并分区,没有数据丢失。在执行上面的语句中,mysql 把保存在分区s0和s1中的所有数据都移到分区p0中。
    “reorganize partition”的基本语法是:
    alter table tbl_name reorganize partition partition_list into (partition_definitions);

    不能使用与从按照range或list分区的表中删除分区相同的方式来从hash或key分区的表中删除分区。但是,可以使用“alter table … coalesce partition”命令来合并hash或key分区。
    coalesce不能用来增加分区的数量,要增加顾客表的分区数量从12到18,使用“alter table … add partition”,具体如下:
    alter table clients add partition partitions 6;

    转自http://freddy.cc/article/101
    分享到:
    评论
    1 楼 liuxuejin 2011-02-11  
    好文章啊!值不少钱!

    相关推荐

      《MySQL数据库原理及应用》教案.rar

      《MySQL数据库原理及应用》是一门深入探讨关系型数据库管理系统MySQL的课程,旨在教授学生如何设计、创建和管理数据库,以及如何在实际应用场景中高效利用MySQL。教案详细涵盖了该课程的所有章节,为教学提供了全面...

      MySQL数据库原理及应用(第2版)(微课版)-配套教案.zip

      MySQL数据库是目前世界上最受欢迎的关系型数据库管理系统之一,尤其在互联网领域有着广泛的应用。《MySQL数据库原理及应用(第2版)(微课版)》是一本深入浅出介绍MySQL技术的教材,配合配套教案,旨在帮助学生和...

      mysql 数据库表分区

      MySQL 数据库表分区是一种优化大数据查询的技术,尤其适用于存储海量数据的应用场景。通过将大表分成更小、更易管理的部分,分区可以提高查询性能,减少数据处理的时间,并且简化数据管理和备份过程。 1. **分区...

      MySQL数据库原理及应用(第2版)(微课版)-课程标准.zip

      《MySQL数据库原理及应用(第2版)(微课版)》是一门深入解析MySQL数据库核心技术与实际应用的课程。该课程旨在帮助学习者掌握数据库的基础理论,理解MySQL的架构和工作原理,以及如何在实际项目中有效地运用MySQL...

      MySQL数据库应用从入门到精通_第2版

      MySQL数据库是世界上最受欢迎的开源关系型数据库之一,广泛应用于各种规模的企业、网站和应用程序中。本书《MySQL数据库应用从入门到精通_第2版》旨在帮助读者从零基础开始,逐步掌握MySQL的使用技巧和高级功能,...

      深入解析Oracle与MySQL在数据库分区方面的显著差异

      本文将详细探讨Oracle与MySQL在数据库分区方面的不同之处,包括分区类型、创建和管理分区的语法,以及分区策略的应用场景。 Oracle和MySQL在数据库分区方面各有优势。Oracle提供了更复杂的分区类型和更灵活的分区...

      57710-数据库原理及应用教程(MySQL版)-习题答案及解析.docx(1).rar

      《数据库原理及应用教程(MySQL版)-习题答案及解析》是一份针对数据库学习者的珍贵资源,尤其适合正在学习MySQL数据库原理与应用的学生或初学者。这份文档详细解答了教材中的各种习题,帮助读者深入理解数据库的概念...

      MySQL 8数据库原理与应用徐丽霞微课版实训代码

      MySQL 8数据库是目前广泛应用的关系型数据库管理系统,其在数据存储、处理和分析方面具有高效、稳定和易用的特点。本实训代码集是基于徐丽霞老师的微课内容设计,旨在帮助学习者深入理解MySQL 8的核心原理并掌握其实...

      MySQL数据库应用从入门到精通 第2版

      根据提供的文件信息,这里主要关注的是“MySQL数据库应用从入门到精通 第2版”这一书籍。下面将基于此书的标题、描述以及可能涉及的部分内容,深入探讨与MySQL数据库相关的知识点。 ### MySQL数据库简介 MySQL是一...

      java连接mysql数据库(JDBC驱动).

      ### Java连接MySQL数据库(JDBC驱动) #### 软件下载 - **MySQL**: 版本 4.1.11 下载地址: [http://dev.mysql.com/downloads/mysql/4.1.html](http://dev.mysql.com/downloads/mysql/4.1.html) - **JDBC驱动**: ...

      MySQL数据库基础实例教程(第2版)(微课版)-教学课件.zip

      同时,也会探讨数据库分区策略,以及如何根据数据量和查询模式选择合适的分区方式。 第八章 数据库编程:学习者将接触MySQL的存储过程和函数,了解它们在处理复杂业务逻辑和事务管理中的应用。此外,还会讲解触发器...

      数据库应用技术 题和答案

      常见的数据库管理系统(DBMS)包括Oracle、MySQL、SQL Server和MongoDB等。 二、关系型数据库 在关系型数据库中,数据以表格形式存在,表格之间通过键进行关联。SQL(Structured Query Language)是用于操作和查询...

      mysql数据库应用与管理视频教程详细完整版

      内容包括dba视频教程中的mysql数据库应用与管理,第一章:配置mysql服务器 第二章:获取元数据 第三章:存储引擎 第四章:隔离级别与锁 第五章:使用分区 第六章:导出与导入数据 第七章:备份与恢复 第八章:使用...

      MySQL 5.1 版数据库

      MySQL 5.1是MySQL数据库管理系统的一个重要版本,它在2005年发布,以其稳定性和高效性受到广泛欢迎。MySQL是一个开源的关系型数据库管理系统(RDBMS),由瑞典的MySQL AB公司开发,后来被Sun Microsystems收购,最终...

      MySQL数据库使用帮助文档

      MySQL数据库是世界上最受欢迎的开源关系型数据库之一,广泛应用于各种规模的企业、网站和应用程序中。这份"MySQL数据库使用帮助文档"是开发者在处理与数据库相关的Web应用程序时的重要参考资料。它包含了大量的信息...

      MySQL数据库考试练习题 mysql试题集 共28页.pdf

      根据提供的文件信息,我们可以推断出这份文档主要包含MySQL数据库相关的考试练习题目。MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),因其性能稳定、易于使用和成本低廉等特点,在互联网应用开发中非常...

      MySQL数据库的优化与应用

      MySQL数据库作为一款开源关系型数据库管理系统,在全球范围内得到了广泛应用,尤其是在Web应用程序、企业级应用和嵌入式系统等领域。随着数据量的爆炸性增长,对MySQL数据库的性能和效率优化成为开发者们所面临的...

      MySql数据库技术精粹

      通过阅读《MySQL数据库技术精粹》,无论是初学者还是经验丰富的DBA,都能从中受益,提升对MySQL的理解和应用能力。此外,由于书籍格式为pdg,需要使用支持pdg格式的阅读器打开,如Adobe Reader或一些专门的电子书...

    Global site tag (gtag.js) - Google Analytics