mysql检验分区性能的操作

mysql检验分区性能的操作

创建两个结构相同但是一个有分区另外一个没有分区的表

在这里插入图片描述
如上图我们给part_tab5创建的分区为1024个,因为mysql中允许最多有1024个分区;之前我测试的是创建8个分区,然后插入500万条数据,然后按照id查询(非索引),part_tab5表的查询速率大约是part_tab6表的查询速率的9倍;注意这里测试的时候不要按照主键查询,因为主键是索引,按照索引查询的时候,即便没有分区,也是非常快的。

现在我很好奇如果我创建了1024个分区,然后插入5000万条数据,带分区的查询速率会比不带分区的快多少呢?

使用存储过程往带有分区的表插入5000万条数据

如下图:
在这里插入图片描述
可以使用select命令随时监控插入的条数,如下图:
在这里插入图片描述

拷贝一份数据到没有加分区的表中

part_tab6表的结构字段和part_tab5一样,只不过它没有加分区,等到part_tab5表中的5000万条数据插入完成之后,拷贝一份到part_tab6表中,代码如下图:
在这里插入图片描述

对比条件查询速率

如果是select 星去查询全部的话,那么有分区的查询的会更慢一些;但是如果是按条件查询的话,比如按照id查询,它的查询时间会更快,如下图:
在这里插入图片描述
注意这里千万不要对比按照c1字段条件查询的速率,因为c1是索引,内部使用了B+树,它的查询速率是非常快的,你是对比不出来的。而id是一个普通字段,采用了分区和不采用分区对比就非常明显了。

hash分区的时候如果只对其中的某一列进行分区的话,那么其它列速率仍然低

比如我现在有一张表,它的字段有column1,column2,column3,我现在只对column3列进行了hash分区,其它两列没有进行hash分区,那么按条件查询的时候,如果是按照column3条件进行查询,查询速率是比较快的,因为它使用了分区,但是如果按照其它的两列条件查询的话,查询速率是很慢的,因为其它两列没有进行hash分区。

创建太多分区应该也不太好,先创建100个分区。想要用hash分区给多个列分区,格式是不是hash(列名1 + 列名2)?先假设是这样。那么我们创建表的时候就不要有主键了,因为如果有主键的话,我们的hash分区的字段必须是主键包含的字段,也就是主键里面必须有所有hash分区的字段,也就是如果这里的主键不包含列名1和列名2,那么hash(列名1 + 列名2)这样写就是错误的。那如果主键就包含一个字段,而我们想要hash分区的列有好多个,就没办法使用hash分区了。因此我不太确定这样正不正确,先自己测试一下。

后来我又问了大侠,大侠说,没必要每个列名都给他分区,分区一个就行了,比如说我们给时间列名分区,每次查询的时候都可以带上时间,它就会找到对应的区了。但是如果是hash分区这就要求主键必须有时间?这肯定是不合理的。所以我们不能够用hash分区对时间进行分区。要想一下RANGE分区可不可以?

看一下hash分区的时候写hash(列名1, 列名2)的效果,如下图:
在这里插入图片描述
最终的效果是,如果hash分区的时候是按照id和c1分区的,那么筛选的时候,只有同时有这两个条件的时候才能找到具体是哪个分区,才能提高效率,如下图:
在这里插入图片描述
但是如果where筛选条件不是同时包含c1和id,那么查询效率就很慢了,如下图:
在这里插入图片描述
只要筛选条件包含建立分区的所有字段,不管后面还有没有其它的筛选条件,那么分区都有效,如下图:
在这里插入图片描述
所以这里能不能按照时间进行hash分区,然后每次条件筛选的时候都加上时间范围呢?这个我要建立一张表测试一下,不用建立了不行,因为不可能把时间当做一张表的主键。

后面我又使用RANGE分区的时候,发现分区字段也必须是在主键里面的字段,所以,所有的分区类型都要求如果有主键,那么分区的字段一定是主键里面的某个字段。
因此使用分区的时候,一般会把那个字段加上一个联合主键。如下图:
在这里插入图片描述
所以现在把id和test_time时间设置成了联合主键,那么用hash分区也是可以的,但是hash分区的时候不允许类型是datetime类型,我们需要把它变成时间戳bigint类型,然后进行hash分区,测试一下使用hash分区(test_time),分成100个区,500w条数据,和使用上面的RANGE分区,分成12个区,500w条数据,看一下后面那个查询效率高?

现在我猜测是使用hash分区分成100个表的查询效率比较高。现在正在使用存储过程生成500w条数据,生成完之后对比一下。

先不管上面的,看下下面的

使用的是RANGE分区,按照日期中的月份分为12个区,日期是1月份的行放到 month1分区(可以理解成一个子表),日期是2月份的行放到month2分区(可以理解成一个子表)。。。日期是12月份的行放到month12分区(可以理解成一个子表)。

创建分区表part_tab19和未分区表part_tab20

如下图:
在这里插入图片描述
代码如下:

CREATE TABLE part_tab19 (id int,c1 int,test_time datetime,PRIMARY KEY(id, test_time))engine=INNODB PARTITION BY RANGE (month(test_time)) (PARTITION month1 values less than(2),PARTITION month2 values less than(3),PARTITION month3 values less than(4),PARTITION month4 values less than(5),PARTITION month5 values less than(6),PARTITION month6 values less than(7),PARTITION month7 values less than(8),PARTITION month8 values less than(9),PARTITION month9 values less than(10),PARTITION month10 values less than(11),PARTITION month11 values less than(12),PARTITION month12 values less than(13));CREATE TABLE part_tab20 (id int,c1 int,test_time datetime,PRIMARY KEY(id, test_time))engine=INNODB;

使用存储过程往分区表里面插入500w条数据

如下图:
在这里插入图片描述
存储过程代码如下:

delimiter $$create procedure ss()BEGINdeclare i int;set i = 1;while i < 5000000doinsert into part_tab19(id, c1, test_time) VALUES(i, i, date_add('2023-10-28', INTERVAL i%12 month)) ;set i = i + 1 ;end while ;END $$

把分区表中的数据拷贝到未分区表中

如下图:
在这里插入图片描述
代码如下:

 insert into part_tab20 select * from part_tab19;

看下分区表part_tab19和未分区表part_tab20里面的数据条数是否一致,如下图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
发现现在这俩表的数据是完全一致的,这两个表的字段,数据都是一样的,唯一的区别就是一个表有分区而另外一个表没有分区。

接下来看一下分区是怎么提升查询速率的

首先在未分区的表part_tab20中,我们查询一下c1=162这条数据看看需要多少时间,如下图:
在这里插入图片描述
从上图可以发现接近1.3s;
接下来加上时间查询条件,看看需要多久,如下图:
在这里插入图片描述
可以发现加上时间范围筛选条件之后没有什么变化,甚至查询时间更长了;为什么呢?因为我们的part_tab20没有按照时间中的月份进行分区;

接下来看一下分区的表part_tab19中,我们查询一下c1=162这条数据(加上时间筛选)的查询时间,如下图:
在这里插入图片描述
可以发现只需要0.3秒;

通过分区表的查询时间0.3和未分区表的查询时间1.3对比可得,分区之后速率快了接近4倍;

分区之后表的查询速率为什么会快呢?

比如我们上面的例子,把表分为了12个区,每个月份为一个区,其实也就相当于是按照日期的月份分为了十二张子表,当我们按照月份条件进行查询的时候,不会去查询总表的数据,而是会去查询子表中的数据,因为子表中的数据相对较少,因此查询速率就会提高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/111135.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【持续更新】tutorial-Linux-Markdown-etc(Linux、命令、Markdown、md、Tex、LaTex)

1. Linux命令 1.1 常用 查看文件夹下文件数量: ls -l | wc -l7zip: 解压&#xff1a;7z x compressed_file.7z -o/path/to/destination # 注意-o和目标路径是连起来的&#xff0c;没有空格压缩&#xff1a;7z a compressed_file.zip destination_path conda 查看 conda 拥有的…

浏览器调试模式获取链接信息(获取京东cookie为例)

通过浏览器的调试模式&#xff0c;获取京东cookie变量pt_pin和pt_key。 一、登录 1&#xff09;打开网页 浏览器打开手机版京东网页&#xff1a;m.jd.com 2&#xff09;登录账号 点击【登录】按钮&#xff0c;输入账号密码登录 二、调试模式 1&#xff09;停留在要调试的…

C/C++ 快速入门

参考&#xff1a;https://blog.csdn.net/gao_zhennan/article/details/128769439 1 下载Visual Studio Code并安装中文插件&#xff0c;此处不再叙述 2 插件安装C/C插件 3 使用快捷键【Ctr ~】打打开终端 验证并未安装编译器 4 我们即将使用【MinGW-64】做为编译器 https:…

[nlp] chathome—家居装修垂类大语言模型的开发和评估

ChatHome: Development and Evaluation of a Domain-Specific LanguageModel for Home Renovation ChatHome: 家居装修垂类大语言模型的开发和评估 1、摘要: 我们的方法包括两个步骤:首先,使用广泛的家庭装修数据集(包括专业文章、标准文档和网络内容)对通用模型进行后预训…

C/C++面试常见问题——指针和引用的区别

首先想要理解指针和引用的区别&#xff0c;我们要明确什么是指针&#xff0c;什么是引用 一&#xff0c;指针和引用的基本概念及特性 指针是一个特殊变量&#xff0c;其中存储着所指向变量的地址 指针主要有以下特性&#xff1a; 1. 在使用时需要*解引用 2. sizeof(指针)的…

ChatGPT/GPT4科研技术应用与AI绘图及论文高效写作

2023年我们进入了AI2.0时代。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车&#xff0c;就有可能被淘汰在这个数字化时代&#xff0c;如何能高效地处理文本、文献查阅、PPT…

大数据中间件——Kafka

Kafka安装配置 首先我们把kafka的安装包上传到虚拟机中&#xff1a; 解压到对应的目录并修改对应的文件名&#xff1a; 首先我们来到kafka的config目录&#xff0c;我们第一个要修改的文件就是server.properties文件&#xff0c;修改内容如下&#xff1a; # Licensed to the …

从Github中下载部分文件

我们经常回去Github中下载代码&#xff0c;但仓库中存在很多project代码。但我们如果只需要某一个或几个项目的代码&#xff0c;此时应该如何操作呢&#xff1f; 这里介绍两款工具&#xff0c;可以从仓库中下载部分文件的小工具: DownGit 和 GitZip 1. DownGit downGit 国内镜…

基于单片机设计的家用自来水水质监测装置

一、前言 本文介绍基于单片机设计的家用自来水水质监测装置。利用STM32F103ZET6作为主控芯片&#xff0c;结合水质传感器和ADC模块&#xff0c;实现对自来水水质的检测和监测功能。通过0.96寸OLED显示屏&#xff0c;将采集到的水质数据以直观的方式展示给用户。 随着人们对健…

DVWA-JavaScript Attacks

JavaScript Attacks JavaScript Attack即JS攻击&#xff0c;攻击者可以利用JavaScript实施攻击。 Low 等级 核心源码&#xff0c;用的是dom语法这是在前端使用的和后端无关&#xff0c;然后获取属性为phrase的值然后来个rot13和MD5双重加密在复制给token属性。 <script&…

2 spring 识别自定义实现BeanFactoryPostProcessor 的接口

如果自定义实现了BeanFactoryPostProcessor接口&#xff0c;那么想让spring识别到的话&#xff0c;有两种方式&#xff1a; 1 定义在spring的配置文件中&#xff0c;让spring自动识别 2 调用具体的addBeanFactoryPostProcessor方法 方法1 的代码实现 定义实现BeanFactoryPo…

零代码编程:用ChatGPT批量下载谷歌podcast上的播客音频

谷歌podcast有很多播客音频&#xff0c;如何批量下载到电脑呢&#xff1f; 以这个播客为例&#xff1a; https://podcasts.google.com/feed/aHR0cHM6Ly9oYWRhcnNoZW1lc2guY29tL2ZlZWQvcG9kY2FzdC8?saX&ved0CAkQlvsGahcKEwi4uauWsvKBAxUAAAAAHQAAAAAQAg 查看网页源代码&a…

Linux程序调试器——gdb的使用

gdb的概述 GDB 全称“GNU symbolic debugger”&#xff0c;从名称上不难看出&#xff0c;它诞生于 GNU 计划&#xff08;同时诞生的还有 GCC、Emacs 等&#xff09;&#xff0c;是 Linux 下常用的程序调试器。发展至今&#xff0c;GDB 已经迭代了诸多个版本&#xff0c;当下的…

Leetcode.4 寻找两个正序数组的中位数

题目链接 Leetcode.4 寻找两个正序数组的中位数 hard 题目描述 给定两个大小分别为 m m m 和 n n n 的正序&#xff08;从小到大&#xff09;数组 n u m s 1 nums1 nums1 和 n u m s 2 nums2 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O…

【AIGC核心技术剖析】用于 3D 生成的多视图扩散模型

MVDream是一种多视图扩散模型,能够从给定的文本提示生成一致的多视图图像。多视图扩散模型从二维和三维数据中学习,可以实现二维扩散模型的泛化和三维渲染的一致性。我们证明了这样的多视图先验可以作为可推广的 2D 先验,与 3D 表示无关。它可以通过分数蒸馏取样应用于 2D 生…

一张图理解MITRE ATTCK框架

看到一张好图&#xff0c;能对MITRE ATT&CK框架做很好的概述&#xff1a; 可以与笔者之前写过的MITRE文章&#xff08;https://blog.csdn.net/ybdesire/category_12472912.html&#xff09;一起阅读&#xff0c;就能更好的理解MITRE。 参考&#xff1a; 吴沛颖.网络威胁情…

【深度学习实验】循环神经网络(四):基于 LSTM 的语言模型训练

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. RNN与梯度裁剪 2. LSTM模型 3. 训练函数 a. train_epoch b. train 4. 文本预测 5. GPU判断函数 6. 训练与测试 7. 代码整合 经验是智慧之父&#xff0c;记忆…

pdf转二维码怎么做?pdf二维码制作简单技巧

pdf是一种很常见的文件储存格式&#xff0c;一般通知、发票、简历都会保存为这种格式来使用&#xff0c;那么需要将pdf格式文件做成二维码&#xff0c;该用什么方式来制作呢&#xff1f;下面给大家分享一个pdf转二维码的在线工具&#xff0c;可以通过上传文件一键生成二维码&am…

pytorch 入门(二)

本文为&#x1f517;小白入门Pytorch内部限免文章 &#x1f368; 本文为&#x1f517;小白入门Pytorch中的学习记录博客&#x1f366; 参考文章&#xff1a;【小白入门Pytorch】教案二&#x1f356; 原作者&#xff1a;K同学啊 目录 一、神经网络的组成部分1. 神经元2. 神经网络…

世界粮食日:宏工科技有对策,赋能食品生产高效可持续发展

10月16日是世界粮食日。随着全球人口的增长&#xff0c;人们对高品质食品的需求也越来越大&#xff0c;如何实现“更好生产、更好营养”成为了食品生产与供应的重要话题。15年来&#xff0c;宏工科技专注物料处理自动化领域&#xff0c;提供食品物料处理一站式解决方案以提高生…