MySQL分区详解

news/2024/5/13 15:24:51/文章来源:https://blog.csdn.net/m0_68949064/article/details/128130466

目录

一、定义

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.luyixian.cn/news_show_232504.aspx

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

相关文章

第17章 事件和概率空间

第17章 事件和概率空间 17.1 做个交易吧 假设你有三扇门可供选择。其中一扇门背后是一辆汽车&#xff0c;另外两扇门背后是一只山羊。你选择了一扇门&#xff0c;比如1号门。然后知道门后面有什么的主持人&#xff0c;开启了另一扇后面有山羊的门&#xff0c;假设是3号门。现…

The reference to entity “useSSL“ must end with the ‘;‘ delimiter.

The reference to entity "useSSL" must end with the ; delimiter.& 替换为 &amp; < 替换为 < > 替换为 > " 替换为 &quot;替换为 &apos; jdbc:mysql://127.0.0.1:3306/dbname?characterEncodingutf8&amp;useSSLfalse&am…

Redis vs MongoDB

Redis vs MongoDB 通常情况下&#xff0c;应用系统的技术选型&#xff0c;对于如何选择非关系型数据库&#xff0c;是一个不小的挑战。这不仅考验架构师在技术上的广度和深度&#xff0c;同时也考究对业务细节了解和熟悉程度。只有将业务场景、业务特点、数据特征跟具体的技术…

Qt 多线程之QtConcurrent::map(处理序列容器)

QtConcurrent::map()、QtConcurrent::mapped() 和 QtConcurrent::mappedReduced() 函数对一个序列中&#xff08;例如&#xff1a;QList、QVector&#xff09;的项目并行地进行计算。 1、map函数 map函数的功能是在其他线程运行指定的函数&#xff0c;map函数有两个参数 第一…

玩好.NET高级调试,你也要会写点汇编

一&#xff1a;背景 1. 简介 .NET 高级调试要想玩的好&#xff0c;看懂汇编是基本功&#xff0c;但看懂汇编和能写点汇编又完全是两回事&#xff0c;所以有时候看的多&#xff0c;总手痒痒想写一点&#xff0c;在 Windows 平台上搭建汇编环境不是那么容易&#xff0c;大多还是…

web课程设计:HTML非遗文化网页设计题材【京剧文化】HTML+CSS+JavaScript

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

提高技术质量标准 | Google Play 持续打造优质平台

作者 / Google Play 统筹产品经理 Lauren Mytton在上一篇文章中&#xff0c;我们为大家总结了 Google Play 在近期将要推出多项新功能&#xff0c;接下来我们将会陆续展开逐一详细说明。应用质量是我们在 Google Play 所做一切努力的基础。Android 用户希望从他们下载的应用和游…

kubernetes 1.18 部署 ingress-nginx

文章目录kubernetes 1.18 部署 ingress-nginx1. 下载 yaml 文件2. 安装 ingress-nginx3. 检查安装情况4. 测试验证4.1 查看ingress规则4.2 访问测试5. 其他内容kubernetes 1.18 部署 ingress-nginx 1. 下载 yaml 文件 在 GitHub 下载完成之后可以直接使用&#xff0c;不需要修…

Linux 部署主从DNS服务器

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

Android桌面图标快捷方式

一、背景 长按桌面图标实现快捷方式最早是iOS提供的功能,而Android最早在Android 7.1版本也提供了对这方面的支持,于是在短时间内,像微信,支付宝,头条等流量级应用都提供了这方面的支持,如下图。 现在,长按桌面图标快捷方式已经是很成熟的功能,实现上也比较简单,主…

爆火的OpenAi的ChatGPT聊天机器人注册和使用攻略

先来看看他的效果怎木样: 哇塞!是不是很奈斯!!! 一. 对OpenAi进行注册登录(需要翻墙) OpenAI APIAn API for accessing new AI models developed by OpenAIhttps://beta.openai.com/ 二. 购买一个虚拟号码用于手机号注册 nullReceive sms online on virtual numbers of SMS…

五、卷积神经网络CNN5(图像卷积与反卷积)

图像卷积 首先给出一个输入输出结果那他是怎样计算的呢&#xff1f; 卷积的时候需要对卷积核进行 180 的旋转&#xff0c;同时卷积核中心与需计算的图像像素对齐&#xff0c;输出结构为中心对齐像素的一个新的像素值&#xff0c;计算例子如下&#xff1a;这样计算出左上角(即第…

[附源码]Python计算机毕业设计Django智能衣橱APP

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

一次nginx “time out”故障排查

研发请求协助排查一个nginx故障。 描述如下&#xff1a; 在内部环境测试没问题。 打包到生产环境后&#xff0c;访问nginx接口地址超时。 研发比对后怀疑是nginx版本不一致导致。内部版本1.23.2&#xff0c;生产环境1.23.1. 收到信息第一感觉不是nginx的问题。不过先测试一…

-aop-

文章目录一.动态代理实现invocationHandler二.AOP概述环绕通知Pointcut定义切入点一.动态代理实现invocationHandler 动态代理&#xff1a;可以在程序的执行过程中&#xff0c;创建代理对象。 通过代理对象执行方法&#xff0c;给目标类的方法增加额外的功能&#xff08;功能增…

华硕编程竞赛11月JAVA专场 A题自由弹簧 题解

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云课认证讲…

Android 中的广播机制

一、Android广播概念&#xff1a; 在Android中&#xff0c;有一些操作完成以后&#xff0c;会发送广播&#xff0c;Android系统内部产生这些事件后广播这些事件&#xff0c;至于广播接收对象是否关心这些事件&#xff0c;以及它们如何处理这些事件&#xff0c;都由广播接收对象…

高通Ride软件开发包使用指南(2)

高通Ride软件开发包使用指南&#xff08;2&#xff09;3 Ubuntu系统设置3.1前提条件3.2安装Ubuntu3.3 安装 docker3.4 在Linux主机上安装QNX软件中心3 Ubuntu系统设置 以下步骤准备Ubuntu系统使用docker图像构建工具链SDK&#xff0c;并启用可视化。 3.1前提条件 确保您的电…

【C++ unordered_set set 和 unordered_map 和 map】

文章目录前言简单介绍哈希表&#xff0c;哈希结构什么时候用哈希表unordered_map操作likou第一题 两数之和unordered_set 基础操作unordered_set 实现总结前言 今天重新打开力扣&#xff0c;看到以前的签到题两数之和&#xff0c;以前的方法是双指针暴力解法&#xff0c;偶然看…

CMAKE编译知识

1&#xff0c;Ubuntu安装了cmake之后&#xff0c;直接输入指令查看版本。cmake -version 我这里的版本为3.16.3 2&#xff0c;使用visual studio里面创建一个CMake项目是最快可以看到的。但是一般无法理解。所以我找了网上资料。根据网上所说和自己再试错下。初步了解了cmake…