MySQL之分区

密 为什么DB的设计中要使用Long来替换掉Date类型? 这里是修真院后端小课堂,每篇分享文从 八个方面深度解析后端知识/技能,本篇分享的是: 【为什么DB的设计中要使用Long来替换掉Date类型?】 【修真院java 小课堂】为什么DB的设计中要使用Long来替换掉Date类型? 大家好,我是IT修真院深圳分院第12期的学员,一枚正直纯洁善良的java程序员,今天给大家分享一下,修真院官网java任务1的深度思考-为什么DB的设计中要用Long来替代... 阅读详情

分区类型

MySQL分区分为横向分区(按行分区),纵向分区(按列分区)。

查看MySQL是否支持分区?

  • MySQL 5.6一下版本使用如下命令:
mysql> SHOW VARIABLES LIKE '%partition%';
  • MySQL 5.6以上版本使用如下命令
mysql> SHOW PLUGINS;

partition的status是active时表示支持分区。

分区类型

RANGE分区

基于一个给定的连续区间范围,把数据分配到不同的分区。

mysql> CREATE TABLE IF NOT EXISTS `user` (  
 	->   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',  
 	->   `name` varchar(50) NOT NULL DEFAULT '' COMMENT '名称',  
	->   `sex` int(1) NOT NULL DEFAULT '0' COMMENT '0为男,1为女',  
	->   PRIMARY KEY (`id`)  
	-> ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1  
	-> PARTITION BY RANGE (id) (  
	->   PARTITION p0 VALUES LESS THAN (3),  
	->   PARTITION p1 VALUES LESS THAN (6),  
	->   PARTITION p2 VALUES LESS THAN (9),  
	->   PARTITION p3 VALUES LESS THAN (12),  
	->   PARTITION p4 VALUES LESS THAN MAXVALUE  
	-> );  

MAXVALUE表示最大可能的整数值。
当要删除过期的数据时候,只需要简单的语句如此来删除p0分区中的数据:

ALTER TABLE user DROP PARTITION p0;

LIST分区

  • 类似RANGE分区,区别在LIST分区是基于枚举出的值列表分区,而RANGE分组是基于连续区间范围进行分区。
  • 通过使用“PARTITION BY LIST(expr)”来实现,其中“expr”是某列值或一个基于某个列值、并返回一个整数值的表达式。然后通过“VALUES IN (value_list)”的方式来定义每个分区,其中“value_list”是一个通过逗号分隔的整数列表。 如下:
CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY LIST(store_id)
    PARTITION pNorth VALUES IN (3,5,6,9,17),
    PARTITION pEast VALUES IN (1,2,10,11,19,20),
    PARTITION pWest VALUES IN (4,12,13,14,18),
    PARTITION pCentral VALUES IN (7,8,15,16)
);
  • 删除整个分区比起DELETE FROM要高效的多。
  • 如果试图插入列值(或分区表达式的返回值)不在分区值列表中的一行时,那么“INSERT”查询将失败并报错。

COLUMNS分区

  • 它是在MySQL 5.5引入的分区类型,实际上是为了解决RANGE和LIST分区只支持整数分区的问题。COLUMNS可以细分为RANGE?COLUMNS和LIST?COLUMNS分区,他们都支持整数,日期时间,字符串三大数据类型:
  1. 所有的整数类型,int,tinyint,bigint等,但不支持decimal,float等;
  2. 日期时间类型:date和datetime;
  3. 字符类型:char,varchar,binary,varbinary;不支持text和blob类型;
  • COLUMNS分区仅支持一个或多个列名做为分区键,而并不支持表达式作为分区键, 如上RANGE分区year(datadate),即使返回整型也不可以;但是其中一大亮点是能够支持多列分区。

RANGE COLUMNS

如下:

CREATE TABLE test1 (
    a INT,
    b INT
)
PARTITION BY RANGE COLUMNS(a, b) (
    PARTITION p0 VALUES LESS THAN (5, 12),
    PARTITION p3 VALUES LESS THAN (MAXVALUE, MAXVALUE)
);

INSERT INTO test1 VALUES (5,10), (5,11), (5,12);

元组值比较如下,先用第一个比较,如果第一个值小于分区的第二个值则直接返回true,不进行第二个值的比较。如果第一个值相等,则进行第二个值的比较。

LIST COLUMNS

CREATE TABLE test3 (
    first_name VARCHAR(25),
    last_name VARCHAR(25),
    street_1 VARCHAR(30),
    street_2 VARCHAR(30),
    city VARCHAR(15),
    renewal DATE
)
PARTITION BY LIST COLUMNS(city) (
    PARTITION pRegion_1 VALUES IN('Oskarshamn', 'H?gsby', 'M?nster?s'),
    PARTITION pRegion_2 VALUES IN('Vimmerby', 'Hultsfred', 'V?stervik'),
    PARTITION pRegion_3 VALUES IN('N?ssj?', 'Eksj?', 'Vetlanda'),
    PARTITION pRegion_4 VALUES IN('Uppvidinge', 'Alvesta', 'V?xjo')
);

和RANGE COLUMNS一样,支持其他数据类型作分区键。

HASH分区

  • 基于用户自定义的表达式返回值来选择分区,该表达式对要插入到表中的列值操作。
  • 根据给定的分区个数,将数据分布到不同的分区,HASH分区只对整数有效,对应非整型将会转换为整型,MySQL支持两种HASH分区:常规HASH和线性HASH。
  • 要使用HASH分区来分割一个表,要在CREATE TABLE 语句上添加一个“PARTITION BY HASH (expr)”子句,其中“expr”是一个返回一个整数的表达式或者列值此外,你很可能需要在后面再添加一个“PARTITIONS num”子句,其中num是一个非负的整数,它表示表将要被分割成分区的数量。
  • 实际上常规的hash是基于取模运算来判断新记录应该插入到那个分区的。例如,id=2, 运算表达式为mod(2, 4)。
  • 常规hash可以使数据均匀地平均分布到每一个分区中,但由于分区在创建的时候已经固定了。所以新增或收缩分区的数据迁移非常大。

线性HASH分区

  • 线性HASH分区与常规HASH分区不同之处在于线性HASH使用线性的2的幂运算法则,并且分区关键字为LINEAR HASH。
  • PARTITION BY LINEAR HASH(YEAR(hired))。
  • 线性HASH分区的优点是增加、删除、合并和拆分分区会变得更加快捷,有利于吃力大量数据的表。缺点是数据分布不均匀。

KEY分区

  • 类似HASH分区,但是HASH分区允许使用用户自定义的表达式,而KEY分区只能使用MySQL服务器提供的HASH函数,同时HASH分区只支持整数分区,而KEY分区支持除BLOB和TEXT类型外的其他列。
  • 在创建key分区的时候,不指定分区键,则会默认使用主键作为分区键,没有主键的情况下会选择非空唯一键作为分区键。
  • 在key分区的时候使用LINER关键字会与LINER HASH有同样的效果。

分区对NULL的处理

  • MySQL不禁止在分区键上使用NULL,这时会把NULL作为0或最小值处理。

查看分区内容

select partition_name part, partition_expression expr, partition_description descr, table_rows from information_schema.partitions where TABLE_SCHEMA = schema() AND table_name = 'test1'; // 表名

分区的优点

  • 分区表的数据可以分布在多个不同的物理设备上,从而高效地利用多个硬件设备。
  • 和单个磁盘或者文件系统相比,可以存储更多的数据。
  • 优化查询。在where条件中包含分区条件时,可以只扫描对应分区来提高查询效率。
  • 涉及sum和count语句时,也可以在多个分区上并行处理,最后汇总结果。
  • 分区表更容易维护。例如:想批量删除大量数据可以清除整个分区。
  • 可以使用分区表来避免某些特殊的瓶颈,例如InnoDB的单个索引的互斥访问,ext3问价你系统的inode锁竞争等。

分区的缺点

  • 一个表最多只能有1024个分区。
  • MySQL 5.1中,分区表达式必须是整数,或者返回整数的表达式。在MySQL5.5中提供了非整数表达式分区的支持。
  • 分区表无法使用外键约束。
  • MySQL的分区适用于一个表的所有数据和索引。不能只对表数据分区而不对索引分区,也不能只对索引分区而不对表分区,也不能只对表的一部分数据分区。
  • 如果分区字段中有主键或者唯一索引的列,那么多有主键列和唯一索引列都必须包含进来。即:分区字段要么不包含主键或者索引列,要么包含全部主键和索引列。

分区键,主键和唯一键的关系

  • 分区表的分区表达式中使用的所有列必须是表可能具有的每个唯一键的一部分。

分区的问题

分区的策略的依据是:查询能够过滤(prunning)掉很多额外的分区、分区本身并不会带来很多额外的代价。

NULL值会使分区过滤无效

  • 关于分区表一个容易让人误解的地方就是分区的表达式可以为NULL。
  • 第一个分区是一个特殊的分区,当列的值为NULL或非法值的时候都会插入到第一个分区。现在假设有下面的查询:WHERE order_date BETWEEN ‘2012-01-01’ AND ‘2012-01-31’。这时候MySQL会检查两个分区,而不是一个。因为YEAR()函数在结束非法值的时候会返回NULL,这么这个值可能会放到第一个分区。其他很多函数,如TO_DAYS()也一样。
  • 可以通过创建一个无用的分区来避免这种情况。如PARTITION p_nulls VALUES LESS THAN(0),这样当插入的数据是有效值的时候,第一个分区就是空的,这样即使要检查第一个分区,代价也会非常小。
  • 解决这个问题最好的方式是使用MySQL 5.5的列分区,如,PARTITION BY RANGE COLUMNS(order_date)。

分区列和索引列不匹配

  • 如果定义的索引列和分区列不匹配,会导致查询无法进行分区过滤。应该避免建立和分区列不匹配的索引,除非查询中还同时包含了可以过滤分区的条件。
  • 在一个关联查询中,分区表在关联顺序中是第二个表,并且关联使用的索引和分区条件并不匹配。那么关联时针对第一个表符合条件的每一行,都需要访问并搜索第二个表的所有分区。

选择分区的成本可能很高

  • 不同类型的分区实现方式不同,性能也各不相同。尤其是范围分区,对于回答“这一行属于哪个分区”、“这些符合查询条件的行在哪些分区”这样的问题的成本可能会非常高,因为服务器需要扫描所有的分区定义的列表来找到正确的答案。类似这样的线性搜索的效率不高,所以随着分区数的增长,成本会越来越高。
  • 可以通过限制分区的数量来缓解此问题,根据实践经验,对大多数系统来说,100个左右的分区是没有问题的。
VSCode里玩转AvaloniaUI:手把手教你搭建跨平台桌面应用开发环境(附.NET 7配置避坑) 本文详细介绍了如何在VSCode中搭建AvaloniaUI跨平台桌面应用开发环境,包括.NET 7配置避坑指南。从环境准备、项目创建到调试优化,手把手教你利用VSCode和Avalonia实现高效开发,特别解决了.NET 7依赖等常见问题,助力开发者快速上手跨平台应用开发。 阅读详情

相关推荐

告别纯文本RAG:用Dify 1.11.0多模态知识库,5步搭建一个能“读图”的智能客服助手

本文详细介绍了如何利用Dify 1.11.0多模态知识库构建智能视觉客服助手,通过5个步骤实现图片内容理解与专业回复。从准备多模态素材到配置知识库节点,再到设计工作流逻辑和性能优化,帮助开发者快速搭建高效客服系统,显著提升用户体验和问题解决效率。

weixin_30832143的博客 451

『Mysql』Mysql四种分区方式及组合分区落地实现

📣读完这篇文章里你能收获到, Mysql分区的概念, Mysql分区四种分区方式的落地及案例, Mysql分区的管理

老陈聊架构 1万+

【AAAI 2025】轻量级特征增强新范式!FCM 模块助力小目标检测,即插即用提升模型泛化能力

本文介绍了AAAI 2025提出的轻量级特征增强新范式FCM模块,它通过显式分离并双向交互语义与空间特征,有效解决了小目标检测中特征信息失配的核心难题。该模块设计精巧,计算开销极低,能够即插即用式地嵌入YOLO等主流检测网络,显著提升模型对小目标的泛化检测能力,尤其适用于遥感、自动驾驶等对计算资源敏感的实际场景。

weixin_29056145的博客 287

spark的转换算子2

1)coalesce def coalesce(numPartitions: Int, shuffle: Boolean = false)(implicit ord: Ordering[T] = null): RDD[T] 该函数用于将RDD进行重分区,使用HashPartitioner。 第一个参数为重分区的数目,第二个为是否进行shuffle,默认为false; 作用 缩减分区数,用于大数据集过滤后,提高小数据集的执行效率。 val ListRDD: RDD[Int] = context.makeRDD

changshupx的博客 2093

保姆级教程:用Multisim仿真快速上手二极管、MOSFET和IGBT的开关特性

本文提供了一份详细的Multisim仿真教程,帮助读者快速掌握二极管、MOSFET和IGBT的开关特性。通过搭建实验电路、观察波形特征和参数影响分析,深入解析了反向恢复过程、米勒平台现象和拖尾电流效应。适合电力电子初学者和工程师通过仿真建立直观理解,提升电路设计能力。

weixin_29290863的博客 498

QGC二次开发实战指南(一):从零构建自定义地面站界面

本文详细介绍了QGC二次开发实战指南,从零开始构建自定义地面站界面。通过QT和QML技术结合MAVLINK协议,开发者可以打造适合特定业务场景的无人机监控系统,提升操作效率与用户体验。文章包含环境搭建、界面设计、数据绑定等完整开发流程,是QGC二次开发的实用教程。

weixin_28693683的博客 496

mysql 给大表分区_mysql重新分区表大得多

我在mysql 5.6.10实例上有一个非常大的表(大约4.8亿行)。存储引擎是InnoDB。 (表和数据库默认值)。该表通过merchantId(bigint:一种客户端标识符)的散列进行分区,该查询在与单个商家相关的查询时提供帮助。由于查询跨越多个商家时性能显着下降,我决定在ACTION_DATE(活动发生的DATE)按范围对表进行重新分区。认为我很聪明,我决定添加一些(5)新字段供将来使用(...

weixin_31293685的博客 772

S4 Hana SD -信贷管理 - 02

在S4版本中,客户的信用管理数据在事务代码BP维护,业务伙伴角色是UKM000。在维护过程中,我们并不能直接输入信贷控制范围这个组织架构,而是需要输入一个信用段,并且在信用段的维度下去维护相应信用管理数据。对于信用段,可以分为主信用段(信用段是0000)和其他临时信用段,我们可以通过配置把次级信用段的客户信贷负债汇总到主信用段。当然,在后台也有配置,会把信用段和信贷控制范围这两者进行关联.3.2SPROIMG > 财务供应链管理 > 信用管理 > 信贷风险监视 > 主数据 > 创建信用段。

weixin_46525734的博客 1965

数据库中的时间类型(timestamp ,datatime ,bigint),你选对了吗?

1、timestamp 占用4个字节,时间范围为1970-01-01 08:00:01到2038-01-19 11:14:07。2038年以后的时间,是无法用timestamp类型存储的。 但是它有一个优势,timestamp类型是带有时区信息的。一旦你系统中的时区发生改变,例如你修改了时区,该字段的值会自动变更。这个特性用来做一些国际化大项目,跨时区的应用时,特别注意! 2、datetime 占用8个字节,时间范围为1000-01-01 00:00:00 ~ 9999-12-31 23:59:59。显然,

持之以恒 4521

lammps原子组速度的计算方法

在lammps摩擦、冲击、压痕等模拟过程中,涉及到某个原子组的整体移动,如果要输出这个原子组的整体移动速度,可以使用vcm()函数。下面是一个具体的使用案例,金刚石球在盒子内移动,输出移动过程中金刚石球在x方向的质心速度。vcm()是lammps自带的一个函数,返回原子组质心在设定方向的速度。其中,ID为group-ID,dim为方向,可设置x、y或者z方向。大家好,我是小马老师。

lammps_jiayou的博客 343

【第07例】IPD体系进阶: 6 个技术评审点(TR)

TR技术评审点

产品线负责人 4415

Mysql 分区

介绍MySQL分区原理以及基本使用方法。

m0_64931123的博客 1950

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

mysql 分区 varchar_MySQL分区总结

前言:分区是指根据一定的规则,数据库把一个表分解成多个更小的,更容易管理的部分。分区对应用来说是完全透明的,不影响应用的业务逻辑。MySQL分区的优点:1、和单个磁盘或者文件系统分区相比,可以存储更多数据;2、优化查询。在Where字句中包含分区条件时,可以只扫描必要的一个或多个分区来提高查询效率;同时在涉及 SUM() 和 COUNT() 等聚合函数的查询时,可以容易地在每个分区上并行处理,最终...

weixin_39801356的博客 2104

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

mysql分区之range分区

随着互联网的发展,各方面的数据越来越多,从最近两年大数据越来越强的呼声中就可见一斑。 我们所做的项目虽算不上什么大项目,但是由于业务量的问题,数据也是相当的多。 数据一多,就很容易出现性能问题,而为了解决这个问题我们通常很容易想到集群、分片等。 但是在某些时候却不一定必须要用集群、分片,也可以适当的使用数据分区。什么是分区? (以下引用自:http://wangweiak47.blog.51

程序员涂小哥的技术博客 7562

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

mysql分区

mysql分区

果果的博客 3056

mysql如何进行分区_mysql如何进行分区_mysql分区有哪些方法

MySQL 可应用于多种语言,包括 PERL, C, C++, JAVA 和 PHP。 在这些语言中,MySQL 在 PHP 的 web 开发中是应用最广泛。大家知道mysql如何分区的吗?下面由学习啦小编为大家整理的mysql分区的方法,希望大家喜欢!mysql分区的方法一、概述当 MySQL的总记录数超过了100万后,会出现性能的大幅度下降吗?答案是肯定的,但是,性能下降>的比率不一而同...

weixin_39912368的博客 3606

mysql 分区表max_mysql 分区

一、查看MySQL是否支持分区1、MySQL5.6以及之前版本show variables like '%partition%';2、MySQL5.7show plugins;二、分区表的分类与限制1、分区表分类RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。HASH分区:...

weixin_39889642的博客 664

Mysql中default分区,MySQL分区总结

CREATE TABLE employees (id INT NOT NULL,fname VARCHAR(30),lname VARCHAR(30),hired DATE NOT NULL DEFAULT '1970-01-01',separated DATE NOT NULL DEFAULT '9999-12-31',job_code INT NOT NULL,store_id INT NOT...

weixin_35144647的博客 1075

MySQL分区及索引

mysql分区后每个分区成了独立的文件,虽然从逻辑上还是一张表其实已经分成了多张独立的表,从“information_schema.INNODB_SYS_TABLES”系统表可以看到每个分区都存在独立的TABLE_ID,由于Innodb数据和索引都是保存在".ibd"文件当中(从INNODB_SYS_INDEXES系统表中也可以得到每个索引都是对应各自的分区(primary key和unique也不例外)),所以分区表的索引也是随着各个分区单独存储。

liudachu的博客 2255

MYSQL表分区,查看分区

一、       mysql分区简介 数据库分区 数据库分区是一种物理数据库设计技术。虽然分区技术可以实现很多效果,但其主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减sql语句的响应时间,同时对于应用来说分区完全是透明的。 MYSQL的分区主要有两种形式:水平分区和垂直分区   水平分区(HorizontalPartitioning) 这种形式的分区是对根据表的行进行分区,...

qq_35726305的博客 9829

mysql的hash分区_mysql的分区之key,hash分区

MySQl的分区与分表1 分区的认识1) 情景假设假如有1000万条数据,放到一个表中会出现查询速度很慢的情况.但是如果我们将数据分散保存到10个表中,每一个表中100万数据,这是速度就会得到很大的提升!但是让我们手动分表,就会造成很大的麻烦.所以我们直接使用mysql的分区技术.2) 分区的示意图图片.png1 虽然内部分成了四个区,但是对外提供服务的依旧是一张表.2 存到哪里以及从哪里取,这个...

weixin_42567279的博客 1401

mysql分区表truncate分区数据_详解MySQL分区表

前言:分区是一种表的设计模式,通俗地讲表分区是将一大表,根据条件分割成若干个小表。但是对于应用程序来讲,分区的表和没有分区的表是一样的。换句话来讲,分区对于应用是透明的,只是数据库对于数据的重新整理。本篇文章给大家带来的内容是关于MySQL中分区表的介绍及使用场景,有需要的朋友可以参考一下,希望对你有所帮助。1.分区的目的及分区类型MySQL在创建表的时候可以通过使用PARTITION BY子句定...

weixin_42507868的博客 4385

Mysql分区

mysql分区

a250353831的博客 834

查找mysql的分区情况_mysql 分区查询(mysql表分区查询)

mysql 分区查询(mysql表分区查询)2020-07-24 11:39:07共10个回答可以看mysql的data文件夹下面的数据库文件,就可以查看当前分区情况.还有几种获取mysql分区表信息的常用方法showcreatetable可以查看创建分区表的create语句showtablestatus可以查看表是否为分区表查看information_schema.partitions表可以查看...

weixin_39846089的博客 5230

MYSQL分区

RANGE分区:基于一个给定区间边界,得到若干个连续区间范围,按照分区键的落点,把数据分配到不同的分区;LIST分区:类似RANGE分区,区别在于LIST分区是基于枚举出的值列表分区,RANGE是基于给定连续区间范围分区;HASH分区:基于用户自定义的表达式的返回值,对其根据分区数来取模,从而进行记录在分区间的分配的模式。这个用户自定义的表达式,就是MySQL希望用户填入的哈希函数。

huaweichenai的博客 1243
上一篇: MySQL之用户自定义变量
下一篇: maven打包命令
菜鸟=大神
博客等级 码龄11年 5粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值