本文主要讲述如何使用存储过程完成本表.并不讨论其他问题.首先我们得看看手册上关于meger引擎的说明:

MERGE存储引擎,也被认识为MRG_MyISAM引擎,是一个相同的可以被当作一个来用的MyISAM表的集合。“相同”意味着所有表同样的列和索引信息。你不能合并列被以不同顺序列于其中的表,没有恰好同样列的表,或有不同顺序索引的表。而且,任何或者所有的表可以用myisampack来压缩。

首先看看要分的表t3,总共有5000000条记录.t3表的结构如下:

CREATE TABLE `t3` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) default NULL,
`post` text,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

没有测试数据?那就先运行这个存储过程写入一些吧

 

-- Procedure "insert_isam" DDL

CREATE PROCEDURE `insert_isam`(in item integer)
begin
declare counter int;
set counter = item;
while counter >= 1 do
insert into t3 values(counter,concat('mysqlsystems.com',counter),repeat('bla',10));
set counter = counter - 1;
end while;
end;

执行查询:

 

call insert_isam(5000000);

这样就有了测试数据,注意这个过程有点慢,曾经尝试插入1亿条记录,结果死机了.

由于这样产生的数据都是连续的数据,所以按照ID的区间来排序,我们把这个表按照每个表250000条来拆分,当然了这些表的结构要与t3一致,而且存储引擎要为myisam.至于分多少个表,我们无法确定,但是我们可以采用分页的原理来拆分,刚学存储过程,试着摸索写了一个
 

-- Procedure "split_table" DDL

CREATE PROCEDURE `split_table`(in pagesize int)
begin
set @totalRecord=(select count(id) from t3);
set @totalPage=ceiling(@totalRecord/pagesize);
set @page=1;
while @page<=@totalPage do
set @tableName=concat("tab_",@page);
set @droptable=concat("drop table if exists ",@tableName);
prepare s from @droptable;
execute s;
set @sql=concat("
CREATE TABLE ",@tableName," (
`id` int(11) auto_increment,
`name` varchar(50),
`post` text,
PRIMARY KEY (`id`),
KEY `id` (`id`)
) ENGINE=MyISAM;");
PREPARE sta from @sql;
execute sta;
set @from=(@page-1)*pagesize+1;
set @end=@page*pagesize;
set @sql=concat("insert into ",@tableName," select * from t3 where id between ",@from," and ",@end);
PREPARE sta from @sql;
execute sta;
set @page=@page+1;
end while;
end;

 

执行查询:

call split_table(250000);

这个过程有点慢,需要耐心等待,脚本执行完成之后,看到已经生成了20张以tab开头的表,每个表的记录都是250000条,到这里为止,我们已经完成了表的拆分过程,接下来得创建一个merge类型的表

CREATE TABLE `taball` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) default NULL,
`post` text,
PRIMARY KEY (`id`),
KEY `id` (`id`)
) ENGINE=MRG_MyISAM union=(tab_1,tab_2,tab_3,tab_4,tab_5,tab_6,tab_7,tab_8,
tab_9,tab_10,tab_11,tab_12,tab_13,tab_14,tab_15,tab_16,tab_17,tab_18,tab_19,tab_20);

执行之后,看看 taball表,记录和原来的表一样多..

 
做下简单的测试,分别对t3,和taball执行"select * from t3 limit 250000,10000",对比下,后者快了很多.
 
到此为止,基本完成了分表.其优缺点还有待于摸索!

mysql分表实战的更多相关文章

  1. mysql分表和表分区详解

    为什么要分表和分区? 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能 ...

  2. MySQL分表(Partition)学习研究报告

    最近在开发一个新的项目,可能会产生大数据量,需要对部分表进行分表操作,故来研究学习MySQL的分表功能. 由于实验报告已经写成Exlce文件了,各位看过就直接下载吧:MySQL分表分析报告.xls 以 ...

  3. Mysql分表和分区的区别、分库分表介绍与区别

    分表和分区的区别: 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这 ...

  4. 【mysql】mysql分表和表分区详解

    为什么要分表和分区? 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能 ...

  5. mysql分表研究

    分表是分散数据库压力的好方法. 分表,最直白的意思,就是将一个表结构分为多个表,然后,可以再同一个库里,也可以放到不同的库. 当然,首先要知道什么情况下,才需要分表.个人觉得单表记录条数达到百万到千万 ...

  6. mysql分表与分区表

    mysql分表与分区表 转自:http://blog.51yip.com/mysql/949.html   一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具 ...

  7. mysql分表,分区的区别和联系

    一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘 ...

  8. Mysql分表和分区的区别

    一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘 ...

  9. 一、mysql分表简单介绍

    一.Mysql分表的原因 1.当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了. 分表的目的就在于此,减小数据库的负担,缩短查询时间. 2.mysql中 ...

随机推荐

  1. c#语言---数据类型

    整型 值类型 名称                        CTS类型                                说明                             ...

  2. Install and Configure Apache Kafka

    I. Installation The installation environment must have JDK, verify that you enter: java -version 1. ...

  3. CVPR 2019 | 用异构卷积训练深度CNN:提升效率而不损准确度

    对于深度卷积神经网络而言,准确度和计算成本往往难以得兼,研究界也一直在探索通过模型压缩或设计新型高效架构来解决这一问题.印度理工学院坎普尔分校的一篇 CVPR 论文则给出了一个新的思路——使用异构的卷 ...

  4. Device supprts x86,armeabi-v7a,but APK only aupports armeabi;模拟机不能运行。

    在真机可以运行,模拟机却不可以: 这个是模拟机: 修改: defaultConfig { ndk{ abiFilters "armeabi" } } 为: defaultConfi ...

  5. idea error:Command line is too long

    今天在正在本地运行的项目中写了一个无关项目的测试类,执行main函数时报错如下: 解决方案: 找到项目根目录下的.idea/workspace.xml,添加内容: <component name ...

  6. python - requests从excel中获取测试用例数据

    HttpRequests.py #-*- coding:utf-8 -*- import requests class HttpRequests(): def http_requests(self,u ...

  7. spring mvc 异常处理

    一般实现业务的时候避免不了会抛一些自定义异常 抛给controller进行最终处理.如果业务上比较复杂.频繁的在try catch操作. 时间一长,代码维护性,可读性自然而然就上来了. 然后,spri ...

  8. ROS学习手记 - 5 理解ROS中的基本概念_Services and Parameters

    上一节完成了对nodes, Topic的理解,再深入一步: Services and Parameters 我不理解为何 ROS wiki 要把service与parameter放在一起介绍, 很想分 ...

  9. 学习笔记:webpack

    http://wiki.jikexueyuan.com/project/webpack-handbook/ Webpack 中文指南 http://www.itzjt.cc/2017/04/09/we ...

  10. 代码: CSS3动画,简单示例(鼠标移上去后,背景图片旋转)

    <script type="text/javascript" src="http://cdn.bootcss.com/jquery/1.11.2/jquery.mi ...