MySQL-分区表-1

mysql中数据库learn文件夹结构:





看一下表sales的定义:

show create  table sales \G
*************************** 1. row ***************************
Table: sales
Create Table: CREATE TABLE `sales` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `amount` double NOT NULL,
  `order_day` datetime NOT NULL,
  PRIMARY KEY (`id`,`order_day`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
/*!50100 PARTITION BY RANGE (YEAR(order_day))
(PARTITION p_2010 VALUES LESS THAN (2010) ENGINE = InnoDB,
 PARTITION p_2011 VALUES LESS THAN (2011) ENGINE = InnoDB,
 PARTITION p_2012 VALUES LESS THAN (2012) ENGINE = InnoDB,
 PARTITION p_catchall VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */
1 row in set (0.00 sec)


表p_key的定义

show create  table p_key \G
*************************** 1. row ***************************
Table: p_key
Create Table: CREATE TABLE `p_key` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `keyname` char(20) DEFAULT NULL,
  `keyval` varchar(1000) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=utf8
/*!50100 PARTITION BY KEY (id)
PARTITIONS 4 */
1 row in set (0.01 sec)


对于MyISAM引擎,一张表对于存储了3个文件。fm存储表结构。myi存放索引,myd存放数据。

但p_key相应的另一个文件p_key.par。



又一次创建一个Range分区的表fuhui_log,体验分区查询:

DROP TABLE IF EXISTS fuhui_log;
CREATE TABLE fuhui_log (
    object_id int(11),
    title varchar(20) NOT NULL  ,
    content varchar(20) ,
    time int(11),
    primary key (object_id)
)
PARTITION BY range (object_id)
(
    PARTITION p1 VALUES less than (5000),
    PARTITION p2 VALUES less than (10000),
    PARTITION p3 VALUES less than MAXVALUE
);

自己定义存储过程,向数据库中插入20000条数据:

delimiter //
create procedure fun_fuhui_log()
begin
    declare i int;
    set i = 1;
    while i < 20000 do
        insert into fuhui_log(object_id,title,content,time) values (i,concat(‘title_‘,i),‘test content‘,i);
        set i = i+1;
    end while;
end
//

调用存储过程,进行数据插入:

delimiter ;
call fun_fuhui_log();

获取插入数据结果:

 select count(*) from fuhui_log;

查询结果为19999,耗时:1 row in set (0.01 sec);


select * from fuhui_log where object_id = 13588;

耗时0.00 sec



依据如上的步骤。创建一个基本表,并改动存储过程,插入相同的数据:

DROP TABLE IF EXISTS fuhui_log2;
CREATE TABLE fuhui_log2 (
    object_id int(11),
    title varchar(20) NOT NULL  ,
    content varchar(20) ,
    time int(11),
    primary key (object_id)
);

数据结构设计的太简单,数据量太小。看不出效果来,重先改动存储过程。插入80000条数据:

while i < 80000 do
        replace into fuhui_log2(object_id,title,content,time) values (i,concat(‘title_‘,i),‘test content‘,i);
        set i = i+1;
end while;

select count(*) from fuhui_log2;

运行结果:1 row in set (0.02 sec)

select count(*) from fuhui_log;

运行结果:1 row in set (0.03 sec)【没有依照逻辑出牌】



这个样例非常失败,改动表结构。去掉primary key

 alter table fuhui_log drop primary key;
 alter table fuhui_log2 drop primary key;

样例仍然比較失败,运行的效率非常难发现

select * from fuhui_log where object_id = 56770 \G

耗时:0.05sec

select * from fuhui_log2 where object_id = 56770 \G

耗时0.06sec



对于count统计,fuhui_log比fuhui_log2耗时都多。count的并行计算,都被我给玷污了

改动分区结构,又一次计算:

 alter table fuhui_log reorganize partition p3 into (
 partition p3_1 values less than (30000),
 partition p3_2 values less than (50000),
 partition p3_3 values less than MAXVALUE);

查看又一次分区后的结果:

select table_schema,table_name,partition_name,PARTITION_METHOD from infor
mation_schema.partitions where table_name=‘fuhui_log‘;

然后又一次计算:

select count(*) from fuhui_log ;

运行效果0.04sec,跟fuhui_log2的统计时间相等了。可是

select * from fuhui_log where object_id = 56770 \G

运行时间变成了0.02sec

竟然已经写这么久了,今天就此罢笔吧

时间: 2024-12-14 18:15:35

MySQL-分区表-1的相关文章

MySQL分区表(转)

查看分区情况 SELECT * FROM information_schema.PARTITIONS WHERE table_name='table_name': PARTITION_NAME:分区的名称 PARTITION_METHOD:分区的类型 TABLE_ROWS:分区数据条数 RANGE分区: create table t ( id int) engine=innodb partition by range (id) ( partition p0 values less than (1

MySQL分区表使用方法

原文:MySQL分区表使用方法 1. 确认MySQL服务器是否支持分区表 命令: show plugins; 2. MySQL分区表的特点 在逻辑上为一个表,在物理上存储在多个文件中 HASH分区(HASH) HASH分区的特点 根据MOD(分区键,分区数)的值把数据行存储到表的不同分区中 数据可以平均的分布在各个分区中 HASH分区的键值必须是一个INT类型的值,或是通过函数可以转为INT类型 如何建立HASH分区表 以INT类型字段 customer_id为分区键 CREATE TABLE

MySQL 分区表原理及数据备份转移实战

1.分区表含义 分区表定义指根据可以设置为任意大小的规则,跨文件系统分配单个表的多个部分.实际上,表的不同部分在不同的位置被存储为单独的表.用户所选择的.实现数据分割的规则被称为分区函数,这在MySQL中它可以是模数,或者是简单的匹配一个连续的数值区间或数值列表,或者是一个内部HASH函数,或一个线性HASH函数. 分表与分区的区别在于:分区从逻辑上来讲只有一张表,而分表则是将一张表分解成多张表. 2.分区表优点 1)分区表更容易维护.对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有

mysql分区表

分区表   分区表的优点: 数据分开存放在不同的文件,可以支持更大的数据文件 在某些特定条件下能提高查询.删除.更新的效率   1.range分区表   mysql> create table mytest(id int,name varchar(20) not null,birthday date,primary key(id,birthday))auto_increment=1 partition by range(year(birthday))( partition p01 values

MySQL分区表姿势

大部分内容整理自姜承尧的innodb存储引擎2学习笔记. 分区: 分区的功能不是在存储引擎层实现的.因此不只是InnoDB才支持分区.MyISAM.NDB都支持分区操作. 分区的过程是将一个表或者索引分解为多个更小.更可管理的部分.从逻辑上将,只有一个表或者索引,但是在物理上这个表或索引可能由数十个物理分区组成. 每个分区都是独立的对象,可以独自处理,也可以作为一个更大对象的一部分进行处理. MySQL只支持水平分区,不支持垂直分区. 水平分区:将同一表中不同行的记录分配到不同的物理文件中. 垂

MySQL分区表管理

RANGE,LIST分区管理 1:为未分区表创建分区 ALTER TABLE trb3 PARTITION BY KEY(id) PARTITIONS 2; 2:删除某个分区的数据 ALTER TABLE tr DROP PARTITION p2; 3:为分区表添加一个分区 ALTER TABLE members ADD PARTITION (PARTITION p3 VALUES LESS THAN (2000)); ALTER TABLE tt ADD PARTITION (PARTITIO

MySQL 分区表

今天统计数据的时候发现一张表使用了表分区,借此机会记录一下. 1. 什么是表分区? 表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分.从逻辑上看,只有一张表,但是底层却是由多个物理分区组成. 2. 表分区与分表的区别 分表:指的是通过一定规则,将一张表分解成多张不同的表.比如将用户订单记录根据时间成多个表. 分表与分区的区别在于:分区从逻辑上来讲只有一张表,而分表则是将一张表分解成多张表. 3. 表分区有什么好处? 1)分区表的数据可以分布在不同的物理设备上,从而高效

MySQL分区表的管理~2

一.维护分区 对于表的维护,我们一般有如下几种方式: CHECK TABLE, OPTIMIZE TABLE, ANALYZE TABLE和REPAIR TABLE. 而这几种方式,对于分区同样适用.下面,我们一一阐述各种的作用. 1. Rebuilding partitions 重建分区,它相当于先删除分区中的数据,然后重新插入.这个主要是用于分区的碎片整理. 譬如: ALTER TABLE t1 REBUILD PARTITION p0, p1; 2. Optimizing partitio

MySQL 分区表原理及使用详解

今天统计数据的时候发现一张表使用了表分区,借此机会记录一下. 1. 什么是表分区? 表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分.从逻辑上看,只有一张表,但是底层却是由多个物理分区组成. 2. 表分区与分表的区别 分表:指的是通过一定规则,将一张表分解成多张不同的表.比如将用户订单记录根据时间成多个表. 分表与分区的区别在于:分区从逻辑上来讲只有一张表,而分表则是将一张表分解成多张表. 3. 表分区有什么好处? 1)分区表的数据可以分布在不同的物理设备上,从而高效

mysql 分区表详解

项目中要一张库表实现 list分区.并且支持多种数据库. oracle 很顺利,只是mysql 听说5.1版本就已经支持了, 可是试了很多个版本,都不行,后来查到原因是要5.5 以上版本 分区才支持 varchar, 可是试到 5.6 都一直报错: "VALUES value for partition 'P_XX' must have type INT" 后来才发现.原来没有查对资料,走了弯路.是LIST COLUMNS才支持 varchar类型的分区字段. mysql 官方文档