Mysql使用Merge引擎分表--方式及优缺点
merge:是SQL语句的一种。具体来说,MERGE语句会检查原数据表记录和目标表记录。如果记录在原数据表和目标表中均存在,则目标表中的记录将被原数据表中的记录所更新(执行Update操作);如果目标表中不存在的某(些)记录,在原数据表中存在,则原数据表的这(些)记录将被插入到目标表中(执行Insert操作)
一,先说一下为什么要分表
当一张表的数据达到几百万时,你查询一次所花的时间会很慢,此时用分表的方法可以减小单表查询的负担,缩短查询时间。
mysql执行sql的过程如下:
1,接收到sql;2,把sql放到排队队列中 ;3,执行sql;4,返回执行结果。在这个执行过程中最花时间在什么地方呢?第一,是排队等待的时间,第二,sql的执行时间。其实这二个是一回事,等待的同时,肯定有sql在执行。所以我们要缩短sql的执行时间。
为了保证数据的完整性mysql中有一种机制是表锁定和行锁定,myisam存储引擎是表锁定,innodb存储引擎是行锁定。表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行。行锁定也一样,别的sql必须等我对这条数据操作完了,才能对这条数据进行操作。如果数据太多,一次执行的时间太长,等待的时间就越长,这也是我们为什么要分表的原因。
二、使用merge存储引擎优缺点
优点:
1.查询数度比一张大表查询要快很多
1.引用多个数据表而无需发出多条查询,只用查询merge引擎这张表就可以查到所有。
2.适用于存储日志数据。例如,可以将不同月份的数据存入不同的表,然后使用myisampack工具压缩数据减少空间,最后通过MERGE表查询仍可以像往常那样工作。
3.可以更方便的维护,修复单个的小表要比修复大数据表更加容易。
4.多个子表映射至一个总表的速度极快。因为MERGE表本身不会存储和维护任何索引,索引都是由各个关联的子表存储和维护的,所以创建和重新映射MERGE表的速度非常快。
缺点:
1.总表(MERGE表)必须使用MRG_MyISAM存储引擎,子表必须使用MyISAM存储引擎,不可避免会受到MyISAM存储引擎的限制,MyISAM不支持事务操作。
2.MERGE表不能使用某些MyISAM特性。例如,子表可创建全文索引,MERGE表查询不能使用全文索引
3.一张表对应三个文件,1000个分表就是对应3000个文件,这样检索起来也会变的很慢
4.若使用ALTER TABLE语句修改MERGE表,那么会立即丢失总表和子表的映射关系,并且会将所有子表的数据拷贝至修改后的新表。
5.子表之间不能保证唯一键约束,只能保证单个子表内部的唯一性约束。
6.子表不支持分区(Partition)。
7.不支持INSERT DELAYED插入延时语句。
三、使用merge存储引擎来实现分表
1.子表必须使用MyISAM存储引擎,每个子表的表结构必须相同。
create table log_2001
(
id int not null auto_increment,
dt datetime not null,
info varchar(100) not null,
primary key(id),
index (dt)
) ENGINE = MyISAM;
create table log_2002 like log_2001;
2.建立merge表,merge表的表结构必须与各个子表结构相同,merge数据表也支持DELETE 、UPDATE、INSERT操作。MERGE数据表的定义里可以包括一个INSERT_METHOD选项,这个选项的可取值是NO、FIRST、LAST,他们的含义依次是禁止插入、插入到第一个字表、插入到最后一个字表。
create table log_merge
(
id int not null auto_increment,
dt datetime not null,
info varchar(100) not null,
primary key(id),
index (dt)
) ENGINE = MERGE UNION = (log_2001, log_2002)
INSERT_METHOD = FIRST;
3.创建一个新的子表,并让他有同样的表结构,然后修改log_merge数据表把新子表包括进来,注意UNION表必须同属一个DATABASE
create table log_2003 like log_2001;
alter table log_merge
UNION = (log_2001, log_2002,log_2003);
注意:
1.如果是通过修改.mrg文件的方式来修改MERGE表,那么一定要修改后要通过FLUSH TABLES刷新表缓存,否则修改不会生效。
2.查询结果及顺序与创建Merge表时联合表的顺序有关,例如:
INSERT INTO log_2001(id,dt,info)VALUES(1,'2017-01-01 11:00:00','测试01')
INSERT INTO log_2002(id,dt,info)VALUES(1,'2018-01-01 11:00:00','测试02')
SELECT * FROM log_merge WHERE id=1;
只会得到一条记录(1,'2017-01-01 11:00:00','测试01'),并不是两条记录,也不会是(1,'2018-01-01 11:00:00','测试02')。这是因为id是 primary key,如果在第一个表中查询到记录,则不在后面的表中记录查。如果id并没有定义唯一性约束,则这个查询会得到两条记录。
---------------------
作者:吾家陈小白
来源:CSDN
原文:https://blog.csdn.net/cw3225654/article/details/81335550
版权声明:本文为博主原创文章,转载请附上博文链接!
Mysql使用Merge引擎分表--方式及优缺点的更多相关文章
- mysql merge引擎分表
---------------------创建表一--------------------------------------DROP TABLE a1;CREATE TABLE `a1` ( `id ...
- MERGE引擎 分表后 快速查询所有数据
MERGE存储引擎把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询.构成一个MERGE数据表结构的各成员MyISAM数据表必须具有完全一样的结构.每一个成员数据表的数据列必 ...
- MySQL的分区、分表、集群
1.分区 mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可以通过my.cnf中的datadir来查看),一张表主要对应着三个文件,一个是frm存放表结构的,一 ...
- mysql数据库为什么要分表和分区?
一般下载的源码都带了MySQL数据库的,做个真正意义上的网站没数据库肯定不行. 数据库主要存放用户信息(注册用户名密码,分组,等级等),配置信息(管理权限配置,模板配置等),内容链接(html ,图片 ...
- Docker安装Mycat并实现mysql读写分离,分库分表
Docker安装Mycat并实现mysql读写分离,分库分表 一.拉取mycat镜像 二.准备挂载的配置文件 2.1 创建文件夹并添加配置文件 2.1.1 server.xml 2.1.2 serve ...
- MySQL纯透明的分库分表技术还没有
MySQL纯透明的分库分表技术还没有 种树人./oneproxy --proxy-address=:3307 --admin-username=admin --admin-password=D033 ...
- Mysql中的分库分表
mysql中的分库分表分库:减少并发问题分表:降低了分布式事务分表 1.垂直分表 把其中的不常用的基础信息提取出来,放到一个表中通过id进行关联.降低表的大小来控制性能,但是这种方式没有解决高数据量带 ...
- Mycat安装并实现mysql读写分离,分库分表
Mycat安装并实现mysql读写分离,分库分表 一.安装Mycat 1.1 创建文件夹 1.2 下载 二.mycat具体配置 2.1 server.xml 2.2 schema.xml 2.3 se ...
- 支持MySql的数据库自动分表工具DBShardTools发布
支持MySql的数据库自动分表工具DBShardTools发布 前段时间参与了公司的一个项目,这个项目的特点是数据量.访问量都比较大,考虑使用数据库水平分表策略,Google了大半天,竟然没有找到分表 ...
随机推荐
- Nova rebuild for boot from volume issue
目录 文章目录 目录 Nova boot from volume Rebuild Instance Rebuild for boot from volume Nova boot from volume ...
- 【图形学手记】Inverse Transform Sampling 逆转换抽样
需求: 我们通过调查,得知大多数人在20岁左右初恋,以20岁为基准,以随机变量X表示早于或晚于该时间的年数,为了简单,假设X值域为[-5,5],并且PDF(X)是一个正态分布函数(当然可以为任意分布, ...
- centos7 系統vps安裝mysql5.6及設置本地遠程連接筆記
用xshell連接上vps 1,下载mysql的repo源 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm su ...
- 【LeetCode】122、买卖股票的最佳时机 II
Best Time to Buy and Sell Stock II 题目等级:Easy 题目描述: Say you have an array for which the ith element i ...
- PEP8-python编码规范(上)
包含主要 Python 发行版中的标准库的 Python 代码的编码约定. 1.代码缩进 (1)每个缩进需要使用 4 个空格.一般使用一个Tab键. Python 3 不允许混合使用制表符和空格来缩进 ...
- 一本值得你反复研读的Python佳作《Python编程从0到1》
现在的Python入门书太多太多了,究竟如何选择呢? 当然选最好的最入门的讲解最清晰的,没有那么多废话的. 现在就推荐一本<Python编程从0到1>,还带视频的,到时候跟大家一起学习沟通 ...
- [Vuejs] Vue解决代理设置导致浏览器Session丢失的问题
以下是会造成Session丢失的代理: proxyTable: { '/proxyApi': { target: 'http://111.18.149.215:8080/WRSOCXSystem/ht ...
- python 并发编程 协程池
协程池 from gevent.pool import Pool from gevent import monkey;monkey.patch_all() import gevent from gev ...
- 【转帖】Linux系统上面qemu 模拟arm
零基础在Linux系统搭建Qemu模拟arm https://blog.csdn.net/weixin_42489042/article/details/81145038 自己没搞定 改天再试试 感谢 ...
- Java第二周总结报告
第二周的学习,开始正式实践进行Java的学习. 本周做了什么? 了解的Java的一些基本知识,如Java变量,数据类型和运算符等.Java变量对不同的数据类型最好采用不同的命名规则,合理的命名有利于提 ...