百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

一文带你理解mysql中的分区表和合并表(一个常见知识点)

wxin55 2024-11-14 18:43 11 浏览 0 评论

分区表是mysql5.1之后的新特性,合并表已经存在很长时间了。这篇文章主要介绍这两个概念以及他们基本的操作。

一、合并表

合并表说实话是一种将要被淘汰的技术,但是掌握了合并表的概念再去看分区表就比较容易理解一点。

合并表其实就是合并了多个子表的逻辑表,子表使用了myisam存储引擎物理子表,合并表使用merge存储引擎,逻辑表和子表的结构完全相同(包括字段、索引等)。

删除一个合并表,它的子表不会受任何影响,而如果删除其中一个子表则可能会有不同的后果,这要视操作系统而定。

下面我们进行实操一下:创建量两张物理子表t1和t2,然后创建他们俩的合并表。

在上面我们进行了一些初始化操作。而且我们在创建合并表的时候,指定了insert_method为last,意思就是在最后一张物理表的末尾插入真实数据,这里最后一张真实物理表就是t2。此时我们插入一个数据5会发现:t1没有,t2有。

合并表的内容很简单,也很容易理解。既然表能合并肯定也能分开。我们接着看分区表:

二、分区表

分区表就是把一张表分开,对用户来说,分区表是一个独立的逻辑表,但是底层由多个物理子表组成。实现分区的代码实际上是对一组底层表的句柄对象的封装。对分区表的请求,都会通过句柄对象转化成对存储引擎的接口调用。分区表的每一个分区都是有索引的独立表。

分区表发挥大作用的场景:

(1)表非常大以至于无法全部都放在内存中,或者只在表的最后部分有热点数据,其他均是历史数据。

(2)分区表的数据更容易维护。

(3)分区表的数据可以分布在不同的物理设备上。

(4)可以使用分区表来避免某些特殊的瓶颈,例如InnoDB单个索引的互斥访问。

(5)如果需要,还可以备份和恢复独立的分区,这在非常大的数据集的场景下效果非常好。

分开的方式有三种:

(1)水平分区:根据行切分,也就是把记录分开。

(2)垂直分区:根据列切分,也就是把字段分开。

(3)复合分区:水平分区和垂直分区的结合。

我们按照这两种方式来实际操作一下:

1、水平分区

(1)range分区

range分区是基于连续的范围值。

在这里需要注意的是,alter形式删除分区比delete形式更加的高效。一般都是基于日期时间进行分区。

(2)List分区

range分区是基于连续的范围,list是基于确定值的范围,就好比集合。

这种不是指的范围,而是指的具体的值,10号和20在n1分区,30在n2分区。

(3)Hash分区

hash分区指的是根据hash运算的模,最终确定在哪一个分区。比如2020/4=0,就落在分区0上。

此时我们2020/4=0,就会保存在分区0中。

(4)线性Hash分区

线性hash指的是使用2的幂运算法则。运算起来比较麻烦。但是优点是可以使得数据分布均匀。举个例子。假设分区个数num=6,N表示数据最终存储的分区:

第一步:V = power(2, ceiling(log(2, num))),log是计算NUM以2为底的对数,ceiling()向上取整,power()是取2的次方值;

第二步:N=values&(V-1),&位与运算,

第三步:while N>=num,此时N =N & (CEIL(V/ 2) - 1)

比如插入2020-01-20,V=8,N=(2020)& (8-1)=4。4<6,所以保存在分区4。

代码就不演示了,区别就是by hash换成by linear hash。

2、垂直分区

垂直分区比较少,直接通过key字段名进行划分即可。

垂直分区相当简单。

3、复合分区

上面介绍了水平和复合的方式,复合分区的方式是进行组合。你可以随意搭配。这里演示一种。

父分区使用list,子分区使用垂直分区。

在这里介绍了分区表的一些概念和基础的使用方法。其实分区表也有很多限制。

分区表的限制:

(1)一个表最多只能有1024个分区。

(2)如果分区字段中有主键或者唯一索引的列,那么所有主键列和唯一索引列都必须包含进来。

(3)分区表中无法使用外键约束。

(4)所有分区都必须使用相同的存储引擎。

(5)某些存储引擎不支持分区。比如说merge、InnoDB、CSV、联合存储引擎等。

MERGE存储引擎。 用户定义的分区和MERGE 存储引擎不兼容。分区表无法合并。

联合存储引擎。 FEDERATED不支持 分区表; 不可能创建分区 FEDERATED表。

CSV存储引擎。 CSV不支持使用存储引擎的分区表; 不可能创建分区CSV表。

InnoDB存储引擎。 InnoDB外键和MySQL分区不兼容。分区 InnoDB表不能有外键引用,也不能有外键引用的列。InnoDB具有或由外键引用的表不能分区。

(6)对于MyISAM表,使用分区表时需要打开更多的文件描述符。

所以在使用的时候一定要注意。

相关推荐

ES6中 Promise的使用场景?(es6promise用法例子)

一、介绍Promise,译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大在以往我们如果处理多层异步操作,我们往往会像下面那样编写我们的代码doSomething(f...

JavaScript 对 Promise 并发的处理方法

Promise对象代表一个未来的值,它有三种状态:pending待定,这是Promise的初始状态,它可能成功,也可能失败,前途未卜fulfilled已完成,这是一种成功的状态,此时可以获取...

Promise的九大方法(promise的实例方法)

1、promise.resolv静态方法Promise.resolve(value)可以认为是newPromise方法的语法糖,比如Promise.resolve(42)可以认为是以下代码的语...

360前端一面~面试题解析(360前端开发面试题)

1.组件库按需加载怎么做的,具体打包配了什么-按需加载实现:借助打包工具(如Webpack的require.context或ES模块动态导入),在使用组件时才引入对应的代码。例如在V...

前端面试-Promise 的 finally 怎么实现的?如何在工作中使用?

Promise的finally方法是一个非常有用的工具,它无论Promise是成功(fulfilled)还是失败(rejected)都会执行,且不改变Promise的最终结果。它的实现原...

最简单手写Promise,30行代码理解Promise核心原理和发布订阅模式

看了全网手写Promise的,大部分对于新手还是比较难理解的,其中几个比较难的点:状态还未改变时通过发布订阅模式去收集事件实例化的时候通过调用构造函数里传出来的方法去修改类里面的状态,这个叫Re...

前端分享-Promise可以中途取消啦(promise可以取消吗)

传统Promise就像一台需要手动组装的设备,每次使用都要重新接线。而Promise.withResolvers的出现,相当于给开发者发了一个智能遥控器,可以随时随地控制异步操作。它解决了三大...

手写 Promise(手写输入法 中文)

前言都2020年了,Promise大家肯定都在用了,但是估计很多人对其原理还是一知半解,今天就让我们一起实现一个符合PromiseA+规范的Promise。附PromiseA+规范地址...

什么是 Promise.allSettled()!新手老手都要会?

Promise.allSettled()方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的pr...

前端面试-关于Promise解析与高频面试题示范

Promise是啥,直接上图:Promise就是处理异步函数的API,它可以包裹一个异步函数,在异步函数完成时抛出完成状态,让代码结束远古时无限回掉的窘境。配合async/await语法糖,可...

宇宙厂:为什么前端离不开 Promise.withResolvers() ?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.为什么需要Promise.with...

Promise 新增了一个超实用的 API!

在JavaScript的世界里,Promise一直是处理异步操作的神器。而现在,随着ES2025的发布,Promise又迎来了一个超实用的新成员——Promise.try()!这个新方法简...

一次搞懂 Promise 异步处理(promise 异步顺序执行)

PromisePromise就像这个词的表面意识一样,表示一种承诺、许诺,会在后面给出一个结果,成功或者失败。现在已经成为了主流的异步编程的操作方式,写进了标准里面。状态Promise有且仅有...

Promise 核心机制详解(promise机制的实现原理)

一、Promise的核心状态机Promise本质上是一个状态机,其行为由内部状态严格管控。每个Promise实例在创建时处于Pending(等待)状态,此时异步操作尚未完成。当异步操作成功...

javascript——Promise(js实现promise)

1.PromiseES6开始支持,Promise对象用于一个异步操作的最终完成(包括成功和失败)及结果值的表示。简单说就是处理异步请求的。之所以叫Promise,就是我承诺,如果成功则怎么处理,失败怎...

取消回复欢迎 发表评论: