mysql 表分区 查看表分区 修改表分区
一、 mysql分区简介
数据库分区
数据库分区是一种物理数据库设计技术。虽然分区技术可以实现很多效果,但其主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减sql语句的响应时间,同时对于应用来说分区完全是透明的。
MySQL的分区主要有两种形式:水平分区和垂直分区
水平分区(HorizontalPartitioning)
这种形式的分区是对根据表的行进行分区,通过这样的方式不同分组里面的物理列分割的数据集得以组合,从而进行个体分割(单分区)或集体分割(1个或多个分区)。
所有在表中定义的列在每个数据集中都能找到,所以表的特性依然得以保持。水平分区一定要通过某个属性列来分割。常见的比如年份,日期等。
垂直分区(VerticalPartitioning)
这种分区方式一般来说是通过对表的垂直划分来减少目标表的宽度,使某些特定的列被划分到特定的分区,每个分区都包含了其中的列所对应所有行。
可以用 showvariables like '%partition%';
命令查询当前的mysql数据库版本是否支持分区。
分区的作用:数据库性能的提升和简化数据管理
在扫描操作中,mysql优化器只扫描保护数据的那个分区以减少扫描范围获得性能的提高。
分区技术使得数据管理变得简单,删除某个分区不会对另外的分区造成影响,分区有系统直接管理不用手工干预。
mysql从5.1版本开始支持分区。每个分区的名称是不区分大小写。同个表中的分区表名称要唯一。
二、 mysql分区类型
类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式。
KEY
分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。
基于RANGE/LIST 类型的分区表中每个分区的再次分割。子分区可以是 HASH/KEY 等类型。
三、 mysql分区表常用操作示例
partition p1 values less than (1000),
partition p2 values less than (2000),
partition p3 values less than maxvalue
partition by range(year(birthdate))
partition p1 values less than (1980),
partition p2 values less than (1990),
partition p3 values less than maxvalue
以year(birthdate)表达式(计算员工的出生日期)作为范围分区依据。这里最值得注意的是表达式必须有返回值。
partition by hash(year(birthdate))
subpartition by hash(year(birthdate))
partition p1 values less than (2000),
partition p2 values less than maxvalue
subpartition by key(birthdate)
partition p1 values less than (2000),
partition p2 values less than maxvalue
subpartition by hash(year(birthdate))
subpartition by key(birthdate)
alter table emp drop partition p1;
一次性删除多个分区,alter table emp drop partition p1,p2;
alter table emp add partition (partition p3 values less than (4000));
alter table empl add partition (partition p3 values in (40));
Reorganizepartition关键字可以对表的部分分区或全部分区进行修改,并且不会丢失数据。分解前后分区的整体范围应该一致。
partition p1 values less than (100),
partition p3 values less than (1000)
Merge分区:把2个分区合并为一个。
alter table te
reorganize partition p1,p3 into
(partition p1 values less than (1000));
Alter table emp partition by hash(salary)partitions 7;
Alter table emp partitionbyrange(salary)
partition p1 values less than (2000),
partition p2 values less than (4000)
Alter table emp removepartitioning;--不会丢失数据
这和先删除保存在分区中的所有记录,然后重新插入它们,具有同样的效果。它可用于整理分区碎片。
ALTER TABLE emp rebuild partitionp1,p2;
ALTER TABLE emp optimize partition p1,p2;
ALTER TABLE emp analyze partition p1,p2;
ALTER TABLE emp repairpartition p1,p2;
可以使用几乎与对非分区表使用CHECK TABLE 相同的方式检查分区。
ALTER TABLE emp CHECK partition p1,p2;
这个命令可以告诉你表emp的分区p1,p2中的数据或索引是否已经被破坏。如果发生了这种情况,使用“ALTER TABLE ... REPAIR PARTITION”来修补该分区。
1. 在5.1版本中分区表对唯一约束有明确的规定,每一个唯一约束必须包含在分区表的分区键(也包括主键约束)。
PARTITION p1 VALUES less than (100),
PARTITION p2 VALUES less than (200)
PARTITION p1 VALUES less than (100),
PARTITION p2 VALUES less than (200)
如果是range分区表,那么null行将被保存在范围最小的分区。
如果是list分区表,那么null行将被保存到list为0的分区。
在按HASH和KEY分区的情况下,任何产生NULL值的表达式mysql都视同它的返回值为0。
3. 分区键必须是INT类型,或者通过表达式返回INT类型,可以为NULL。唯一的例外是当分
区类型为KEY分区的时候,可以使用其他类型的列作为分区键( BLOB or TEXT 列除外)。
4. 对分区表的分区键创建索引,那么这个索引也将被分区,分区键没有全局索引一说。
5. 只有RANG和LIST分区能进行子分区,HASH和KEY分区不能进行子分区。
四、 获取mysql分区表信息的几种方法
1. show create table 表名
可以查看创建分区表的create语句
2. show table status
可以查看表是不是分区表
4. explain partitions select语句
通过此语句来显示扫描哪些分区,及他们是如何使用的.
五、 分区表性能比较
1. 创建两张表: part_tab(分区表),no_part_tab(普通表)
( c1 int defaultNULL, c2 varchar2(30) default NULL, c3 date not null)
(PARTITION p0VALUES LESS THAN (1995),
PARTITION p1 VALUESLESS THAN (1996) ,
PARTITION p2 VALUESLESS THAN (1997) ,
PARTITION p3 VALUESLESS THAN (1998) ,
PARTITION p4 VALUES LESS THAN (1999) ,
PARTITION p5 VALUESLESS THAN (2000) ,
PARTITION p6 VALUESLESS THAN (2001) ,
PARTITION p7 VALUESLESS THAN (2002) ,
PARTITION p8 VALUESLESS THAN (2003) ,
PARTITION p9 VALUESLESS THAN (2004) ,
PARTITION p10VALUES LESS THAN (2010),
PARTITION p11VALUES LESS THAN (MAXVALUE) );
( c1 int defaultNULL, c2 varchar2(30) default NULL, c3 date not null);
CREATE PROCEDUREload_part_tab()
values (v,'testingpartitions',adddate('1995-01-01',(rand(v)*36520)mod 3652));
insert into no_part_tab select * frompart_tab;
selectcount(*) from part_tab where c3 > date '1995-01-01'and c3 < date '1995-12-31';
+----------+
| count(*) |
+----------+
| 795181 |
+----------+
1 row in set (2.62 sec)
selectcount(*) from part_tab where c3 > date '1995-01-01'and c3 < date '1995-12-31';
+----------+
| count(*) |
+----------+
| 795181 |
+----------+
1 row in set (7.33 sec)
mysql>explain select count(*) from part_tab where c3 > date '1995-01-01'and c3 < date '1995-12-31';
| id |select_type | table | type |possible_keys | key | key_len | ref | rows | Extra |
| 1 | SIMPLE | part_tab | ALL | NULL | NULL | NULL | NULL | 7980796 | Using where |
| id |select_type | table | type |possible_keys | key | key_len | ref | rows | Extra |
| 1 | SIMPLE | no_part_tab | ALL | NULL | NULL | NULL | NULL | 8000206 | Using where |
分区表执行扫描了7980796行,而普通表则扫描了8000206行。
mysql 表分区 查看表分区 修改表分区相关推荐
- mysql 如何修改数据库表结构_MySQL数据库如何修改表结构
MySQL数据库修改表结构的方法:1.使用add添加字段,使用drop删除字段:2.使用alter修改字段名:3.修改列类型:4.修改表名:5.修改表选项:6.修改列属性. MySQL数据库修改表结构 ...
- Linux下查看、修改分区的卷标:修改linux分区的卷标
Linux下查看.修改分区的卷标:修改linux分区的卷标可以用 e2label, 比如要把/dev/sda1 的卷标改为/boot,则可这样$ e2label /dev/sda1 /boot
- mysql修改表charset_MySql数据库中查询修改表中字符编码(charset)的方法
MySQL字符集多种多样,下面为您列举了其中三种最多见的MySQL字符集查看方法,该方法供您参考,但愿对您学习MySQL数据库能有所启迪.mysql 1.查看MySQL数据库服务器和数据库MySQL字 ...
- mysql怎么修改表的列名字_修改表列名-怎么修改数据库表的列名-mysql修改表的列名...
SQL中怎样修改一个表的列名呢?? 各个数据库不一样. oracle: ALTER TABLE 表名 RENAME COLUMN 列名 TO 新列名 sqlserver:exec sp_rename ...
- mysql编辑表php源码_MySQL修改表的实际应用代码示例
以下的文章主要介绍的是MySQL修改表的实际操作命令,同时本文也有对MySQL修改表的实际操作代码的描述,如果你对其相关的实际操作有兴趣的话,你就可以对以下的文章点击观看了. ALTER [IGNOR ...
- oracle查看表空间的属性 ,修改表空间的状态
表空间的状态属性主要有在线(online),离线(offline),只读(read only)和读写(read write)这四种,其中只读与读写状态属于在线状态的特殊情况,通过设置表空间的状态属性, ...
- mysql 修改表结构方案_MySQL中修改表结构时需要注意的一些地方
MySql 在修改表结构的时候可能会中断产品的正常运行影响用户体验,甚至更坏的结果,丢失数据.不是所有的数据库管理员.程序员.系统管理员都非常了解Mysql能避免这种情况.DBA会经常碰到这种生产中断 ...
- 【无标题】mysql增加字段和备注_mysql 修改表名,修改字段类型,增加字段,删除字段,添加字段备注,添加索引...
mysql语句: 1.修改表名: rename table 旧表名 to 新表名; 2.修改字段类型: alter table 表名 modify column 字段名 字段类型(长度) 3.修改字段 ...
- 22-05-10 西安 mysql基础篇(02) 修改表 、修改列、commit和rollback、表数据之增删改 DML 、列级约束、表级约束
我们的情绪背后藏着动机,动机总是正面的,因为意识从来不会伤害自己,只是误以为某些行为可以满足自己的这份动机. 结果去重 distinct select distinct 字段列表 from 表名称 [ ...
- mysql修改表中文名_MySQL中如何修改表的名字?修改表名?
需求描述 今天在进行MySQL表的历史数据迁移,需要将某张表进行备份,修改表的名字,在此记录下操作过程. 操作过程 mysql> create table ts01 like ti_o_sms; ...
最新文章
- 劣质代码评析——《写给大家看的C语言书(第2版)》附录B之21点程序(一)
- 只看到了别人28岁退休,背后的期权知识你知道吗?
- Foxmail邮件如何导入Outlook中
- if/ else 你真的会吗?
- Jmeter之定时器操作
- jvm(10)-早期(编译期)优化
- 使用Spring @Transactional进行数据源路由
- Unix基本系统数据类型和stat结构体
- LeetCode 346. 数据流中的移动平均值(队列)
- Python 生成器 和 yield 关键字
- python基础之-数据类型
- 量化策略回测BoolC
- 14. 税收规则(Tax Rules)
- 算法:874. 模拟行走机器人
- Bootstrap 时间控件 datetimepicker
- 微型计算机的始祖:Altair 8800 | Linux 中国
- linux电子数码相册实验报告,电子相册实训报告.docx
- 707. 设计链表(中等 链表)
- Workbench Command——cifti格式操作,如何制作label文件即 Human_MMP.lh.label.gii?
- 第十六篇 晶体管之电流放大器
热门文章
- 基本数据类型为空导致的错误cannot be translated into a null value due to being declared as a primitive type
- 爬虫beautifulsoup爬取豆瓣读书数据
- java8中新判空方法之Optional类的使用
- 解决Linux 系统,出现不在sudoers 文件中,此事将被报告的问题
- 纯卡西欧计算器5800P坐标正反算
- C++运行三维人脸重建 VRN
- sws_getContext函数详细使用
- 拥有ISO26262认证的软件工具清单
- Arduino提高篇23—OLED电子时钟
- 《非Pad勿扰》风靡平板电脑界