MySQL分区详解

news2024/11/17 13:58:13

目录

一、定义

1.1 概述

1.2 分区的优势

二、分区的类型

2.1 检查MySQL是否支持分区

2.2 类型

2.3 分区的其他操作


一、定义 

1.1 概述

数据库分区是一种物理数据库设计技术。虽然分区技术可以实现很多效果,但其主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减SQL语句的响应时间,同时对于应用来说分区完全是透明的。

使用myisam引擎的一张表主要对应着三个文件,一个是frm存放表结构的,一个是myd存放表数据的,一个是myi存表索引的。如果一张表的数据量太大的话,那么myd、myi就会变的很大,查找数据就会变的很慢,这个时候我们可以利用mysql的分区功能,在物理上将这一张表对应的三个文件,分割成许多个小块,这样我们查找一条数据时,就不用全部查找了,只要知道这条数据在哪一块,然后在那一块找就行了。如果表的数据太大,可能一个磁盘放不下,我们可以把数据分配到不同的磁盘里面去。

使用innoDB引擎的/mysql/data/数据库名目录下一张表有一个frm文件存放数据结构,其他的数据部分全部都存在在/mysql/data目录下的ibdata文件中。

MYSQL 5.1之后支持分区。

1.2 分区的优势

1)与单个磁盘或文件系统分区相比,可以存储更多的数据。
2)对于不用或者过时的数据很容易给删除掉。
3)对于一些查询有极大的优化,给定WHERE语句的数据可以只保存在一个或多个分区内,这样就不需要查找剩余的数据。
4)涉及到例如SUM()和COUNT()这样聚合函数的查询,可以很容易地进行并行处理。
5)通过跨多个磁盘来分散数据查询,来获得更大的查询吞吐量。

二、分区的类型

2.1 检查MySQL是否支持分区

//查看mysql5.6以下是否支持分区
show variables like '%partition%';

//查看mysql5.6以上是否支持分区
show plugins;

2.2 类型

使用分区的前提:分区键必须是主键的一部分。

解释:分区键必须是主键的一部分并不是 MySQL 的限制,而是索引组织表的限制。之所以对索引组织表有这样的限制,个人认为还是基于性能考虑。假设分区键和主键是两个不同的列,在进行插入操作时,虽然也指定了分区键,但还是需要扫描所有分区才能判断插入的主键值是否违反了唯一性约束。这样的话,效率会比较低下,违背了分区表的初衷。而对于堆表则没有这样的限制,下面是堆表和索引组织表的定义。

堆表:数据存储在表中,索引存储在索引里,两者分开的。数据在堆中是无序的,索引让键值有序,但数据还是无序的。堆表中主键索引和普通索引一样的,都是存放指向堆表中数据的指针。

索引组织表:数据存储在聚簇索引中,或者说,数据按照主键的顺序来组织数据,两者合二为一。主键索引,叶子节点存放整行数据。其他索引称为辅助索引(二级索引),叶子节点存放键值和主键值。

创建表和表数据 

CREATE TABLE `user_login_log` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) DEFAULT NULL,
  `login_time` int(10) unsigned DEFAULT '0',
  `ip` varchar(255) DEFAULT NULL,
  `add_time` int(10) unsigned DEFAULT '0',
  `up_time` int(10) unsigned DEFAULT '0',
  PRIMARY KEY (`id`,`user_id`,`login_time`),
  KEY `ip` (`ip`)
) ENGINE=InnoDB AUTO_INCREMENT=1000002 DEFAULT CHARSET=utf8 COMMENT='用户登录日志';

<?php
header('Content-Type:application/json; charset=utf-8');
error_reporting(E_ERROR | E_CORE_ERROR | E_PARSE);

//创建100万条案例数据

function randIp(){

    $ipall = array(
            array(array(58,14),array(58,25)),
            array(array(58,30),array(58,63)),
            array(array(58,66),array(58,67)),
            array(array(60,200),array(60,204)),
            array(array(60,160),array(60,191)),
            array(array(60,208),array(60,223)),
            array(array(117,48),array(117,51)),
            array(array(117,57),array(117,57)),
            array(array(121,8),array(121,29)),
            array(array(121,192),array(121,199)),
            array(array(123,144),array(123,149)),
            array(array(124,112),array(124,119)),
            array(array(125,64),array(125,98)),
            array(array(222,128),array(222,143)),
            array(array(222,160),array(222,163)),
            array(array(220,248),array(220,252)),
            array(array(211,163),array(211,163)),
            array(array(210,21),array(210,22)),
            array(array(125,32),array(125,47))     
    );

    #随机生成需要IP段
    $ip_p = rand(0,count($ipall)-1);
    $ip_1 = $ipall[$ip_p][0][0];
    if($ipall[$ip_p][0][1] == $ipall[$ip_p][1][1]){
        $ip_2 = $ipall[$ip_p][0][1];
    }else{
        $ip_2 = rand(intval($ipall[$ip_p][0][1]),intval($ipall[$ip_p][1][1]));
    }

    $ip_3 = rand(0,255);
    $ip_4 = rand(0,255);
    return $ip_1.'.'.$ip_2.'.'.$ip_3.'.'.$ip_4;
     
}

$dbcnn = mysqli_connect("127.0.0.1", "root", "root", "db1", "3306");
if (!$dbcnn) {
    echo date("Y-m-d H:i:s") . " MySQL connection failed... \n";
    exit;
} else {
    mysqli_query($dbcnn, "set names utf8");
}

$login_time = ["2022-12-07 08:22:32", "2022-12-07 09:23:32", "2022-12-07 12:13:44", "2022-12-07 09:23:45", "2022-12-07 10:16:32", "2022-12-07 08:21:32", "2022-12-07 09:42:55", "2022-12-07 05:02:25", "2022-12-07 08:23:42", "2022-12-07 11:08:02", "2022-12-07 06:22:33"];


for($i=1001; $i<=1001000; $i++){

	mysqli_query($dbcnn, "INSERT INTO `user_login_log` (user_id, login_time, ip, add_time) values({$i}, '".$login_time[array_rand($login_time)]."', '".randIp()."', ".time()." )");
	

}

1)range分区
按照RANGE分区的表是通过如下一种方式进行分区的,每个分区包含那些分区表达式的值位于一个给定的连续区间内的行。

//添加字段 user_id(复合主键) 的range分区
ALTER table `user_login_log`  PARTITION BY RANGE (`user_id`) (
	PARTITION p0 VALUES LESS THAN (101000), 
	PARTITION p1 VALUES LESS THAN (201000),
	PARTITION p2 VALUES LESS THAN (301000),
	PARTITION p3 VALUES LESS THAN (401000),
	PARTITION p4 VALUES LESS THAN (501000),
	PARTITION p5 VALUES LESS THAN (601000),
	PARTITION p6 VALUES LESS THAN (701000),
	PARTITION p7 VALUES LESS THAN (801000),
	PARTITION p8 VALUES LESS THAN (901000),
	PARTITION p9 VALUES LESS THAN MAXVALUE
);

//查询语句,增加分区前查询耗时 0.976s,增加分区后查询耗时 0.293s,可看到有三倍的增速
select * from `user_login_log` where user_id>=50001 and user_id<=100000;

2)list分区
LIST分区中每个分区的定义和选择是基于某列的值从属于一个值列表集中的一个值,而RANGE分区是从属于一个连续区间值的集合。

//添加字段 login_time(复合主键) 的list分区
ALTER table `user_login_log`  PARTITION BY LIST COLUMNS(`login_time`) (
	PARTITION p0 VALUES in("2022-12-07 08:22:32", "2022-12-07 09:23:32", "2022-12-07 12:13:44"),
	PARTITION p1 VALUES in("2022-12-07 09:23:45", "2022-12-07 10:16:32", "2022-12-07 08:21:32"),
	PARTITION p2 VALUES in("2022-12-07 09:42:55", "2022-12-07 05:02:25", "2022-12-07 08:23:42"),
	PARTITION p3 VALUES in("2022-12-07 11:08:02", "2022-12-07 06:22:33")
);


//查询语句,增加分区前查询耗时 1.187s,增加分区后查询耗时 0.717s,可看到有 0.47s的增速
select * from `user_login_log` where login_time in("2022-12-07 08:22:32", "2022-12-07 09:23:32", "2022-12-07 12:13:44");

3)hash分区
HASH分区主要用来确保数据在预先确定数目的分区中平均分布,你所要做的只是基于将要被哈希的列值指定一个列值或表达式,以 及指定被分区的表将要被分割成的分区数量。

//添加字段 user_id(复合主键) 的hash分区
ALTER table `user_login_log`  PARTITION BY HASH (`user_id`) PARTITIONS 10;

//查询语句,增加分区前查询耗时 0.976s,增加分区后查询耗时 0.518s,可看到有 0.458s的增速
select * from `user_login_log` where user_id>=50001 and user_id<=100000;

4)key分区
按照KEY进行分区类似于按照HASH分区,除了HASH分区使用的用 户定义的表达式,而KEY分区的哈希函数是由MySQL服务器提供。

//添加字段 user_id(复合主键) 的key分区
ALTER table `user_login_log`  PARTITION BY HASH (`user_id`) PARTITIONS 10;

//查询语句,增加分区前查询耗时 0.976s,增加分区后查询耗时 0.613s,可看到有 0.363s的增速
select * from `user_login_log` where user_id>=50001 and user_id<=100000;

5)子分区
子分区是分区表中每个分区的再次分割,目前只有RANGE和LIST分区的表可以再进行子分区,子分区只能是HASH或者KEY分区。这也被称为复合分区(composite partitioning)

//添加字段 user_id(复合主键) 的子分区
ALTER table `user_login_log`  PARTITION BY RANGE (`user_id`) SUBPARTITION BY HASH (`user_id`)(
	PARTITION p0 VALUES LESS THAN (101000) (
            SUBPARTITION s0,
            SUBPARTITION s1
        ), 
	PARTITION p1 VALUES LESS THAN (201000) (
            SUBPARTITION s2,
            SUBPARTITION s3
        ),
	PARTITION p2 VALUES LESS THAN (301000) (
            SUBPARTITION s4,
            SUBPARTITION s5
        ),
	PARTITION p3 VALUES LESS THAN (401000) (
            SUBPARTITION s6,
            SUBPARTITION s7
        ),
	PARTITION p4 VALUES LESS THAN (501000) (
            SUBPARTITION s8,
            SUBPARTITION s9
        ),
	PARTITION p5 VALUES LESS THAN (601000) (
            SUBPARTITION s10,
						SUBPARTITION s11
        ),
	PARTITION p6 VALUES LESS THAN (701000) (
            SUBPARTITION s12,
            SUBPARTITION s13
        ),
	PARTITION p7 VALUES LESS THAN (801000) (
            SUBPARTITION s14,
            SUBPARTITION s15
        ),
	PARTITION p8 VALUES LESS THAN (901000) (
            SUBPARTITION s16,
            SUBPARTITION s17
        ),
	PARTITION p9 VALUES LESS THAN MAXVALUE(
            SUBPARTITION s18,
            SUBPARTITION s19
        )
);


//查询语句,增加分区前查询耗时 0.976s,增加分区后查询耗时 0.113s,可看到有 0.863s的增速
select * from `user_login_log` where user_id>=50001 and user_id<=100000;

2.3 分区的其他操作

//删除分区
ALTER TABLE `user_login_log` REMOVE PARTITIONING;

//删除分区的某部分
ALTER table `user_login_log` DROP  PARTITION p1;

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

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

相关文章

基于jsp+java+ssm考研指导平台-计算机毕业设计

项目介绍 本考研学习类的网站&#xff0c;采用了ssm框架技术和mysql数据库进行网站设计研发&#xff0c;系统具有前台展示&#xff0c;后台管理的设计模式&#xff0c;是一款典型的计算机毕业设计学习资料。前台主要展示了考研相关的资讯&#xff0c;方便用户在线注册并且留言…

【Windows逆向】【Qt】资源解析

▒ 目录 ▒&#x1f6eb; 导读需求开发环境1️⃣ 分析思路思路获取资源路径的方法2️⃣ c正向编码编码使用流程不使用Qt方式获取思路3️⃣ frida方式获取Origin平台资源win32 - 定位目标资源win32 - 查找API含义win32 - 查找《符号》构造frida本地函数win32 - 全部代码win64 - …

【ESP32+freeRTOS学习笔记-(一)freeRTOS介绍】

目录FreeRTOS基本情况FreeRTOS的特色发行版的目录结构与文件说明原生程序的下载与目录结构FreeRTOS的主要文件说明头文件说明关于FreeRTOSConfig.h的说明主要的数据类型说明重要数据类型 -- TickType_t重要数据类型 -- BaseType_t一些默认的规则变量名的规则函数的命名规则宏的…

你在网络上发布的内容真的归你所有吗?有Web3.0和元宇宙的未来是什么样的?

欢迎来到Hubbleverse &#x1f30d; 关注我们 关注宇宙新鲜事 &#x1f4cc; 预计阅读时长&#xff1a;9分钟 本文仅代表作者个人观点&#xff0c;不代表平台意见&#xff0c;不构成投资建议。 你认为你在微博、抖音等社交媒体上发布的内容是属于你的吗&#xff1f;事实并非…

Dashed lines generator for 3dMax 虚线生成器插件使用教程

Dashed lines generator虚线生成器是一个3DMAX建模工具&#xff0c;可以通过简单的步骤自动生成所有类型的虚线&#xff1a;它可以用于模拟交通标志标准&#xff1b;使用“蒙皮修改器SKIN MODIFIER”选项&#xff0c;可以非常容易地操纵创建的虚线&#xff0c;更改其位置和方向…

关于Pytorch模型检查点大小和参数量的一些观察

目录 背景和需求 一、模型的参数量统计 二、模型检查点大小查看 三、检查点大小和模型参数量之间的关系 总结 背景和需求 一个Pytorch模型的大小可以从两个方面来衡量&#xff1a;检查点大小和模型的参数量。现在我从两个方面都拿到了具体数值&#xff0c;想要验证它们两个是否…

数据开源 | Magic Data开源DMS驾驶员行为数据集

由于近几年人工智能、芯片技术的发展&#xff0c;自动驾驶被资本市场越炒越热。目前大部分车企正在朝着完全自动驾驶努力&#xff0c;大部分已经落地的无人驾驶技术仍然是L2与L3级。同时&#xff0c;汽车行业也逐渐在汽车上集成了辅助自动驾驶和智能助手等功能&#xff0c;让驾…

C语言结构体详解

邀请加入嵌入式社区&#xff0c;您可以在上面发布问题&#xff0c;博客链接&#xff0c;公众号分享&#xff0c;行业消息&#xff0c;招聘信息等。 目录 结构体有什么用&#xff1f; 结构体声明 正常的结构体声明 匿名结构体 匿名结构体只有在创建的时候可以建立变量 两个…

vuex通过Mutations来修改状态的原理及devtools插件的下载

状态修改&#xff1a; 通过Mutations来修改状态&#xff0c;并配合devtools调试工具会记录这个状态何时被修改过&#xff1b; 好处是因为所有组件都可以访问和修改状态&#xff0c;通过Mutations配合调试工具能知道状态被哪个组件什么时候被修改过&#xff0c;方便追溯&#…

如何让 ChatGPT 写短篇小说?

故事一 请根据下面内容续写故事&#xff0c;要求800字。 在一个晴朗的秋日下午&#xff0c;男主人 Jack 抱着他的妻子 Rose&#xff0c;两人坐在沙发上看着电视。 这是&#xff0c;Jack对Rose说&#xff1a;”亲爱的&#xff0c;我们来玩一个游戏吧。” ChatGPT回答&#xff1a…

华为机试 - 端口合并

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 有M(1<M<10)个端口组&#xff0c; 每个端口组是长度为N(1<N<100)的整数数组&#xff0c; 如果端口组间存在2个及以上不同端口相同&#xff0c;则认为这2个端口组互相关联&#xff0c;可以…

CentOS部署主从DNS服务器

几个概念&#xff1a; 域名解析为IP地址&#xff1a;正向解析 IP地址解析为域名&#xff1a;反向解析 主DNS服务器&#xff1a;在特定区域内具有唯一性&#xff0c;负责维护该区域内的域名和IP地址之间的对应关系。 从DNS服务器&#xff1a;从服务器中获得域名和IP地址对应关系…

PCIE2PCI104载板转接卡

功能型号 PCIE2PCI104 此无源扩展卡允许开发人员将PCI104或PC/104plus卡安装到通用PCI总线系统中。适配器配备了一个堆栈式连接器。 功能描述 规格 适用于标准&#xff1a;Universal.3.3V或5V PCI插槽 工业温度工作范围&#xff1a;-40至85 C 连接器/接口&#xff1a;包括一个带…

干货 | 肖特基二极管4大特性

前言 肖特基二极管是重要的电子元器件&#xff0c;因为其承载着保护电路的重要作用&#xff0c;所以显得格外的不可或缺&#xff0c;我们都知道在选择肖特基二极管时&#xff0c;主要看它的正向导通压降、反向耐压、反向漏电流等。 但我们却很少知道其在不同电流、不同反向电压…

固定支撑约束在ANSYS有限元计算中的三大注意事项

固定支撑是在结构有限元中&#xff0c;大家最常用的一种约束条件了。如图1所示给出了设置固定支撑操作的方法。 图1 设置固定支撑操作方法 固定支撑约束&#xff0c;可以应用在点&#xff0c;线和面特征上。固定支撑表示被约束为位置为刚性&#xff0c;但是在现实工程结构中&a…

解决“Vector Hardware Manager无法连接This Computer”(能够独立解决问题,体现一个人的综合能力)

1. 引子 Vector Hardware Manager是先前配置工具Vector Hardware Config的继承者,是Vector Hardware Config工具的升级版或替代产品 什么是Vector Hardware Config? CANoe里打开: 界面: 而Vector Hardware Manager其实就是把Vector Hardware Config里的功能搬到了这里实…

UE5 + VS2022和UE4 + VS2019 编译踩坑

1&#xff0c;卡住且没有cl.exe进程 &#xff08;1&#xff09;&#xff0c;卸载Incredibuild&#xff0c;Incredibuild也是利用进程虚拟化技术&#xff0c;加速包括编译的方法&#xff0c;和firstbuild是一样的&#xff0c;所以优先选择了Incredibuild的方式&#xff0c;但是2…

PDF文件添加水印怎么添加?只需要两步轻松添加水印

PDF文件添加水印怎么添加&#xff1f;我们在处理工作文件时&#xff0c;都非常在意文件的隐私性&#xff0c;我们经常会使用一些方法来确保我们文件的内容不被别人窃取&#xff0c;其中一种方法就是给PDF文件添加水印&#xff0c;这样文件的内容就不会轻易被窃取了&#xff01;…

ControllerAdvice统一异常处理失效

问题描述 在common模块增加统一异常处理代码&#xff0c;如下。在service业务处理类中抛出异常&#xff0c; 但是接口返回的为spring统一的500错误。 package com.tea.common.exception; import com.tea.common.entity.ResponseResult; import com.tea.common.entity.Status…

基于java springboot的小说阅读微信小程序含后台管理系统源码

系统运行环境 开发工具 eclipse(idea)&#xff0c;mysql5.7&#xff08;大于5.5&#xff09;&#xff0c;navicat&#xff0c;小程序开发工具 硬件要求 windows操作系统 cpu&#xff1a;2.4GHz 内存&#xff1a;4G 硬盘&#xff1a;100G 开发及运行环境 windows10操作…