当前位置:  数据库>mysql

创建mysql表分区的方法

    来源: 互联网  发布时间:2014-10-12

    本文导语:  表分区是最近才知道的哦 ,以前自己做都是分表来实现上亿级别的数据了,下面我来给大家介绍一下mysql表分区创建与使用吧,希望对各位同学会有所帮助。表分区的测试使用,主要内容来自于其他博客文章以及mysql5.1的参考...

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

frm表结构文件,myd表数据文件,myi表索引文件。
INNODB engine对应的表物理存储文件
innodb的数据库的物理文件结构为:
.frm文件
.ibd文件和.ibdata文件:
这两种文件都是存放innodb数据的文件,之所以用两种文件来存放innodb的数据,是因为innodb的数据存储方式能够通过配置来决定是使用共享表空间存放存储数据,还是用独享表空间存放存储数据。
独享表空间存储方式使用.ibd文件,并且每个表一个ibd文件
共享表空间存储方式使用.ibdata文件,所有表共同使用一个ibdata文件
创建分区
分区的一些优点包括:
· 与单个磁盘或文件系统分区相比,可以存储更多的数据。
· 对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有关的分区,很容易地删除那些数据。相反地,在某些情况下,添加新数据的过程又可以通过为那些新数据专门增加一个新的分区,来很方便地实现。
通常和分区有关的其他优点包括下面列出的这些。MySQL 分区中的这些功能目前还没有实现,但是在我们的优先级列表中,具有高的优先级;我们希望在5.1的生产版本中,能包括这些功能。
· 一些查询可以得到极大的优化,这主要是借助于满足一个给定WHERE 语句的数据可以只保存在一个或多个分区内,这样在查找时就不用查找其他剩余的分区。因为分区可以在创建了分区表后进行修改,所以在第一次配置分区方案时还不曾这么做时,可以重新组织数据,来提高那些常用查询的效率。
·  涉及到例如SUM() 和 COUNT()这样聚合函数的查询,可以很容易地进行并行处理。这种查询的一个简单例子如 “SELECT salesperson_id, COUNT(orders) as order_total FROM sales GROUP BY salesperson_id;”。通过“并行”, 这意味着该查询可以在每个分区上同时进行,最终结果只需通过总计所有分区得到的结果。
·   通过跨多个磁盘来分散数据查询,来获得更大的查询吞吐量。
简而言之就是 数据管理优化,查询更快,数据查询并行
检测mysql是否支持分区
代码如下:

mysql> show variables like
"%partition%";
+-------------------+-------+
| Variable_name   | Value |
+-------------------+-------+
| have_partitioning | YES  |
+-------------------+-------+
1 row in set

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

DROP TABLE IF EXISTS `p_range`;
CREATE TABLE `p_range` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` char(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
/*!50100 PARTITION BY RANGE (id)
(PARTITION p0 VALUES LESS THAN (8) ENGINE = MyISAM) */;

range分区就是 partition by range(id) 表示按id 1-7的数据存储在p0分区;如果id大于7了则数据不能写入了,因为没有对应的数据分区来存储;
所以这时在创建分区时需要使用maxvalues关键字了
代码如下:

PARTITION BY RANGE (id)
(
PARTITION p0 VALUES LESS THAN (8),
PARTITION p1 VALUES LESS THAN MAXVALUE)

这样就表示,所有id大于7的数据记录存在在p1分区里。
RANGE分区在如下场合特别有用:
·  当需要删除“旧的”数据时。如果你使用上面最近的那个例子给出的分区方案,你只需简单地使用 “ALTER TABLE employees DROP PARTITION p0;”来删除所有在1991年前就已经停止工作的雇员相对应的所有行。对于有大量行的表,这比运行一个如“DELETE FROM employees WHERE YEAR(separated) ALTER TABLE clients COALESCE PARTITION 18;
错误1478 (HY000): 不能移动所有分区,使用DROP TABLE代替要增加顾客表的分区数量从12到18,使用“ALTER TABLE … ADD PARTITION”,具体如下:
ALTER TABLE clients ADD PARTITION PARTITIONS 18;注释:“ALTER TABLE … REORGANIZE PARTITION”不能用于按照HASH或HASH分区的表。
分区维护
重建分区
这和先删除保存在分区中的所有记录,然后重新插入它们,具有同样的效果。它可用于整理分区碎片。
ALTER TABLE t1 REBUILD PARTITION (p0, p1);
优化分区如果从分区中删除了大量的行,或者对一个带有可变长度的行(也就是说,有VARCHAR,BLOB,或TEXT类型的列)作了许多修改,
可以使用“ALTER TABLE … OPTIMIZE PARTITION”来收回没有使用的空间,并整理分区数据文件的碎片。
ALTER TABLE t1 OPTIMIZE PARTITION (p0, p1);
分析分区
读取并保存分区的键分布
ALTER TABLE t1 ANALYZE PARTITION (p3);
修补分区: 修补被破坏的分区。
ALTER TABLE t1 REPAIR PARTITION (p0,p1);
检查分区
可以使用几乎与对非分区表使用CHECK TABLE 相同的方式检查分区。
ALTER TABLE trb3 CHECK PARTITION (p1);
这个命令可以告诉你表t1的分区p1中的数据或索引是否已经被破坏。如果发生了这种情况,使用“ALTER TABLE ... REPAIR PARTITION”来修补该分区。获取分区信息
在mysql服务器信息数据库里面的partitions存放着服务器所有表的分区信息。
代码如下:

explain partitions命令
explain partitions select * from p_hash
+----+-------------+--------+-------------+------+---------------+------+---------+------+------+-------+
| id | select_type | table  | partitions  | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+--------+-------------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE    | p_hash | p0,p1,p2,p3 | ALL  | NULL      | NULL | NULL   | NULL |  10 |    |
+----+-------------+--------+-------------+------+---------------+------+---------+------+------+-------+

-- 获取到p_list表的分区详细信息。
select * from information_schema.`PARTITIONS` where TABLE_NAME = 'p_list';
-- 分区的创建信息
show create table p_list;

    
 
 

您可能感兴趣的文章:

  • 菜鸟在c盘装了win2000,想在剩下的空间装Red Hat Enterprise Linux 3,在创建linux分区的时候,不知道都创建什么分区??我知道要创建一个
  • linux如何创建一个共享内存 可以mount 可以创建目录之类 跟硬盘分区一样
  • 在虚拟机上安装linux,在手动分区时有个警告:说sda分区表无法读取,如果要创建,需初始化,此驱动上的所有数据会丢失
  • 安装LINUX系统时创建分区失败 请指教
  • 急呀,无法创建主分区,在线等待。
  • LINUX 下用自由空间创建新的分区
  • 如何创建一个主分区,主分区有什么用?
  • 俺想装一个linux7.2与win2k共存,但在创建swap分区时提示不能安装,why?请大侠赐教
  • 请问linux安装在创建交换分区时,挂载点选择什么?我没有选,出现的是灰色的<不适用>,有问题吗?
  • fdisk 命令 能否 进行 非交互模式,比如 #:fdisk /dev/sdb n p 0 100M;创建一个分区。
  • sql server 2005创建-修改-查看分区表的方法介绍
  • SQL Server 2005 创建分区表的方法浅析
  • oracle存储过程创建表分区实例
  • 各位高手知道在JAVA中如何用一个名称创建一个对象实例,并调用其方法,注意:在编写代码时并不知要创建的对象的类名,也并不知方法名
  • navicat 8 创建数据库与创建用户分配权限图文方法
  • 关于“创建重载现存方法的方法”
  • sql server创建复合主键的2种方法
  • Mysql启动与数据库的创建方法[图文]
  • IIS打开提示MMC无法创建管理单元的解决方法
  • python创建只读属性对象的方法(ReadOnlyObject)
  • linux下什么方法可以获取文件的创建时间呢?
  • MySQL 创建索引(Create Index)的方法和语法结构及例子
  • Codeigniter中mkdir创建目录遇到权限问题和解决方法
  • java线程之使用Runnable接口创建线程的方法
  • c# 泛型类创建带参数和不带参数的构造方法
  • VC实现动态菜单的创建方法
  • c#创建Graphics对象的三种方法
  • 怎样用actionPerformed方法,创建jlabel,特急!问了好多人,都不会.
  • 解析Android应用启动后自动创建桌面快捷方式的实现方法
  • sql视图创建索引的方法
  • asp.net 3.5中在web.config文件创建ACCESS连接字符串的方法
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ Bitsets 成员 Constructors:创建新bitsets
  • 一进程源源不断地创建文件,另一进程把这些创建的文件抓取并挪走
  • C++ Double Ended Queues(双向队列) 成员 Constructors:创建一个新双向队列
  • 创建用户组创建用户出错
  • C++ I/O 成员 open():创建一个输入流
  • 进程创建进程组后,然后创建该组中的进程,然后终止。这里的终止....?
  • Xcode介绍及创建工程和工程依赖操作步骤
  • php循环创建目录示例分享(php创建多级目录)
  • HTML5 sprite 样式创建工具Stitches介绍
  • 怎么创建这样一个文件???有分送,请指教 iis7站长之家
  • java Servlet实现Session创建存取以及url重写代码示例
  • mkdir()是创建文件夹的函数,有没有循环创建多个目录级的函数呢?
  • FTP上创建的文件夹的创建日期始终和本机的对不上(无论如何改变日期和时间)(紧急!!!)
  • 急!linux下mysql的创建用户组和创建用户命令不能生效啊????
  • 怎么创建包,我创建包后,怎么找不到呢?
  • C语言中有指针,因此C语言可以创建链表,那么Java语言没有指针,那Java是否可以创建链表呢?
  • 100求解:如何在UNIX环境下创建一个新的端口号?另:能告之如何在WINDOWS2000环境下创建一个新的端口号就更好了!
  • linux普通用户创建文件或目录
  • 怎么创建这样一个文件???有分送,请指教
  • 自行创建的设备文件怎么在系统重启后不见了?
  • mkdir函数参数问题,创建目录权限不正确


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3