问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何同时收集多表统计信息

发布网友 发布时间:2022-04-09 16:17

我来回答

1个回答

热心网友 时间:2022-04-09 17:46

一: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#39;t open file: #39;./uni_acct/t_acct_water_504.frm#39; (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 说明:

此表结构必须与基本表完全一致,包括列名、顺序(注意主键,索引这些可以不同)。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 #39;0#39;,

`b` varchar(11) default NULL,

PRIMARY KEY (`a`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1

CREATE TABLE `allentest6` (

`a` int(11) NOT NULL default #39;0#39;,

`b` varchar(11) default NULL,

PRIMARY KEY (`a`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1

CREATE TABLE `allentest_mrg_5`

(

`a` int(11) NOT NULL default #39;0#39;,

`b` varchar(11) default NULL,

primary key(a)

)ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`allentest5`,`allentest6`); /*5在前,6在后*/

CREATE TABLE `allentest_mrg_6`

(

`a` int(11) NOT NULL default #39;0#39;,

`b` varchar(11) default NULL,

primary key(a)

) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`allentest6`,`allentest5`); /*6在前,5在后*/

CREATE TABLE `allentest_mrg_6_noKey` (

`a` int(11) NOT NULL default #39;0#39;,

`b` varchar(11) default NULL

) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`allentest6`,`allentest5`) /*meg 没有 主键*/

原始表里面的数据:

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表时尽量不要增加主键。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
什么影响了汇率 我有一支万宝龙金笔4810,18K750。可惜笔杆坏了,请问什么地方能配件? 荣耀手机怎么弄轻触亮屏 大姨妈全是血块怎么办 不锈钢丝生产商怎么选好呢? 在春晚上赢的优酷会员卡怎么激活 暑假里 我读了好多好多的书 我也看了电视剧 三国演义 和 西游记... 西游记中银角大王:“叫你一声你敢答应吗?”为何有如此大的力量 ...就玩具战争打不开,加载到100时就停了,肿么办啊? 苹果4手机优酷7天会员怎么激活 手机没有卡,但能打通110,110方面显示什么号码? qq空间里我的访客对手隐身是什么 平安健康住院补充医疗保险 平安保险的好福利医保怎么购买 华为手机怎么设有安全设置 华为未知安全权限在哪里设置 已经在平安好生活报完意外险,还能在在平安好福利报平安养老险吗? 义翘神州目标家价?2021年义翘神州的年报?义翘神州股票有潜力吗2021? 义翘神州股票为什么天天跌?义翘神州财报东方财富?义翘神州股票还可以买吗? 义翘神州为什么那么多?义翘神州一季报发布会出中报预测?301047义翘神州股票吧? 为什么义翘神州资金流入?义翘神州第一季度业绩预告?义翘神州同花顺股票吧? 杭州银行股票股吧 义翘神州为什么大跌呀?义翘神州净利润预增报告?比义翘神州还牛的股票是哪个好? 义翘神州股票的发展前景?义翘神州市值高股价怎么那么低?义翘神州股份股票行情? 义翘神州的股票为什么不涨?义翘神州2021年半年报?义翘神州股票千股千评? 义翘神州未来估值目标价?义翘神州 2021年财报?义翘神州股票今后如何? 义翘神州为什么一直流出?2021年义翘神州上半年业绩?义翘神州301047股票吧? 义翘神州吧(301047)股吧?义翘神州历史最高涨到多少?义翘神州股票301047今日股价? 义翘神州股票 上市以来走势?义翘神州股票形态分析?义翘神州股票吧最新消息? 论义翘神州估值?义翘神州义翘神州股价股价?301047义翘神州股吧东方? 手机腾讯视频会议发言时离手机多近能听清 《生态金字塔》阅度答案。 科学家考察了生物世界的食物链,发现它恰似一个底大顶尖的金字塔,便把这叫做生态金字塔。 NIKE 鞋底是黄边的鞋子 求一篇450字左右的生态金字塔读后感。 学习《生态金字塔》,你的体会是: 汉服鞋子白底和黄底有什么区别? 有关生态金字塔倒置的问题 安徒生的童话传递着怎样的价值观念 白色波鞋鞋底边变得*底的,用什么方法可以使其变成本色,谢谢,有经验者请会回答 如何理解“生态” 白色鞋子胶底发黄,没办法穿出去,哪位好心人给出个好主意啊?谢谢啦! 营养结构是生态糸统的什么重要条件具备 关于生态系统(ecosystem)的东西? 比较王岳山峰的高度一般用什么统计图? 白色鞋子底部发黄了,还刷的干净吗? NEC笔记本vk17是哪年的产品 三叶草复古板鞋是不是有一款黄色胶底的? nec笔记本vk26是哪一年的 白色鞋,底邦发黄怎么处理?