对于MYSQL的态度一直都是会基本SQL和简单命令就行,最近处理一个数据量很大的项目,为了提高效率,在数据库方面的瓶颈上,选择了使用分区表来提高查询效率。至此和大家一起分享一下。 1.引言 本文初略的讲述了mysql数据库如何分区表。 2.环境要求 在5.1版本

对于MYSQL的态度一直都是会基本SQL和简单命令就行,最近处理一个数据量很大的项目,为了提高效率,在数据库方面的瓶颈上,选择了使用分区表来提高查询效率。至此和大家一起分享一下。

1.引言

本文初略的讲述了mysql数据库如何分区表。

2.环境要求

在5.1版本中不是默认就安装了,而在之后版本中一般默认选择了安装分区表支持。可以通过如下方式查看当前数据库是否支持分区表操作:

使用show variables like '%partition%';如果不支持分区,那么value字段值为No。

3.重要概念描述

3.1 分区字段

1)当仅存在单一主键时,不存在唯一键,那么分区字段必须是主键字段;

2)当存在复合主键时,不存在唯一键,那么分区字段必须是主键组合的一部分字段,一个或多个。

3)当主键和唯一键都存在时,那么分区字段必须同时包括主键字段和唯一键字段。

4.分区表类型

4.1 range分区

1)语法展示:# 语法

# 在创建表单的最后,添加partitions by range(分区字段)(

# partition 分区名 values less than(阀值1),

# partition 分区名 values less than(阀值2),

# ...

# partition 分区名 values less than(阀值n),

# )

示例展示:create table test_range(

id int auto_increment,

description varchar(50),

primary key(id)

) ENGINE=InnoDB auto_increment=1 default charset=utf8

partition by range(id)(

partition p1 values less than(6), #id<6的存放在p1分区

partition p2 values less than(11) #6 <= id < 11 存放在p2分区

);

查看分区情况:show create table test_range;

注意到,在显示的表结构添加了分区表的信息。

数据测试:insert into test_range values(null, "test1");

insert into test_range values(null, "test2");

insert into test_range values(null, "test3");

insert into test_range values(null, "test4");

insert into test_range values(null, "test5");

insert into test_range values(null, "test6");

insert into test_range values(null, "test7");

insert into test_range values(null, "test8");

insert into test_range values(null, "test9");

insert into test_range values(null, "test10");

插入10条数据,此时我们来查看其查询执行过程:

从结果可以发现,其只是在p1分区执行的查询,那么此时就减少了查询扫描的数据量,从而提高了查询效率。

如果此时,我们插入第11条数据会发生什么情况呢?insert into test_range values(null, "test11");

会发错:insert into test_range values(null, "test11")Error Code: 1526. Table has no partition for value 110.015 sec

原因很简单,因为在我们创建表单时,仅仅指定了1 - 10的id数值分区,当插入id=11时的分区时,此时没有分区提供,那么就引发错误,那么如果解决这样的问题呢,采取如下方式,修改表的分区方式:alter table test_range add partition(

partition p3 values less than(MAXVALUE)

);

# 添加一个分区,也就是p3是id从11到maxValue的存放区域

此时插入id=11的数据,并执行查询解析:

发现,已经将其分配到p3分区中了。

还需要特别注意的时,使用partition by range(分区字段),其中的分区字段可以是分区字段的表单式,但是必须是返回的整数,在5.5版本中,可以使用partition by range column/columns语法,指定某个字段。这里不做介绍。大家可以自己尝试一下。

4.2 list分区

list分区可以理解为集合分区方式,意思就是指定某个集合来分区。

语法展示:partition by list(分区字段表达式)(

partition 分区名 values in(value1, value2,...,valuen)#分区集合

);

示例展示:create table test_list(

id int auto_increment,

description varchar(50),

primary key(id)

)ENGINE=InnoDB auto_increment=1 default charset=utf8

partition by list(id)(

partition p1 values in (1, 3, 5, 7, 9),#id=1,3,5,7,9分配至p1区

partition p2 values in (2, 4, 6, 8, 10)#id=2,4,6,8,10分配至p2区

);

#可以如4.1中使用show create table test_list查看表创建结构。

数据测试:使用4.1中数据测试sql,插入10条数据。

可以发现其查询的仅仅是p1区。如果需要添加分区,可以使用4.1中使用的add partition来添加分区。

4.3 hash分区

使用hash函数得到取模,分配到不同的分区中。分区表达式必须返回整数。

语法展示:partition by hash(分区表达式) partitions 表数量(模数).

示例展示:create table test_hash(

id int auto_increment,

description varchar(50),

primary key(id)

) ENGINE=InnoDB auto_increment=1 default charset=utf8

partition by hash(id) partitions 3; #以id分区,分配到3张表中

数据测试:插入4.1类同10条数据

你也可以尝试修改id值,查看其分配的分区。hash分区还有一种叫做linear hash线性分区,这里不做介绍,

4.4 key分区

在本次开发中,我选择的是key分区,因为其是针对一个或多个字段作为分区字段,不要求是正整数,其内部调用的是自己的hash函数,计算出hash整数值,然后取模分表。

语法展示:partition by key(分区字段组合) partitions 表数(模数)。

操作和Hash分区一致,这里就不做累赘的展示了。

5.额外扩展

5.1 在实际开发中,经常出现的情况是表已经上线使用,那么必须动态添加分区类型。alter table 表名 partition by hash/key (分区字段表达式) [partitions 表数]#如果不加partitions那么默认为1.

alter table 表名 partition by range/list(分区字段表达式)(具体分区设置)。

5.2 当发现之前的分区需要添加新的分区时,采取如下方式:list/range : alter table 表名 add partition (partition 分区名 [values in|values less than] [集合|数值]);

hash/key : alter table 表名 add partition partitions 表数;

例如:修改上述test_hash的分区数量alter table test_hash add partition partitions 6;

5.3 删除某个分区/删除所有分区# 删除某个分区

list/range : alter table 表名 drop partition 分区名1, 分区名2,...;

#例如:

alter table test_list drop partition p1;

hash/key : 上述语法不成立

# 删除整个分区

alter table test_hash remove partitioning;

还有诸如合并分区,以及5.5的一些新特性,list/range 增加column,columns支持。本文不做过多阐述。

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

php分区表,【MYSQL】分区表相关推荐

  1. mysql 分区表 归档_MySQL分区表

    1,MySQL分区表作用 当单表的数据量较大,需要进行定期的数据归档删除时,或者提高查询性能,都可以采用分区: 2,分区表设置 分区的种类 range分区 list分区 hash分区 key分区 ra ...

  2. 数据切分——Mysql分区表的管理与维护

    关于Mysql分区表的介绍可以参考: http://blog.csdn.net/jhq0113/article/details/44592865 关于Mysql分区表的创建可以参考: http://b ...

  3. MySql分区表性能测试及切换案例

    背景 互联网公司的业务变化很快,数据库表结构设计相对比较直接,很少会在前期设计的很完善.当业务存活并发展起来后,就需要在扩展性.安全性等方面进行改进. 比如,我们一张记录用户状态的表,存储在RDS f ...

  4. mysql 分区表_MySQL 分区分表应用场景分析和分区中可能遇到的坑点

    MySQL的分区和分表应用场景分析 在日常工作中当我们的某张表的数据量过大的时候,首当其冲的可能就是进行分区和分表,但是是如何分区或者分表都要结合一点的业务场景下进行分析,才会显著的提升性能,来聊一聊 ...

  5. Mysql分区表的使用

    简单来说,分区表就是把物理表结构相同的几张表,通过一定算法,组成一张逻辑大表.这种算法叫"分区函数",当前 MySQL 数据库支持的分区函数类型有 RANGE.LIST.HASH. ...

  6. 数据切分——Mysql分区表的建立及性能分析

    Mysql的安装方法可以参考: http://blog.csdn.net/jhq0113/article/details/43812895 Mysql分区表的介绍可以参考: http://blog.c ...

  7. 简述MySQL分区表类型

    分区是将一个表的数据按照某种方式,比如按照时间上的月份,分成多个较小的,更容易管理的部分,但是逻辑上仍是一个表.我们在此之前已经讲过MySQL分区表的原理,分区有利于管理非常大的表,它采用分而治之的逻 ...

  8. Mysql分区表概述、分区类型、分区管理

    另有一篇简单易懂的好文章帮助学习 Mysql分区表的原理和优缺点以及注意点 一.分区概述 分区是指根据一定的规则,数据库把一个表分解成多个更小的.更容易管理的部分.分区有利于管理非常大的表. MySQ ...

  9. mysql表分区数量限制_详解MySQL分区表的局限和限制的代码实例

    本文对Mysql分区表的局限性做了一些总结,因为个人能力以及测试环境的 原因,有可能有错误的地方,还请大家看到能及时指出,当然有兴趣的朋友可以去官方网站查阅. 禁止构建 分区表达式不支持以下几种构建: ...

  10. mysql表分区备份_ZRM 2.1:备份MySQL分区表

    ZRM 2.1:备份MySQL分区表 MySQL 5.1通常可供生产使用. MySQL 5.1的主要功能之一就是分区. 表分区可以帮助提高性能和可用性. 表可以根据范围(给定范围内的列值),列表(匹配 ...

最新文章

  1. AI创业周报:元宇宙时代来临!环球墨非风头正盛,53岁女博士领现象级芯片公司获数亿元融资...
  2. 开始您的第一个Google App Engine应用
  3. TTS Text-to-speech(文字转语音)服务
  4. Django从理论到实战(part55)--将网站上传到GitHub
  5. pythonzip是迭代器_Python迭代器和zip
  6. python去重语句_Python Dataframe 指定多列去重、求差集的方法
  7. RuoYi-Cloud 部署篇_02(linux环境 mysql+nginx版本)
  8. 4 谐波_谐波的基础知识
  9. [转]mysql_connect() 不支持 请检查 mysql 模块是否正确加载 解决
  10. 07- HTTP协议详解及Fiddler抓包
  11. 数据库的内连接和外连接的区别
  12. angular写的移动端模板《一》
  13. 英文原文:6 Life Habits That Programming Could Teach You Today
  14. 微软:拿番茄花园开刀与反垄断无关
  15. Ubuntu18.04安装RTL8125/RTL8168等网卡驱动程序
  16. 2021会宁三中高考成绩查询,2019中考分数线
  17. 滚动轴承故障特征频率计算公式
  18. SSM网上书店管理系统毕业设计源码082255
  19. mysql双主架构沈剑_58 沈剑 - 数据库架构师做什么-58同城数据库架构设计思路
  20. Google Earth Engine学习笔记(一)

热门文章

  1. 如何阻止button默认的刷新页面操作
  2. CodeForces 615C
  3. 台阶问题练习题 (简单的dp)
  4. 《金狐系统维护盘》六周年纪念版UD/ISO +PE维护
  5. 什么是Cookie对象,Session对象,Application对象等问题
  6. S3C6410移植u-boot-2010.3(2)基本的启动信息修改
  7. 协议森林14 逆袭 (CIDR与NAT)
  8. POJ-1260 Pearls DP
  9. (转载)做好一个系统分析师、项目经理75条准则(一)
  10. 三维空间中曲线绕任意轴旋转所得的旋转曲面求法