MySQL利用MERGE存储引擎来实现分表
来源:互联网 发布:c语言赋值语句规则 编辑:程序博客网 时间:2024/06/05 15:25
- 序言
- 正文
序言
日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表。这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕,可能就死在那了。分表的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率。这里主要讲使用MERGE存储引擎来实现分表。
正文
个人是小白,所以在前人的经验上,把自己踩过的坑填上。在这里博主用的是MySQL5.5,有一张city表,举例把它分成两张表。
首先创建两张子表和city表具有同样的表结构
#查看表结构mysql> desc city;+-------------+----------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+-------------+----------+------+-----+---------+----------------+| ID | int(11) | NO | PRI | NULL | auto_increment || Name | char(35) | NO | MUL | | || CountryCode | char(3) | NO | | | || District | char(20) | NO | | | || Population | int(11) | NO | | 0 | |+-------------+----------+------+-----+---------+----------------+5 rows in set (0.12 sec)#创建子表mysql>CREATE TABLE IF NOT EXISTS `city1` (-> `ID` int(11) NOT NULL AUTO_INCREMENT,-> `Name` char(35) NOT NULL,-> `CountryCode` char(3) NOT NULL,-> `District` char(20) NOT NULL,-> `Population` int(11) NOT NULL,-> PRIMARY KEY (`ID`) ) -> ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; mysql>CREATE TABLE IF NOT EXISTS `city2` (-> `ID` int(11) NOT NULL AUTO_INCREMENT,-> `Name` char(35) NOT NULL,-> `CountryCode` char(3) NOT NULL,-> `District` char(20) NOT NULL,-> `Population` int(11) NOT NULL,-> PRIMARY KEY (`ID`) ) -> ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
现在来创建主表,主表类似于一个壳子,逻辑上封装了子表,实际上数据都是存储在子表中的。
#创建主表mysql>CREATE TABLE IF NOT EXISTS `allcity` (-> `ID` int(11) NOT NULL AUTO_INCREMENT,-> `Name` char(35) NOT NULL,-> `CountryCode` char(3) NOT NULL,-> `District` char(20) NOT NULL,-> `Population` int(11) NOT NULL,-> PRIMARY KEY (`ID`) ) -> ENGINE=MERGE UNION=(city1,city2) INSERT_METHOD=LAST CHARSET=utf8 AUTO_INCREMENT=1 ;
创建主表的时候有个INSERT_METHOD,指明插入方式,取值可以是:0 不允许插入;FIRST 插入到UNION中的第一个表; LAST 插入到UNION中的最后一个表。
现在我需要把现有的city表分为分拆到city1和city2表中。
#把2000条数据插入city1表mysql>INSERT INTO city1(city1.ID,city1.Name,city1.CountryCode,city1.District,city1.Population) SELECT city.ID,city.Name,city.CountryCode,city.District,city.Population FROM city where city.ID <= 2000; #把剩下的数据插入city2表mysql>INSERT INTO city2(city2.ID,city2.Name,city2.CountryCode,city2.District,city2.Population) SELECT city.ID,city.Name,city.CountryCode,city.District,city.Population FROM city where city.ID >= 2000;
这样我就成功的将一张city表,分成了二个表,这个时候有一个问题,代码中的sql语句怎么办,以前是一张表,现在变成二张表了,代码改动很大,这样带来了很大的工作量,有没有好的办法解决这一点呢?办法是把以前的city表备份一下,然后删除掉,上面的操作中我建立了一个allcity表,只把这个allcity表的表名改成city就行了。
阅读全文
0 0
- MySQL利用MERGE存储引擎来实现分表
- Mysql Merge存储引擎实现分表
- Mysql的Merge存储引擎实现分表查询
- 使用Mysql Merge存储引擎实现分表
- 使用Merge存储引擎实现 mysql分表
- Mysql的Merge存储引擎实现分表查询
- 使用Mysql Merge存储引擎实现分表
- 使用Merge存储引擎实现 mysql分表
- MySQL 使用MRG_MyISAM存储引擎来实现分表
- MySQL 使用 MRG_MyISAM 存储引擎来实现分表
- mysql:利用MRG_MyISAM存储引擎实现分表
- 利用MRG_MyISAM存储引擎实现分表
- [每日一答] [20151017] MySQL 使用 MRG_MyISAM 存储引擎来实现分表
- mysql分表之MRG_MyISAM存储引擎实现分表
- Mysql MERGE引擎分表查询机制
- mysql用merge引擎进行分表
- Mysql Merge存储引擎
- MySQL Merge存储引擎
- php实现非阻塞
- spring boot 解决跨域问题
- Java初学者的学习路线建议
- Android 源码中的设计模式
- POJ4148生理周期--典型的中国剩余定理应用
- MySQL利用MERGE存储引擎来实现分表
- java代码优化
- 运行JSP时The requested resource is not available解决方法
- python pip安装方法
- matlab 如何创建多个legend
- 【日期类】C++实现
- git 遇到的问题
- VirtualAPK框架接入
- Kotlin之Lambda表达式原理及应用