MySQL分表查询之Merge存储引擎实现

news2024/11/17 0:57:07

概念介绍

MySQL 分表之后怎么进行联合查询?用有表数量限制的 union all,还是汇总到一张表再查询,亦或用Sphinx( 高性能SQL全文检索引擎 )?

在这篇文章里,介绍使用 Merge [mɜːrdʒ] 存储引擎实现 MySQL [maɪ es kju: el]分表查询。

MERGE 是MySQL最简单的一种分表,MySQL自带的一个分表功能,Merge表并不保存数据,Merge表和分表是对应映射关系。

MERGE 存储引擎把一组 MyISAM 数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询。

分区表(Partition)是 MySQL 5.1 的新特性,而合并表 MERGE 已经有很长的历史了,合并表和分区表的概念比较相似,合并表是将许多个 MyISAM 表合并成一个续表,类似于使用 UNION 语句将多个表合并,合并表不是真的创造一张表,它就像是一个用户放置相似表的容器。而分区表则通过一些特殊的语句,创建独立的空间,事实上创建分区表的每个分区都是有索引的独立表。

操作实例

建表

我们先依次建立 3 张结构相同,自增 ID 不同的数据表,假设每张表最多100万 ID。

CREATE TABLE `xushanxiang`.`users1` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT , `uname` VARCHAR(10) NOT NULL , PRIMARY KEY (`id`)) ENGINE = MyISAM CHARSET=utf8 COLLATE utf8_general_ci;
alter table users1 auto_increment=1000000;
INSERT INTO `users1` (`id`, `uname`) VALUES (NULL, '用户一');

CREATE TABLE `xushanxiang`.`users2` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT , `uname` VARCHAR(10) NOT NULL , PRIMARY KEY (`id`)) ENGINE = MyISAM CHARSET=utf8 COLLATE utf8_general_ci;
alter table users2 auto_increment=2000000;
INSERT INTO `users2` (`id`, `uname`) VALUES (NULL, '用户二');

CREATE TABLE `xushanxiang`.`users3` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT , `uname` VARCHAR(10) NOT NULL , PRIMARY KEY (`id`)) ENGINE = MyISAM CHARSET=utf8 COLLATE utf8_general_ci;
alter table users3 auto_increment=3000000;
INSERT INTO `users3` (`id`, `uname`) VALUES (NULL, '用户三');

再使用 UNION 语句创建表 users1 和 users2 的合并表 users,命令如下:

CREATE TABLE users ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT , `uname` VARCHAR(10) NOT NULL , PRIMARY KEY (`id`)) ENGINE = MERGE CHARSET=utf8 COLLATE utf8_general_ci UNION=(users1,users2) INSERT_METHOD=LAST

推荐的使用方法是先有一个MERGE表,里面只包含一张表,当一个这个表的的大小增长到一定程度(比如100w)时,创建另一张空表,将其挂入MERGE表,然后继续插入记录。

说明

之后,我们在合并表users里面查询(select)、修改(update)、删除(delete)记录,都会对实际的分表产生对应的操作。

insert_method=last 的含义是,如果向表users中插入(新增insert)一条记录,那么就将这条记录插入到合并表的最后一个表里面。

ENGINE=MERGE 指明使用 MERGE 引擎,可能见到过ENGINE=MRG_MyISAM的例子,它们是一回事。

UNION=(users1, users2) 指明了 MERGE 表中挂接了些哪表,可以通过 alter table 的方式修改UNION的值,以实现增删MERGE表子表的功能。

注意

  • MySQL合并表的实现对性能有一定的影响,合并表看上去是一张表,事实上是逐个打开各个子表,这样的情况下,可能会因为缓存过多而导致超过MySQL缓存的最大设置。
  • 某些功能在表格MyISAM中不可用。MERGE例如,您不能在表上创建FULLTEXT索引。
  • 如果MERGE表是非临时的,则所有基础MyISAM表都必须是非临时的。如果MERGE表是临时表,则MyISAM表可以是临时表和非临时表的任意组合。
  • MERGE表比表使用更多的文件描述符MyISAM。如果 10 个客户端使用MERGE映射到 10 个表的表,则服务器使用 (10 × 10) + 10 个文件描述符。(10 个客户端中的每一个都有 10 个数据文件描述符,以及在客户端之间共享的 10 个索引文件描述符。)索引读取速度较慢。当您读取索引时,MERGE存储引擎需要对所有基础表发出读取,以检查哪一个与给定索引值最匹配。要读取下一个索引值,MERGE存储引擎需要搜索读取缓冲区以找到下一个值。只有当一个索引缓冲区用完时,存储引擎才需要读取下一个索引块。这使得MERGE索引在搜索 eq_ref 时要慢得多,但在搜索 ref 时不会慢得多。
  • 最大行数问题:The maximum number of rows in a MERGE table is 2的64次方 (~1.844E+19; the same as for a MyISAM table). It is not possible to merge multiple MyISAM tables into a single MERGE table that would have more than this number of rows.
  • 创建合并表的CREATE语句不会检查子表是否兼容,如果创建了一个有效的合并表之后对某个表进行了修改,那么合并表也会发生错误。
  • merge表并不维护 “唯一性”检查,唯一性有各基础表完成。所以插入新的记录时候可能和其他基础表的内容重复。所以再插入去需要用代码进行唯一性检查。
  • 若数据主键已存在则无法插入。MERGE表只对建表之后的操作负责。
  • 若MREGE后存在重复主键,按主键查询,顺序查询,只出现一条查询记录即停止。
  • 合并表可以重命名,例如执行:rename table users to members;
  • 删除MERGE表不会对子表产生影响。

出错

如果打开新建的 users 表是报错如下:

#1168-Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist

请检查下面的一些可能问题:

  1. 查看是不是有一些表不是 MYISAM 引擎的表,因为 MERGE 引擎只适用于 MYISAM 表。而分区则没有限制。
  2. 查看是不是在 union 的表中含有不存在的表。
  3. 查看是不是 MERGE 的时候引用了不在同一个库的表,并且该表没有指定数据库名字。
  4. 比较各个表的结构(索引、引擎、列、字符集等)是否一致。

查询

因为数据量小,我们直接执行下面的语句:

SELECT * FROM `users`

新增分表

新增分表的结构必须和前面的其它分表一样。

CREATE TABLE `xushanxiang`.`users3` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT , `uname` VARCHAR(10) NOT NULL , PRIMARY KEY (`id`)) ENGINE = MyISAM CHARSET=utf8 COLLATE utf8_general_ci;

alter table users3 auto_increment=3000000;

INSERT INTO `users3` (`id`, `uname`) VALUES (NULL, '用户三');

再把新增的分表加入到merge表users中:

ALTER TABLE users UNION=(users1, users2, users3);

删除分表

直接删除一个子表,MERGE表会被破坏,正确方式是先用 alter table 方式先将子表从MERGE表中去除,再删除子表。

例如:删除分表users1:

alter table users ENGINE=MRG_MyISAM UNION=(users2,users3) INSERT_METHOD=LAST;

DROP TABLE users1;

误删子表怎么办?

误删子表时,如何恢复MERGE表?误删子表时,MERGE表上将无法进行任何操作。

方法1,drop MERGE表,重建。重建时注意在UNION部分去掉误删的子表。

方法2,建立MERGE表时,会在数据库目录下生成一个.MRG文件,比如设表名为users,则文件名为users.MRG。文件内容类似:

可以直接修改此文件,去掉误删表的表名。然后执行 flush tables 即可修复MERGE表。

 

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

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

相关文章

浅读人月神话(2)

读书笔记:今日翻书浅读,从《为什么巴比伦塔会失败》开始至《干将莫邪》结束,巴比伦塔的建造对当下项目推进有广泛借鉴意义,今天这几个章节在PMBOK中有一些可以互相对照学习的内容,《为什么巴比伦塔会失败?》…

荔枝派 zero 使用 Jlink 调试

Jlink 所谓硬件版本,就是这个调试器的硬件是第几代,我手上的这个是 V8 所谓固件版本,就是这个调试器主芯片中内置的软件是什么版本,我刷入的是 J-Link ARM V8 compiled Nov 28 2014 13:44:46 所谓 Jlink 工具版本,就…

记录--原生 canvas 如何实现大屏?

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 可视化大屏该如何做?有可能一天完成吗?废话不多说,直接看效果,线上 Demo 地址 lxfu1.github.io/large-scree…。 看完这篇文章(这个项目)&#xff…

在线支付系列【13】微信支付之签名验签流程分析

有道无术,术尚可求,有术无道,止于术。 文章目录前言签名生成签名验证总结前言 在上篇文档中,我们简单实现了对接微信支付的几个接口。了解到wechatpay-apache-httpclient框架自动实现了签名和验签,接下来跟踪下源码&a…

LeetCode-136. 只出现一次的数字

目录题目分析哈希集位运算题目来源 https://leetcode.cn/problems/single-number/ 题目分析 题目有个条件可谓相当重要,即凡重复的元素最多重复一次(原话:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个…

详解Mybatis-Plus中分页插件PaginationInterceptor, MybatisPlusInterceptor在SpringBoot中的使用

文章目录1. 描述1.1 MybatisPlusInterceptor1.2 InnerInterceptor2. 实现2.1 不带条件的分页查询2.2 带条件的分页查询2.3 简述Page类3. 注意事项1. 描述 1.1 MybatisPlusInterceptor 我们在开发的过程中,经常会遇到分页操作,其分为逻辑分页和物理分页…

Gif动态图片如何用静图制作?教你静图合成动图的方法

gif动图如何制作?相信对于gif动图大家都不陌生,在平时的聊天软件中、公众号文章中都可以看到。那么,要如何制作gif动图呢?下面,就给教大家两个在线gif制作(https://www.gif.cn/)的方法&#xff…

综合案例【商品管理系统-Java基础版】(附完整源码)

Java语言的一个超级简易的商品管理系统,适合初学者练手 源码包无法上传至资源(blog已经超级完整啦)如果还是需要完整源码src包可私分享 目录1 项目分析1.1 用户模块(普通用户、管理员用户)1.1.1前端系统(普…

FluentReader为什么称之为高颜值的rss阅读器

Fluent Reader 这是一款 RSS 阅读器。对于很多年轻的网友来说,RSS 这个名词可能有点陌生。简单来说只要某个网站支持 RSS,你订阅了 RSS 后,一旦网站更新了内容,就会推送到你面前。这时候,我们就需要一款像 Fluent Rea…

全屋智能三国志

刚刚过去的春节假期,对我来说,是一个收集现实素材、感应社会变化的好机会。也确实发现了不少新趋势,一个结论是:智能家居正在酝酿新一轮的市场浪潮。以央视春晚作为切口,每年央视春晚的广告投放,都一定程度…

vscode 配置 plantuml

1、首先安装 plantuml 插件 2、安装 java 开发环境 如果是 mac 系统,直接执行 brew install java ,然后按照下图执行下提示中的命令即可 如果是 windows 系统,需要去官网下载 java jdk,安装好之后添加运行路径到 path 中 https://…

基于 ShardingSphere 的分布式数据库负载均衡架构搭建实战

本文主要分为 3 部分,将依次介绍: 基于 ShardingSphere 的分布式数据库「负载均衡架构搭建」要点结合实际的「用户问题案例」,介绍引入「负载均衡」的影响介绍并展示 ShardingSphere 分布式数据库在云上的「一站式解决方案」 文章目录Shardi…

LED背光车载驱动IC 可支持48通道

特性电源电压范围-VDD:3.3V~5.5V-VLED:27V(max)48 个恒流输出通道- 通道恒流输出范围 0~50mA一 通道间电流输出偏差小于3%- 芯片间电流输出偏差小于 3%Low Knee Voltage:0.55V小于20mA0.6V 大于20mA最大支持4扫,内嵌行控制信号通道灰度实现-支持 PWM/PAMPWM驱动 -灰…

云帆文档管理系统版本更新说明:v4.6.0

一、新增及优化功能资料管理新增打包下载管理端增加资料查阅菜单,管理端和用户端用户有同样的查阅权限,方便其快速的查阅企业的资料信息前端下载文档格式添加下载水印,水印显示的是下载的用户和日期采购合同增加智能识别功能资料管理添加关键…

KPI考核系统实战之二:swagger框架

KPI考核系统实战之二:swagger框架一、asp.net core 3.1二、融合swagger1.Nuget安装Swashbuckle.AspNetCore2.Startup.cs 注册Swagger服务,使用swagger中间件一、asp.net core 3.1 使用Visual Studio 2022,搭建asp.net core weiapi开发平台&a…

煤矿皮带运行状态监测预警系统 yolov7

煤矿皮带运行状态监测预警系统通过yolov7网络模型深度学习技术,自动对传输皮带运行状态进行实时监测。当监测到皮带撕裂、跑偏、异物、堆煤等异常情况时,立即抓拍预警及时停止皮带同步回传违规信息到后台。介绍Yolo算法之前,首先先介绍一下滑…

PushKit/Callkit使用经验

前言:如果要求使用这两种库,请在查询资料并自己尝试后,多参考苹果官方的API文档:PushKit:https://developer.apple.com/documentation/pushkit?languageobjcCallKit:https://developer.apple.com/document…

人工智能与模式识别的意义(模式识别与图像处理课程作业)

人工智能与模式识别的意义(模式识别与图像处理课程作业一、 人工智能的意义二、 模式识别的意义2.1、文字识别2.2、语音识别2.3、指纹识别2.4、遥感2.5、医学诊断1、语音识别技术2、生物认证技术3、数字水印技术一、 人工智能的意义 人工智能的发送对于我们社会的各个方面都具有…

Word页面中四个直角

文章目录1、四个直角1)代表页边距2)页边距的设置3)打开或关闭“裁剪标记”2、“裁剪标记”与图片1)插入图片超过这个角能打印显示出来吗?3、“裁剪标记”与表格1、四个直角 1)代表页边距 页面中的四个角代…

【LoRa网关以及LoRa自组网】以“有人物联网”为例

【LoRa网关以及LoRa自组网】以“有人物联网”为例0.参考资料1. LoRa 自组网协议的理解1.1【LoRa模块WH-L101-L-P-H10 】1.2【LoRa网关设置】1.3【节点、网关、服务器通讯】1.4【一些注意事项】1.5【专业名词】2.【LoRa点对点通讯 】LoRa网关可以实现多个LoRa节点的数据采集&…