MySQL分区表对NULL值的处理

MySQL分区表及MySQL5.7对其的改进 基础认识从MySQL 5.7.17起,MySQL服务器中的通用分区处理程序已被弃用,并且在用于给定表的存储引擎预期提供自己的(“native”)分区处理程序时,将在MySQL 8.0中删除。 目前,只有InnoDB和NDB存储引擎才能做到。SELECT PLUGIN_NAME AS NAME, PLUGIN_VERSION AS Version, PL 阅读详情
  • GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。
  • GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。
  • 作者:王权富贵

1.概述

MySQL的分区表没有禁止NULL值作为分区表达式的值,无论它是列值还是用户提供的表达式的值,需要记住NULL值不是数字。MySQL的分区实现中将NULL视为小于任何非NULL值,与order by类似。

2.range分区表处理NULL

1.创建range分区表

CREATE TABLE t_range (
c1 INT,
c2 VARCHAR(20)
)
PARTITION BY RANGE(c1) (
  PARTITION p0 VALUES LESS THAN (0),
  PARTITION p1 VALUES LESS THAN (10),
  PARTITION p2 VALUES LESS THAN MAXVALUE
);

2.插入2条分区列为null值的数据

insert into t_range values (NULL,'a'),(NULL,'b');

3.查看数据的分布情况

mysql> SELECT TABLE_NAME, PARTITION_NAME, TABLE_ROWS, AVG_ROW_LENGTH, DATA_LENGTH
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_SCHEMA = 'test1' AND TABLE_NAME = 't_range';
+------------+----------------+------------+----------------+-------------+
| TABLE_NAME | PARTITION_NAME | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH |
+------------+----------------+------------+----------------+-------------+
| t_range    | p0             |          2 |           8192 |       16384 |
| t_range    | p1             |          0 |              0 |       16384 |
| t_range    | p2             |          0 |              0 |       16384 |
+------------+----------------+------------+----------------+-------------+
3 rows in set (0.01 sec)

mysql> select * from t1 partition(p0);
+------+------+
| c1   | c2   |
+------+------+
| NULL | a    |
| NULL | b    |
+------+------+
2 rows in set (0.00 sec)

可以看到分区列包含null值的2条数据都分布在p0分区上。

3.list分区表处理NULL

1.创建2张list分区表,t_list1分区列包含null值,t_list2分区列中不包含null值

CREATE TABLE t_list1 (
c1 INT,
c2 VARCHAR(20)
)
PARTITION BY LIST(c1) (
    PARTITION p0 VALUES IN (0, 3, 6),
    PARTITION p1 VALUES IN (1, 4, 7),
    PARTITION p2 VALUES IN (2, 5, 8),
    PARTITION p3 VALUES IN (NULL)
);

CREATE TABLE t_list2 (
c1 INT,
c2 VARCHAR(20)
)
PARTITION BY LIST(c1) (
    PARTITION p0 VALUES IN (0, 3, 6),
    PARTITION p1 VALUES IN (1, 4, 7),
    PARTITION p2 VALUES IN (2, 5, 8)
);

2.分别向2张表中插入2条分区列为null值的数据

mysql> insert into t_list1 values (NULL,'a'),(NULL,'b');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into t_list2 values (NULL,'a'),(NULL,'b');
ERROR 1526 (HY000): Table has no partition for value NULL

可以看到 t_list2 表的分区列中不包含null值,所以数据插入失败。

3.查看数据的分布情况

mysql> SELECT TABLE_NAME, PARTITION_NAME, TABLE_ROWS, AVG_ROW_LENGTH, DATA_LENGTH
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_SCHEMA = 'test1' AND TABLE_NAME = 't_list1';
+------------+----------------+------------+----------------+-------------+
| TABLE_NAME | PARTITION_NAME | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH |
+------------+----------------+------------+----------------+-------------+
| t_list1    | p0             |          0 |              0 |       16384 |
| t_list1    | p1             |          0 |              0 |       16384 |
| t_list1    | p2             |          0 |              0 |       16384 |
| t_list1    | p3             |          2 |           8192 |       16384 |
+------------+----------------+------------+----------------+-------------+
4 rows in set (0.00 sec)

可以看到 t_list1 表中插入的2条包含null值的数据,由于p3分区包含null值列,所以2条数据分布在p3分区中。

4.hash/key分区表处理NULL

1.创建2张测试表,一张hash分区表,一张key分区表

CREATE TABLE t_hash (
c1 INT,
c2 VARCHAR(20)
)
PARTITION BY HASH(c1)
PARTITIONS 2;

CREATE TABLE t_key (
c1 INT,
c2 VARCHAR(20)
)
PARTITION BY key(c1)
PARTITIONS 2;

2.分别向2张表中插入3条分区列为null值的数据

mysql> insert into t_hash values (NULL,'a'),(0,'b'),(1,'c');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> insert into t_key values (NULL,'a'),(0,'b'),(1,'c');
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

3.查看数据的分布情况

mysql> SELECT TABLE_NAME,PARTITION_NAME,TABLE_ROWS,AVG_ROW_LENGTH,DATA_LENGTH FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA = 'test1' AND TABLE_NAME in ('t_hash','t_key');
+------------+----------------+------------+----------------+-------------+
| TABLE_NAME | PARTITION_NAME | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH |
+------------+----------------+------------+----------------+-------------+
| t_hash     | p0             |          2 |           8192 |       16384 |
| t_hash     | p1             |          1 |          16384 |       16384 |
| t_key      | p0             |          2 |           8192 |       16384 |
| t_key      | p1             |          1 |          16384 |       16384 |
+------------+----------------+------------+----------------+-------------+
4 rows in set (0.00 sec)

mysql> select * from t_hash partition(p0);
+------+------+
| c1   | c2   |
+------+------+
| NULL | a    |
|    0 | b    |
+------+------+
2 rows in set (0.00 sec)

mysql> select * from t_key partition(p0);
+------+------+
| c1   | c2   |
+------+------+
| NULL | a    |
|    1 | c    |
+------+------+
2 rows in set (0.00 sec)

可以看到分区列中包含null值的记录都在p0分区。

4.如果我们增加hash/key分区表的分区数,分区列为null值的记录会分布到其他分区

# 创建hash/key分区表,分区数为3
CREATE TABLE t_hash1 (
c1 INT,
c2 VARCHAR(20)
)
PARTITION BY HASH(c1)
PARTITIONS 3;

CREATE TABLE t_key1 (
c1 INT,
c2 VARCHAR(20)
)
PARTITION BY key(c1)
PARTITIONS 3;


# 插入数据
insert into t_hash1 values (NULL,'a'),(0,'b'),(1,'c');
insert into t_key1 values (NULL,'a'),(0,'b'),(1,'c');


# 查看数据的分布情况
mysql> SELECT TABLE_NAME,PARTITION_NAME,TABLE_ROWS,AVG_ROW_LENGTH,DATA_LENGTH FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA = 'test1' AND TABLE_NAME in ('t_hash1','t_key1');
+------------+----------------+------------+----------------+-------------+
| TABLE_NAME | PARTITION_NAME | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH |
+------------+----------------+------------+----------------+-------------+
| t_hash1    | p0             |          1 |          16384 |       16384 |
| t_hash1    | p1             |          1 |          16384 |       16384 |
| t_hash1    | p2             |          1 |          16384 |       16384 |
| t_key1     | p0             |          0 |              0 |       16384 |
| t_key1     | p1             |          2 |           8192 |       16384 |
| t_key1     | p2             |          1 |          16384 |       16384 |
+------------+----------------+------------+----------------+-------------+
6 rows in set (0.00 sec)

mysql> select * from t_hash1 partition(p2);
+------+------+
| c1   | c2   |
+------+------+
| NULL | a    |
+------+------+
1 row in set (0.00 sec)

mysql> select * from t_key1 partition(p2);
+------+------+
| c1   | c2   |
+------+------+
| NULL | a    |
+------+------+
1 row in set (0.00 sec)

可以看到,当hash/key分区表的分区数为3时,分区列为null值的记录分布在了p2分区。

5.总结

range分区表:如果插入记录的分区列值为NULL,则将该行记录插入到最小的分区中。

list分区表:对NULL值的处理有2种方式:

(1)当且仅当只有一个分区使用包含NULL的值做分区表达式时(例如:PARTITION p3 VALUES IN (NULL)),允许插入分区列为NULL的值。

(2)当表中没有显示使用包含NULL的值做分区表达式时,会拒绝插入分区列为NULL的值。

hash/key分区表:对NULL的处理略有不同,不同的分区数,会导致分区列为NULL值的记录分布到不同的分区。


Enjoy GreatSQL :)

关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

相关链接: GreatSQL社区 Gitee GitHub Bilibili

GreatSQL社区:

捉虫活动详情:https://greatsql.cn/thread-97-1-1.html

社区博客有奖征稿详情:https://greatsql.cn/thread-100-1-1.html

6440

18.8.3 HASH分区与KEY分区中的NULL值 18.8.3 HASH分区与KEY分区中的NULL值 HASH分区与KEY分区中处理NULL值的方式相同,就是将NULL值当作0进行处理。例如,创建t_members_hash_null数据表,按照id字段进行HASH分区。 mysql> CREATE TABLE t_members_hash_null ( -> id INT, -> t_name... 阅读详情

相关推荐

system_stm32f10x.c文件分析

配置系统时钟(包括系统时钟源、锁相环(PLL)倍频系数、高级高性能总线(AHB)/ 高级外设总线(APBx)预分频器以及闪存相关设置)。该函数在系统复位后的启动阶段被调用,且调用时机早于跳转到主程序之前。

Jia shuheng的博客 603

创建单独的分区存储NULL记录

今天朋友问我一个问题,如何建立一个分区表,使得包含NULL记录在单独的分区,而其他记录在另一个分区。 由于NULL的特殊性,任何与NULL的比较结果都是NULL,所以在处理分区列的时候有点麻烦。如果要加上NVL、D...

ckawt40802的专栏 143

医院网络设计(完整文档+思科拓扑图)

大家好,我是小华学长,一名计算机领域的博主。经过多年的学习和实践,我积累了丰富的计算机知识和经验,在这里我想与大家分享我的学习心得和技巧,帮助你成为更好的程序员。作为一名计算机博主,我一直专注于编程、算法、软件开发等领域,在这些方面积累了大量的经验。我相信分享是一种双赢的方式,通过分享,我可以帮助他人提升技术水平,同时也能够得到学习交流的机会。在我的文章中,你将会看到我对于各种编程语言、开发工具以及常见问题的解析和分析。我会结合自己的实际项目经验,为你提供实用的解决方案和优化技巧。

qq1325513482的博客 2万+

mysql 对null 的三种处理方式

select * from girl ; # +--+----+------+ # |id|name|boy_id| # +--+----+------+ # |1 |A |1 | # |2 |B |1 | # |3 |C |3 | # |4 |C |3 | # |5 |C |3 | # |6 |D |NULL | # |7 |D |NULL | # |8 |C |2 | # +--+----+------+ ...

qq_38807606的博客 5608

EtherCAT主站开发(学习笔记一)

摘要:本文介绍了基于STM32H7的EtherCAT主站开发探索。EtherCAT是一种高实时性工业以太网协议,具有低延迟、高带宽利用率等特点。文章详细解析了EtherCAT的协议架构、帧结构和工作原理,重点阐述了PDO数据传输过程及主从站通信机制。同时介绍了CoE、FoE等应用层协议扩展。作者将基于SOEM开源协议栈进行开发,为后续实际应用中的伺服电机控制奠定基础。

weixin_69388007的博客 1475

UNet改进(6):基于注意力机制的多尺度医学图像分割方法

本文提出了一种集成多尺度注意力机制的UNet改进模型UNetWithAttention,用于提升医学图像分割性能。该模型在标准UNet架构基础上,设计了并行3×3、5×5、7×7卷积核的多尺度注意力模块,通过特征拼接和Sigmoid激活生成注意力权重,实现了对不同尺寸病变的自适应关注。模型采用分离式设计,将特征提取与特征选择解耦,在编码器-解码器各阶段嵌入注意力模块。实验表明,该方法在视网膜血管分割和肺结节检测任务中优于标准UNet,Dice系数和IOU分别提升2.6%和4.1%,同时保持计算效率。

2501_91516851的博客 1324

在MySQL中如何处理NULL值?

处理NULL值的方法有很多,选择哪一种取决于具体的需求和场景。重要的是要理解NULL值的含义,并知道如何在查询中正确地处理它们。

长风破浪会有时的博客 1157

大数据领域数据产品的交通运输行业应用

您是否经历过早高峰被堵在桥上,看着导航显示“前方5公里缓行”却无能为力?是否见过货车司机绕远路导致成本飙升?这些“交通痛点”的背后,是传统交通管理依赖经验决策的局限。本文将聚焦“大数据数据产品”这一核心工具,从技术原理到实际应用,全面解析它如何为交通运输行业“开天眼”,解决从城市拥堵到物流效率的一系列难题。本文将按照“问题引入→概念拆解→技术原理→实战案例→应用场景→未来趋势”的逻辑展开,用生活化比喻降低理解门槛,用代码和数学模型提升专业性,最终帮您建立“大数据+交通”的完整认知框架。交通数据。

操作系统内核探秘的博客 237

MySQL分区表处理NULL值的方式:建议将分区键设置成NOT NULL

在按HASH和KEY分区的情况下,任何产生NULL值的表达式mysql都视同它的返回值为0。如果是list分区表,那么null行将被保存到list为0的分区。为了避免这种情况的产生,建议分区键设置成NOT NULL。如果分区键所在列没有。

学亮编程手记 254

Vue3 - Element Plus 表格组件 el-table “表格行数据中又嵌套了二维对象数组“,按平级循环渲染(嵌套数组视为同级行数据), 对嵌套的数组循环展示为表格,智能合并行或列详细教程

vue3,nuxt3,element-plus,table表格组件,el-table,vue3element表格组件,数据中有二维数组怎么遍历循环显示,表格数据带二级数组怎么循环渲染显示,表格数据中存在一个数组要怎么才能显示到表格,el-table表格合并详细教程示例,table表格如果对象里面还有对象数组那该怎么去渲染,平常都是数组中一个对象渲染成一行,每行中还有嵌套数组怎么办,每个行数据下还有一个数组怎么显示,怎么把表格相同的数据合并为一行,合并上下两行相同数据单元格,合并行或列如果遇到相同单元格就合

🏆 前端领域优质创作者 1万+

springboot&mybatis中数组和字符串数据类型的转换

/前端数组字段//数据库中字段/*与前端交互时使用的get/set*/System.out.println("接收前端数据");/*与前端交互时使用的get/set*//*与数据库交互时使用的get/set*/System.out.println("从数据库中读取数据");/*与数据库交互时使用的get/set*/

l_q_l的专栏 2475

MySQL 分区表 partition线上修改分区字段,后续进一步学习partition (2) --子分区以及对录入Null值的处理情况.

-- MySQL分区, 子分区以及对录入Null值的处理情况.看完官方文档做的笔记. -- KEY Partitioning Partitioning by key is similar to partitioning by hash, except that where hash partitioning employs a user-defined expression, the hash...

csdn's blog 1万+

unity6000.0.3版本URP下ScriptableRendererFeature如何实现一张自定义贴图效果?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 585

mysql处理null值_MySQL分区处理null值的方式

mysql分区表中,分区键值可以使用null,不同的分区方式对null值的处理不一样。range分区表:mysql> create table goolen(-> id int ,-> name varchar(35)-> ) engine=innodb-> partition by range(id) (-> partition p0 values less ...

weixin_39910523的博客 347

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

MySQL分区处理null值的方式

mysql分区表中,分区键值可以使用null,不同的分区方式对null值的处理不一样。 range分区表: mysql> create table goolen( -> id int , -&...

cnktbkanb141909486的博客 315

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

mysql 5.1.73 分区表_mysql5.1分区表如何处理null(原创)

原创文章,转载请注明出处。从mysql5.1.8开始,分区表把null当作一个比所有非null值都小的一个值,就像做order by排序一样。根据这个前提,不同类型的分区表,null的处理方法有所不同,下面分别举例说明。1、rang分区如果你向一个范围分区表插入一条分区键值为null的数据,那么这条数据会插入到这个分区表的最低的那个分区,例如:mysql> CREATE TABLE t1 (...

weixin_42127775的博客 169

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

MySQL优化系列12-MySQL分区表

备注:测试数据库版本为MySQL 8.0 文章目录一.分区表简介二.分区的类型2.1 range分区2.2 list分区2.3 colums分区2.3.1 RANGE COLUMNS分区2.3.2 LIST COLUMNS2.4 哈希分区2.4.1 LINEAR HASH分区2.5 key 分区2.6 子分区2.7 MySQL分区如何处理null值三.分区管理3.1 管理range和list分区3.2 管理hash和key分区3.3 交换分区和子分区3.3.1 与非分区表交换分区3.3.2 未匹配的行3.

只是甲的博客 3921

php创建mysql分区,MySql创建分区表

PHP交流群:256726721一、前沿知识1、分区表类型RANGE分区、LIST分区、HASH分区、KEY分区、子分区2、查询是否支持分区表mysql> SHOW VARIABLES LIKE ‘%partition%’;+―――――――�C+――-+| Variable_name | Value |+―――――――�C+――-+| have_partition_engin...

weixin_35709851的博客 210

mysql range查询_MySQL RANGE分区

介绍RANGE分区基于一个给定的连续区间范围,早期版本RANGE主要是基于整数的分区。在5.7版本中DATE、DATETIME列也可以使用RANGE分区,同时在5.5以上的版本提供了基于非整形的RANGE COLUMN分区。RANGE分区必须的连续的且不能重叠。使用“VALUES LESS THAN ()”来定义分区区间,非整形的范围值需要使用单引号,并且可以使用MAXVALUE作为分区的最高值...

weixin_39676034的博客 792

【MySQL技术内幕】23-分区表

分区功能并不是在存储引擎层完成的,因此不是只有 InnoDB存储引擎支持分区,常见的存储引擎 MyISAM、NDB等都支持。但也并不是所有的存储引擎都支持,如CSV、 FEDORATED、 MERGE等就不支持。在使用分区功能前,应该对选择的存储引擎对分区的支持有所了解。MySQL数据库在5.1版本时添加了对分区的支持。分区的过程是将一个表或索引分解为多个更小、更可管理的部分。就访问数据库的应用而言,从逻辑上讲,只有一个表或一个索引,但是在物理上这个表或索引可能由数十个物理分区组成。

smart_an的专栏 1267

Mysql分区表原理及使用详解

Mysql分区表原理及使用详解 MySql分区表概述 使用场景: 1.某张表的数据量非常大,通过索引已经不能很好的解决查询性能的问题 2.表的数据可以按照某种条件进行分类,以致于在查询的时候性能得到很大的提升 优点: 1.对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有关的分区,很容易地删除那些数据。相反地, 在某些情况下,添加新数据的过程又可以通过为那些新数据专门增加一个新的分区,来很方便地实现。 2.一些查询可以得到极大的优化,这主要是借助于满足一个给定WHERE语句的数据可以只保存在一个

程序猿,攻城狮,大包子 664

mysql 分区表测试_mysql分区表测试.doc

mysql分区表测试.doc还剩8页未读,继续阅读下载文档到电脑,马上远离加班熬夜!亲,喜欢就下载吧,价低环保!内容要点:partition_name part, partition_expression expr, partition_description descr, table_rows from information_schema.partitions where table...

weixin_36081187的博客 157

MySQL分区表详解

通常情况下,同一张表的数据在物理层面都是存放在一起的。随着业务增长,当同一张表的数据量过大时,会带来管理上的不便。而分区特性可以将一张表从物理层面根据一定的规则将数据划分为多个分区,多个分区可以单独管理,甚至存放在不同的磁盘/文件系统上,提升效率。 分区表的优点: 数据可以跨磁盘/文件系统存储,适合存储大量数据。 数据的管理非常方便,以分区为单位操作数据,不会影响其他分区的正常运行。 数据查询上在某些条件可以利用分区裁剪(partition pruning)特性,将搜索范围快速定位到特性分区,提升查

最简单的方法,解决最实际的问题。 2万+

深入理解MySQL之分区表原理和注意事项

最为糟糕的形式是逐行插入。当然,限制分区的数量也是有效的。答案是你每次查询的数据都是某一个批次的时候就可以用分区,比如说字典,业务的字典和用户类型的字典一般都是存放在同一张表里面的,且你每次查询的时候不是差一个业务或者一个用户类型,而是查询整个业务或者用户类型,这就是一个批次,此时也可以用分区来实现;当更新一条记录时,分区层先打开并锁住所有的底层表,mysql先确定需要更新的记录再哪个分区,然后取出数据并更新,再判断更新后的数据应该再哪个分区,最后对底层表进行写入操作,并对源数据所在的底层表进行删除操作。

大张伟 1660
上一篇: 深入聊聊MySQL直方图的应用
下一篇: MySQL8.0 show create view BUG解析
GreatSQL社区
博客等级 码龄5年 1210粉丝 390原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值