首页 数据库 mysql教程 【MYSQL】分区表

【MYSQL】分区表

Jun 07, 2016 pm 02:55 PM
mysql 分区表 基本 态度

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

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

    1.引言

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

    

    2.环境要求

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

wKioL1R6ym7A0CplAABfWiOHn-I850.jpg

    使用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;
登录后复制

650) this.width=650;" title="p1png.png" alt="wKioL1R6z4qC137DAADITZNS8H8149.jpg" />

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

数据测试:

    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条数据,此时我们来查看其查询执行过程:

650) this.width=650;" title="p2.png" alt="wKioL1R60LDBET1bAADRpczcpSo931.jpg" />

从结果可以发现,其只是在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 11	0.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的数据,并执行查询解析:

650) this.width=650;" title="p3.png" alt="wKiom1R60nnwSlUUAADL0geAo20618.jpg" /> 发现,已经将其分配到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条数据。

650) this.width=650;" title="p4.png" alt="wKioL1R61Y-RjP7aAADWGviW2FI351.jpg" /> 可以发现其查询的仅仅是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条数据

650) this.width=650;" title="p5.png" alt="wKioL1R615mA8FC8AADLcG2rGPs147.jpg" />

你也可以尝试修改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支持。本文不做过多阐述。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

MySQL:世界上最受欢迎的数据库的简介 MySQL:世界上最受欢迎的数据库的简介 Apr 12, 2025 am 12:18 AM

MySQL是一种开源的关系型数据库管理系统,主要用于快速、可靠地存储和检索数据。其工作原理包括客户端请求、查询解析、执行查询和返回结果。使用示例包括创建表、插入和查询数据,以及高级功能如JOIN操作。常见错误涉及SQL语法、数据类型和权限问题,优化建议包括使用索引、优化查询和分表分区。

MySQL的位置:数据库和编程 MySQL的位置:数据库和编程 Apr 13, 2025 am 12:18 AM

MySQL在数据库和编程中的地位非常重要,它是一个开源的关系型数据库管理系统,广泛应用于各种应用场景。1)MySQL提供高效的数据存储、组织和检索功能,支持Web、移动和企业级系统。2)它使用客户端-服务器架构,支持多种存储引擎和索引优化。3)基本用法包括创建表和插入数据,高级用法涉及多表JOIN和复杂查询。4)常见问题如SQL语法错误和性能问题可以通过EXPLAIN命令和慢查询日志调试。5)性能优化方法包括合理使用索引、优化查询和使用缓存,最佳实践包括使用事务和PreparedStatemen

apache怎么连接数据库 apache怎么连接数据库 Apr 13, 2025 pm 01:03 PM

Apache 连接数据库需要以下步骤:安装数据库驱动程序。配置 web.xml 文件以创建连接池。创建 JDBC 数据源,指定连接设置。从 Java 代码中使用 JDBC API 访问数据库,包括获取连接、创建语句、绑定参数、执行查询或更新以及处理结果。

为什么要使用mysql?利益和优势 为什么要使用mysql?利益和优势 Apr 12, 2025 am 12:17 AM

选择MySQL的原因是其性能、可靠性、易用性和社区支持。1.MySQL提供高效的数据存储和检索功能,支持多种数据类型和高级查询操作。2.采用客户端-服务器架构和多种存储引擎,支持事务和查询优化。3.易于使用,支持多种操作系统和编程语言。4.拥有强大的社区支持,提供丰富的资源和解决方案。

docker怎么启动mysql docker怎么启动mysql Apr 15, 2025 pm 12:09 PM

在 Docker 中启动 MySQL 的过程包含以下步骤:拉取 MySQL 镜像创建并启动容器,设置根用户密码并映射端口验证连接创建数据库和用户授予对数据库的所有权限

MySQL的角色:Web应用程序中的数据库 MySQL的角色:Web应用程序中的数据库 Apr 17, 2025 am 12:23 AM

MySQL在Web应用中的主要作用是存储和管理数据。1.MySQL高效处理用户信息、产品目录和交易记录等数据。2.通过SQL查询,开发者能从数据库提取信息生成动态内容。3.MySQL基于客户端-服务器模型工作,确保查询速度可接受。

laravel入门实例 laravel入门实例 Apr 18, 2025 pm 12:45 PM

Laravel 是一款 PHP 框架,用于轻松构建 Web 应用程序。它提供一系列强大的功能,包括:安装: 使用 Composer 全局安装 Laravel CLI,并在项目目录中创建应用程序。路由: 在 routes/web.php 中定义 URL 和处理函数之间的关系。视图: 在 resources/views 中创建视图以呈现应用程序的界面。数据库集成: 提供与 MySQL 等数据库的开箱即用集成,并使用迁移来创建和修改表。模型和控制器: 模型表示数据库实体,控制器处理 HTTP 请求。

centos7如何安装mysql centos7如何安装mysql Apr 14, 2025 pm 08:30 PM

优雅安装 MySQL 的关键在于添加 MySQL 官方仓库。具体步骤如下:下载 MySQL 官方 GPG 密钥,防止钓鱼攻击。添加 MySQL 仓库文件:rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm更新 yum 仓库缓存:yum update安装 MySQL:yum install mysql-server启动 MySQL 服务:systemctl start mysqld设置开机自启动

See all articles