Mysql Merge 引擎分表方式

测试表news表,数据量大小为150w左右,测试步骤如下

1.创建第一张表news1, nsid <750000的数据保存在news1;

CREATE TABLE `news3` (
  `NSID` int(11) NOT NULL,
 
`NewsName` varchar(100) NOT NULL,
  `Title` varchar(100) NOT
NULL,
  `Content` mediumtext NOT NULL,
  `NID` int(11) NOT
NULL,
  `NIP` varchar(100) NOT NULL,
  `Editor` varchar(50) NOT
NULL,
  `Status` smallint(6) NOT NULL,
  `CityID` int(11) NOT
NULL,
  `CTime` datetime NOT NULL,
  `OrderNum` int(11) NOT
NULL,
  `LogoID` int(11) NOT NULL,
  `SignTag` varchar(50) NOT
NULL,
  `Summary` varchar(5000) DEFAULT NULL,
  `Type`
smallint(6) NOT NULL,
  `PageNum` int(11) NOT NULL,
  `Own`
int(11) NOT NULL,
  `KeyWord` varchar(200) DEFAULT NULL,
 
`WySupport` int(11) NOT NULL DEFAULT ‘0‘,
  `NewEditor` varchar(20)
DEFAULT ‘‘,
  `Source` varchar(200) DEFAULT ‘‘,
  `RemoteID`
varchar(100) DEFAULT NULL,
  `BatchId` int(11) NOT NULL DEFAULT
‘0‘,
  `UTime` datetime DEFAULT NULL COMMENT ‘修改时间‘,
  `isTop`
int(11) NOT NULL DEFAULT ‘0‘,
  `EndTime` datetime DEFAULT NULL COMMENT
‘置顶到期时间‘,
  `IsComment` smallint(6) DEFAULT ‘0‘,
  `BID` int(11)
NOT NULL DEFAULT ‘0‘,
  `VTimes` int(11) NOT NULL,
  `Tags`
varchar(1000) DEFAULT NULL,
  PRIMARY KEY (`NSID`),
  KEY
`CTime` (`CTime`),
  KEY `OrderNum` (`OrderNum`),
  KEY `NID`
(`NID`),
  KEY `NewsName` (`CTime`),
  KEY `IsComment`
(`BID`),
  KEY `RemoteID` (`RemoteID`),
  KEY `CityID`
(`CityID`,`CTime`,`WySupport`,`Type`,`Status`)
) ENGINE=MyISAM
AUTO_INCREMENT=635147 DEFAULT CHARSET=utf8

2.创建第二张表news4,nsid>=750000的数据保存在news4;

CREATE TABLE `news4` (
  `NSID` int(11) NOT NULL,
 
`NewsName` varchar(100) NOT NULL,
  `Title` varchar(100) NOT
NULL,
  `Content` mediumtext NOT NULL,
  `NID` int(11) NOT
NULL,
  `NIP` varchar(100) NOT NULL,
  `Editor` varchar(50) NOT
NULL,
  `Status` smallint(6) NOT NULL,
  `CityID` int(11) NOT
NULL,
  `CTime` datetime NOT NULL,
  `OrderNum` int(11) NOT
NULL,
  `LogoID` int(11) NOT NULL,
  `SignTag` varchar(50) NOT
NULL,
  `Summary` varchar(5000) DEFAULT NULL,
  `Type`
smallint(6) NOT NULL,
  `PageNum` int(11) NOT NULL,
  `Own`
int(11) NOT NULL,
  `KeyWord` varchar(200) DEFAULT NULL,
 
`WySupport` int(11) NOT NULL DEFAULT ‘0‘,
  `NewEditor` varchar(20)
DEFAULT ‘‘,
  `Source` varchar(200) DEFAULT ‘‘,
  `RemoteID`
varchar(100) DEFAULT NULL,
  `BatchId` int(11) NOT NULL DEFAULT
‘0‘,
  `UTime` datetime DEFAULT NULL COMMENT ‘修改时间‘,
  `isTop`
int(11) NOT NULL DEFAULT ‘0‘,
  `EndTime` datetime DEFAULT NULL COMMENT
‘置顶到期时间‘,
  `IsComment` smallint(6) DEFAULT ‘0‘,
  `BID` int(11)
NOT NULL DEFAULT ‘0‘,
  `VTimes` int(11) NOT NULL,
  `Tags`
varchar(1000) DEFAULT NULL,
  PRIMARY KEY (`NSID`),
  KEY
`CTime` (`CTime`),
  KEY `OrderNum` (`OrderNum`),
  KEY `NID`
(`NID`),
  KEY `NewsName` (`CTime`),
  KEY `IsComment`
(`BID`),
  KEY `RemoteID` (`RemoteID`),
  KEY `CityID`
(`CityID`,`CTime`,`WySupport`,`Type`,`Status`)
) ENGINE=MyISAM
AUTO_INCREMENT=635147 DEFAULT CHARSET=utf8

3.创建第三张表news34,这张表为merge表.

CREATE TABLE `news34` (
  `NSID` INT(11) NOT NULL,
 
`NewsName` VARCHAR(100) NOT NULL,
  `Title` VARCHAR(100) NOT
NULL,
  `Content` MEDIUMTEXT NOT NULL,
  `NID` INT(11) NOT
NULL,
  `NIP` VARCHAR(100) NOT NULL,
  `Editor` VARCHAR(50) NOT
NULL,
  `Status` SMALLINT(6) NOT NULL,
  `CityID` INT(11) NOT
NULL,
  `CTime` DATETIME NOT NULL,
  `OrderNum` INT(11) NOT
NULL,
  `LogoID` INT(11) NOT NULL,
  `SignTag` VARCHAR(50) NOT
NULL,
  `Summary` VARCHAR(5000) DEFAULT NULL,
  `Type`
SMALLINT(6) NOT NULL,
  `PageNum` INT(11) NOT NULL,
  `Own`
INT(11) NOT NULL,
  `KeyWord` VARCHAR(200) DEFAULT NULL,
 
`WySupport` INT(11) NOT NULL DEFAULT ‘0‘,
  `NewEditor` VARCHAR(20)
DEFAULT ‘‘,
  `Source` VARCHAR(200) DEFAULT ‘‘,
  `RemoteID`
VARCHAR(100) DEFAULT NULL,
  `BatchId` INT(11) NOT NULL DEFAULT
‘0‘,
  `UTime` DATETIME DEFAULT NULL COMMENT ‘修改时间‘,
  `isTop`
INT(11) NOT NULL DEFAULT ‘0‘,
  `EndTime` DATETIME DEFAULT NULL COMMENT
‘置顶到期时间‘,
  `IsComment` SMALLINT(6) DEFAULT ‘0‘,
  `BID` INT(11)
NOT NULL DEFAULT ‘0‘,
  `VTimes` INT(11) NOT NULL,
  `Tags`
VARCHAR(1000) DEFAULT NULL,
  PRIMARY KEY (`NSID`),
  KEY
`CTime` (`CTime`),
  KEY `OrderNum` (`OrderNum`),
  KEY `NID`
(`NID`),
  KEY `NewsName` (`CTime`),
  KEY `IsComment`
(`BID`),
  KEY `RemoteID` (`RemoteID`),
  KEY `CityID`
(`CityID`,`CTime`,`WySupport`,`Type`,`Status`)
) TYPE=MERGE
UNION=(news3,news4) INSERT_METHOD=LAST AUTO_INCREMENT=1 ;

4.插入测试数据

INSERT INTO news3
SELECT * FROM news WHERE nsid < 750000

INSERT
INTO news4
SELECT * FROM news WHERE nsid >= 750000

5.news表与news34表进行测试比较

SELECT * FROM NEWS34 WHERE cityid = 14 AND ctime LIKE ‘%2014%‘;
SELECT *
FROM NEWS WHERE cityid = 14 AND ctime LIKE ‘%2014%‘;

SELECT * FROM NEWS34 WHERE cityid = 14 AND TYPE = 3 ORDER BY
nsid;
SELECT * FROM NEWS WHERE cityid = 14 AND TYPE = 3 ORDER BY nsid;

SELECT * FROM NEWS34 WHERE cityid = 14 AND TYPE = 2 AND source = ‘吉屋网络整理‘ AND
vtimes <10 ORDER BY nsid DESC;
SELECT * FROM NEWS WHERE cityid = 14 AND
TYPE = 2 AND source = ‘吉屋网络整理‘ AND vtimes <10 ORDER BY nsid DESC;

SELECT * FROM NEWS34 WHERE cityid = 12 AND TYPE = 2 AND source = ‘吉屋网络整理‘ AND
editor=‘sjt‘ AND STATUS = 2 AND keyword LIKE ‘%吉屋%‘ AND vtimes <20 ORDER BY
nsid DESC;
SELECT * FROM NEWS WHERE cityid = 12 AND TYPE = 2 AND source =
‘吉屋网络整理‘ AND editor=‘sjt‘ AND STATUS = 2 AND keyword LIKE ‘%吉屋%‘ AND vtimes
<20 ORDER BY nsid DESC;

第一组sql :myIsam表,也就是news表的执行速度稍微快一点

第二组sql:这组sql查询条件稍微复杂点,有where和order,这是merge表的速度要快于myIsam表

第三组sql:

第四组:

测试结论:

整体上myIsam表和merge表的查询效率差距很小;

时间: 2025-01-04 21:40:07

Mysql Merge 引擎分表方式的相关文章

mysql分表方法-----MRG_MyISAM引擎分表法

一般来说,当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了,这次我来详细说说分表的一些方法.目前我所知道的方法都是MYISAM的,INNODB如何做分表并且保留事务和外键,我还不是很了解. 首先,我们需要想好到底分多少个表,前提当然是满足应用.这里我使用了一个比较简单的分表方法,就是根据自增id的尾数来分,也就是说分0-9一共10个表,其取值也很好做,就是对10进行取模.另外,还可以根据某一字段的md5值取其中几位进行分表,这样的话,可以分的表就很多了. 好了,先来创建表吧,

Mysql分区和分表介绍

为什么要分区和分表 我们的数据库数据越来越大,随之而来的是单个表中数据太多,以至于查询速度过慢,而且由于表的锁机制导致应用操作也受到严重影响,出现数据库性能瓶颈. MySQL中有一种机制是表锁定和行锁定,是为了保证数据的完整性.表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行.行锁定也一样,别的sql必须等我对这条数据操作完了,才能对这条数据进行操纵.但出现这种情况时,我们可以考虑分表或者分区. 分表 什么是分表 分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,每个

常见的分表方式 都有哪些,各自的优缺点

下面来分析一下: 一.时间结构 如果业务系统对时效性较高,比如新闻发布系统的文章表,可以把数据库设计成时间结构,按时间分有几种结构: 1) 平板式 表类似: article_200901 article_200902 article_200903 用年来分还是用月可自定,但用日期的话表就太多了,也没这必要.一般建议是按月分就可以. 这种分法,其难处在于,假设我要列20条数据,结果这三张表里都有2条,那么业务上很有可能要求读三次表.如果时间长了,有几十张表,而每张表是0条,那不就是要读完整个系统的

16、MySQL数据库分库分表备份脚本

MySQL数据库分库分表备份脚本 ===================学员分享分库分表========================== 脚本单双引号的区别: 单引号是强引用,强制输出是所见即所得. 双引号是解析变量 和 多个字符串.数字等连接一个字符串 条件1  ||    条件2                      或   假真   真假 条件1 && 条件2                      并   真真    假假 !条件1  && 条件2    

数据库mysql 自动分库分表备份脚本

数据库mysql 自动分库分表备份脚本 当我们在公司中遇到数据库的备份,项目比较多,经常进行数据库和表的添加工作,那么我们 想要让系统脚本自动进行查询数据库里的库和表结构,然后进行自动的定期进行数据库和表的定期份, 那么我们该如何实现呢,大家看看以下的脚本: vi mysql_backup.sh #!/bin/sh #backup tiandao bbs edoing #coding tonye.li MYUSER=root MYPASS=meidi SOCKET=/data/3306/mysq

MySQL订单分库分表多维度查询

转自:http://blog.itpub.net/29254281/viewspace-2086198/ MySQL订单分库分表多维度查询 MySQL分库分表,一般只能按照一个维度进行查询. 以订单表为例, 按照用户ID mod 64 分成 64个数据库.按照用户的维度查询很快,因为最终的查询落在一台服务器上.但是如果按照商户的维度查询,则代价非常高.需要查询全部64台服务器.在分页的情况下,更加恶化.比如某个商户查询第10页的数据(按照订单的创建时间).需要在每台数据库服务器上查询前100条数

MySQL优化分库分表,为什么要分表,分表以后如何进行排序查询,业务如何设计?

MySQL优化分库分表,为什么要分表,分表以后如何进行排序查询,业务如何设计? 昨天面试新人的时候,遇到了这么一个问题,按照自己的想法大体聊了一些,但大多是感性的,并没有完整的了解why and how. 今天查了一些相关的资料,包括<MySQL性能调优与架构设计>.<高性能Mysql>,慢慢的整体理解,请大家指正. 之一,为什么要分表? 分表,按形式,有水平分表和主附分表.水平分表常见于按ID取模或者按日期将相同表结构的内容散列到不同的表上,主附分表常见于有对应关系的多张表,通过

Mysql MERGE 引擎在分表环境下得使用

应用场景:当我们在做分表的时候,通常会把一个大表的数据拆分成若干个分表,这也是数据库优化中的分表概念.随着分表随之而来的问题就是多表查询. 现在有 t1,t2 两张数据表,需要满足不同的查询条件同时从这两张表中查询数据,同时还得实现排序,分页等需求. [ t1表 ] 1 CREATE TABLE `t1` ( 2 `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 3 `name` varchar(10) NOT NULL, 4 PRIMARY KEY

MySQL Merge引擎实现分表

Merge引擎是一组MyISAM表的组合,组合的分表结构必须完全相同,Merge表本身没有数据,对Merge表的操作实际上都是对子表的操作,只是对APP来说是透明的,在插入的时候默认是插入到最后一张表上,也可以指定插入到第一张表上,Merger表实际上只是多个子表的一个外壳,对它进行删除,不影响实际存储的数据. 创建子表user1 CREATE TABLE `user1` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `name` varchar(100