永发信息网

如何把很多结果一样的表放在一起统计

答案:2  悬赏:50  手机版
解决时间 2021-01-23 20:03
如何把很多结果一样的表放在一起统计
最佳答案
一:Merge表的原理及优点
在Mysql数据库中,Merge表有点类似于视图。mysql的merge引擎类型允许你把许多结构相同的表合并为一个表。之后,你可以执行查询,从多个表返回的结果就像从一个表返回的结果一样。每一个合并的表必须有完全相同表的定义和结构。

1.1 Mysql Merge表的优点:
A. 分离静态的和动态的数据
B. 利用结构接近的的数据来优化查询
C. 查询时可以访问更少的数据
D. 更容易维护大数据集
E. 可以通过修改.mrg文件来修改Merge表,当然也可以用alter进行修改,修改后要通过FLUSH TABLES刷新表缓存,此法可以动态增加减少子表

1.2 merge表存储引擎在如下这种使用场合会最为有用:
1,2,1 网上这样说:
如果需要把日志记录不停的录入MySQL数据库,并且每天、每周或者每个月都创建一个单一的表,而且要制作来自多个表的合计查询,MERGE表这时会非常有效。然而,这项功能有局限性。你只能合并MyISAM表而且必须严格遵守相同的表定义的限制。虽然这看起来好像是一个大问题,但是,如果你使用另外一种表类型(例如InnoDB),这种合并可能就不需要.
1.2.2 我的感觉最直接的用途: 可以把很多表的统计使用一张表来统计,方便我们的统计,例如,统一账户有1000个流水表,如果要用sql来做这个,你会想到什么,是union 吗?当然可以,但是你可以试一下,union时表的个数最大是61个,这样是不是不行了;如果你用merge表那就很简单,就可以在一个表里面做你的统计了(merge表应该也有表的限制,但是我没有找到这个说明),统一账户有1000个表,我创建了4个merge表(之前创建了1个,select是报错“Can't open file: './uni_acct/t_acct_water_504.frm' (errno: 24)”,然后换成4个,两个其实也可以,哈哈;具体merge表union的表数目限制从测试看应该是503,这个数据不一定准确,只是我的一个测试值(有可能和表的数据量也有关))
二 merge表的创建和注意事项:
2.1 如何创建merge表
基本表:
CREATE TABLE TEST_MERGE_1(
ID INT(5) NOT NULL,
VALUE VARCHAr(100) NOT NULL,
PRIMARY KEY(ID)
);

CREATE TABLE TEST_MERGE_2(
ID INT(5) NOT NULL,
VALUE VARCHAr(100) NOT NULL,
PRIMARY KEY(ID)
);
MERGE表:
CREATE TABLE TEST_MERGE(
ID INT(5) NOT NULL,
VALUE VARCHAr(100) NOT NULL,
PRIMARY KEY(ID)
) TYPE=MRG_MyISAM INSERT_METHOD=LAST UNIOn=(TEST_MERGE_1,TEST_MERGE_2);

2.2 说明:
1. 此表结构必须与基本表完全一致,包括列名、顺序(注意主键,索引这些可以不同)。UNIOn表必须同属一个DATABASE。
2. 此表类似于SQL中的union机制。
3. 基本表类型必须是MyISAM的。
4. 可以通过修改.mrg文件来修改MERGE表,每个基本表的名字占一行。注意:修改后要通过FLUSH TABLES刷新表缓存。
5. 对基本表的更改可以直接反映在此表上。
6. INSERT_METHOD的取值可以是: 0 不允许插入 FIRST 插入到UNIOn中的第一个表 LAST 插入到UNIOn中的最后一个表。(4.0之后可用)
7. 定义在它上面的约束没有任何作用,约束是由基本表控制的,例如两个基本表中存在着同样的一个Key值,那么在MERGE表中会有两个一样的Key值。
2.3 注意:
1.如果是通过修改.mrg文件的方式来修改MERGE表,那么一定要修改后要通过FLUSH TABLES刷新表缓存,否则修改不会生效。最近犯过一次这样的错误。
2.在数据量、查询量较大的情况下,不要试图使用Merge表来达到类似于Oracle的表分区的功能,会很影响性能。我的感觉是和union几乎等价。
3.查询结果及顺序与创建Merge表时联合表的顺序有关。
看下面的例子:
CREATE TABLE `allentest5` (
`a` int(11) NOT NULL default '0',
`b` varchar(11) default NULL,
PRIMARY KEY (`a`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
CREATE TABLE `allentest6` (
`a` int(11) NOT NULL default '0',
`b` varchar(11) default NULL,
PRIMARY KEY (`a`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
CREATE TABLE `allentest_mrg_5`
(
`a` int(11) NOT NULL default '0',
`b` varchar(11) default NULL,
primary key(a)
)ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNIOn=(`allentest5`,`allentest6`);
CREATE TABLE `allentest_mrg_6`
(
`a` int(11) NOT NULL default '0',
`b` varchar(11) default NULL,
primary key(a)
) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNIOn=(`allentest6`,`allentest5`);
CREATE TABLE `allentest_mrg_6_noKey` (
`a` int(11) NOT NULL default '0',
`b` varchar(11) default NULL
) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNIOn=(`allentest6`,`allentest5`)
原始表里面的数据:
select * from allentest5;
+---+---------+
| a | b |
+---+---------+
| 3 | test5_3 |
| 2 | test5_2 |
| 1 | test5_1 |
+---+---------+
select * from allentest6;
+---+---------+
| a | b |
+---+---------+
| 1 | test6_1 |
| 2 | test6_2 |
+---+---------+
几个merger表的结果
select * from allentest_mrg_6_noKey where a =1; / *没有主键*/
+---+---------+
| a | b |
+---+---------+
| 1 | test6_1 |
| 1 | test5_1 |
+---+---------+
select * from allentest_mrg_5 where a = 1;
+---+---------+
| a | b |
+---+---------+
| 1 | test5_1 |
+---+---------+
select * from allentest_mrg_6 where a = 1;
+---+---------+
| a | b |
+---+---------+
| 1 | test6_1 |
+---+---------+
select * from allentest_mrg_5;
+---+---------+
| a | b |
+---+---------+
| 3 | test5_3 |
| 2 | test5_2 |
| 1 | test5_1 |
| 1 | test6_1 |
| 2 | test6_2 |
+---+---------+
select * from allentest_mrg_6;
+---+---------+
| a | b |
+---+---------+
| 1 | test6_1 |
| 2 | test6_2 |
| 3 | test5_3 |
| 2 | test5_2 |
| 1 | test5_1 |
+---+---------+
select * from allentest_mrg_6_noKey;
+---+---------+
| a | b |
+---+---------+
| 1 | test6_1 |
| 2 | test6_2 |
| 3 | test5_3 |
| 2 | test5_2 |
| 1 | test5_1 |
+---+---------+

可以看到如下信息:
1) mrg表查询的结果和 union的表顺序一致(见select * from allentest_mrg_5;和select * fromallentest_mrg_6;);
2)mrg主键的问题;a.在查询时如果不带条件,这时候查询出来的数据和没有带主键的是一样的(见select * from allentest_mrg_6; 和 select * from allentest_mrg_6_noKey;);b.如果带条件(带有主键的查询),这样之后查询到第一个带有主键的内容(见select * from allentest_mrg_6_noKey where a =1; select * from allentest_mrg_5 where a = 1; 和 select * from allentest_mrg_6 where a = 1;) ;因此如果是做统计,那么在创建mrg表时尽量不要增加主键。
全部回答
虽然我很聪明,但这么说真的难到我了
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
把一个高是10dm的圆柱体截成三个圆柱体,表面
脸上有凹印怎么办
怎样可以降低水的沸点
对于任意有理数a,下列各式一定是正数的是A.
如何退出node命令或者node server
保定安吉尔净水机和沁园净水机售后
蒙胧的意思是什么
单选题2005年1月5日,国务院通过的《信访条例
我是威海市高区户口(农业)现在想在经区工作
久保田收割机688Q全喂入是什么意思和半喂人有
城阳四中在城阳区排多少名
如图,梯形ABCD中,DC∥AB,BC=CD,E、F分别
求助海信HDP2902G黑屏原因
某校举行了“多彩广元”歌唱晚会,以“热爱广
20万欧元的车到中国后大概要多少???
推荐资讯
环境设计学什么
北京银座·小神童幼儿园地址在什么地方,
去哪儿网认证酒店地址在哪,我要去那里办事
米博手机配件批发怎么去啊,我要去那办事
自主招生如何选择学校?
唐山市人民医院可以做亲子鉴定吗
由分子构成的物质,发生化学变化的实质是A.分
阳历79年1月31日,生人,我是哪个属相???
芝麻分608在那能贷到钱
【quarrel】quarrel和argue的区别和用法?
海报英语怎么说
灯火辉煌地址在哪,我要去那里办事
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?