mysql检验分区性能的操作

news2024/10/6 0:37:35

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()
  BEGIN
  	declare i int;
  	set i = 1;
      while i < 5000000
      do
          insert 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.coloradmin.cn/o/1106975.html

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

相关文章

关于页面优化

一、 js优化 js文件内部 1、减少重复代码的使用&#xff0c;精简代码 2、减少请求次数&#xff0c;如果不是需要实时的数据&#xff0c;可以将请求结果缓存在js变量中&#xff0c;后续直接使用变量的值 3、减少不必要的dom操作&#xff0c;例如&#xff1a;用innerHTMl代替do…

小魔推短视频裂变工具,如何帮助实体行业降本增效?

在如今的互联网时代&#xff0c;大多数的实体老板都在寻找不同的宣传方法来吸引客户&#xff0c;现在短视频平台已经成为重中之重的获客渠道之一&#xff0c;而如何在这个日活用户超7亿的平台获取客户&#xff0c;让更多人知道自己的门店、自己的品牌&#xff0c;泽成为了不少老…

uniapp vue3 使用pinia存储数据

import { defineStore } from pinia;export const userInfo defineStore(userInfo, {state: () > {return {userToken: uni.getStorageSync(token) || ,};},actions: {// 添加tokenupdateToken(token: string) {uni.setStorageSync(token, token);this.userToken token}} …

Apache Doris (四十三): Doris数据更新与删除 - Update数据更新

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录 1. Update数据更新原理

全面解决找不到vcruntime140_1.dll无法执行此代码问题的5方法

vcruntime140_1.dll是一个动态链接库文件&#xff0c;它是Microsoft Visual C 2015 Redistributable的一部分。当计算机中缺少这个文件时&#xff0c;可能会导致一些应用程序无法正常运行&#xff0c;从而影响我们的工作和生活。 一、问题场景 1. 在使用Windows操作系统的过程…

QTday02(常用类、UI界面下的开发、信号与槽)

今日任务 1. 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#x…

出差学小白知识No5:ubuntu连接开发板|上传源码包|板端运行的环境部署

1、ubuntu连接开发板&#xff1a; 在ubuntu终端通过ssh协议来连接开发板&#xff0c;例如&#xff1a; ssh root<IP_address> 即可 这篇文章中也有关于如何连接开发板的介绍&#xff0c;可以参考SOC侧跨域实现DDS通信总结 2、源码包上传 通过scp指令&#xff0c;在ub…

1018hw

#include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);//窗口名this->setWindowTitle("QQ");this->setWindowIcon(QIcon(&q…

位段——(详细图解,保姆宗师级教程,包会,从基础概念到精通实战应用)

位段——大项目中结构体节省空间之手段 学习目标&#xff1a; 位段是什么 位段的内存分配 位段的平台局限性和应用 学习内容&#xff1a; 1.位段是什么 C中的位段&#xff08;Bit fields&#xff09;是一种用于有效利用内存的特性&#xff0c;可以在结构体中定义成员变量的…

朴素贝叶斯(基于概率论)

释义 贝叶斯定理是“由果溯因”的推断&#xff0c;所以计算的是"后验概率" 其中&#xff1a; P(A|B) 表示在事件 B 已经发生的条件下&#xff0c;事件 A 发生的概率。 P(B|A) 表示在事件 A 已经发生的条件下&#xff0c;事件 B 发生的概率。 P(A) 和 P(B) 分别表示事…

贴片电阻材质:了解电子元件的核心构成 | 百能云芯

在现代电子设备中&#xff0c;贴片电阻是一类至关重要的 passives 元件&#xff0c;广泛用于各种电路和应用中。贴片电阻的性能取决于多个因素&#xff0c;其中材质是其中之一。云芯将带您深入探讨贴片电阻的不同材质&#xff0c;探讨不同材质对电子元件性能的影响&#xff0c;…

深入理解算法:从基础到实践

深入理解算法&#xff1a;从基础到实践 1. 算法的定义2. 算法的特性3. 算法的分类按解决问题的性质分类&#xff1a;按算法的设计思路分类&#xff1a; 4. 算法分析5. 算法示例a. 搜索算法示例&#xff1a;二分搜索b. 排序算法示例&#xff1a;快速排序c. 动态规划示例&#xf…

【考研数学】概率论与数理统计 —— 第六章 | 数理统计基本概念(1,基本概念)

文章目录 引言一、基本概念1.1 总体1.2 样本1.3 统计量1.4 顺序统计量 写在最后 引言 以前学概率论的时候&#xff0c;不知道后面的数理统计是什么&#xff0c;所以简称都把后面的省略掉了。现在接触的学科知识多了&#xff0c;慢慢就对数理统计有了直观印象。 尤其是第一次参…

刷题日记1

最近在用JavaScript刷动态规划的题组&#xff0c;刷了一半感觉只刷题不写笔记的话印象没那么深刻&#xff0c;所以从今天开始来记录一下刷题情况。 力扣T300 300. 最长递增子序列 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而…

超实用!了解github的热门趋势和star排行是必须得!

在当今的技术领域中&#xff0c;GitHub 已经成为了开发者们分享和探索代码的重要平台。作为全球最大的开源社区&#xff0c;GitHub上托管了数以亿计的项目&#xff0c;其中包括了各种各样的技术栈和应用。对于开发者来说&#xff0c;了解GitHub上的热门趋势和star排行是非常重要…

Java10年技术架构演进

一、前言 又快到了1024&#xff0c;现代人都喜欢以日期的特殊含义来纪念属于自己的节日。虽然有点牵强&#xff0c;但是做件事情&#xff0c;中国人总喜欢找个节日来纪念&#xff0c;程序员也是一样。甚至连1111被定义成光棍节&#xff0c;这也算再无聊不过了。不过作为程序员…

基于百度API的车牌识别计费系统

1&#xff0c;车牌识别API 介绍&#xff1a; 百度车牌识别API是一款基于人工智能算法的车牌识别服务&#xff0c;可以识别包括普通车牌、新能源车牌在内的多种车牌类型&#xff0c;并支持高精度的识别结果输出。其主要功能特点包括&#xff1a; 普通车牌和新能源车牌的识别&a…

首发AI原生应用开发平台——千帆AI原生应用开发工作台,加速企业AI应用落地

为了满足企业对于敏捷和高效地进行AI原生应用开发与运维的需求&#xff0c;并降低相关开发的门槛&#xff0c;百度智能云最新发布了“千帆AI原生应用开发工作台”。该工作台将开发大型模型应用程序的常见模式、工具和流程进行了整合&#xff0c;使得开发者可以聚焦于自身业务&a…

深度学习 | Pytorch深度学习实践

一、overview 基于pytorch的深度学习的四个步骤基本如下&#xff1a; 二、线性模型 Linear Model 基本概念 数据集分为测试集和训练集&#xff08;训练集、开发集&#xff09;训练集&#xff08;x&#xff0c;y&#xff09;测试集只给&#xff08;x&#xff09;过拟合&#xf…

【网络安全 --- xss-labs通关】xss-labs靶场通关,让你巩固对xss漏洞的理解及绕过技巧和方法(提供资源)

一&#xff0c;资源下载准备 1-1 VMware 16.0 安装请参考以下博客&#xff0c;若已经安装请忽略&#xff1a; 【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;提供资源&#xff09;-CSDN博客【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;…