.我在 Mysql DB 中有太多的表 X1,X2,...Xn(它们可能超过 75 个表)来代表一个非常大公司的部门。
每个表都有这样的结构
描述 X1; +---------+-------------+------+-----+---------+-- -----+ | 领域 | 类型 | 空 | 钥匙 | 默认 | 额外 | +---------+-------------+------+-----+---------+-- -----+ | 要求 | 整数(11) | 是 | | 空 | | | 员工姓名 | varchar(32) | 是 | 多| 空 | |
现在我应该从 John 工作的部门返回所有 ReqF。我知道我可以通过这样的左连接来做到这一点
select X1.ReqF,X2.ReqF,...,Xn.ReqF FROM X1 left join X2 on (EmpName) left join .... left join Xn on X1.EmpName=Xn.EmpName where X1.EmpName='John'
有没有更好的方法可以做到这一点,如果我们需要从表中检索不同的字段(例如 X1.ReqF1、X2.ReqF2 或 [SELECT X1.F1、X1.F2、X2.F3、 ...])??
如果所有表都使用 MyISAM 存储引擎并具有相同的表结构,那么我有一些好消息要告诉您。
您可以创建一个除了.frm文件和一些映射信息外不占用额外空间的单个表。关键是要利用MERGE (MRG_MyISAM) 存储引擎。
以下是您可以这样做的方法:
CREATE TABLE XMerge LIKE X1;
ALTER TABLE XMerge ENGINE=MRG_MYISAM
UNION=(X1,X2,X3,X4) INSERT_METHOD=LAST;
Run Code Online (Sandbox Code Playgroud)
使用这种方法,您可以像这样同时查询 4 个表:
SELECT ReqF FROM XMerge WHERE EmpName='John';
Run Code Online (Sandbox Code Playgroud)
是这么简单,还是什么???
就您而言,您有 75 张桌子。你会这样做:
CREATE TABLE XMerge LIKE X1;
ALTER TABLE XMerge ENGINE=MRG_MYISAM
UNION=(X1,X2,X3,X4,X5,X6,X7,X8,X9,
X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,
X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,
X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,
X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,
X50,X51,X52,X53,X54,X55,X56,X57,X58,X59,
X60,X61,X62,X63,X64,X65,X66,X67,X68,X69,
X70,X71,X72,X73,X74,X75) INSERT_METHOD=LAST;
SELECT ReqF FROM XMerge WHERE EmpName='John';
Run Code Online (Sandbox Code Playgroud)
这样做的好处是创建一个 MERGE 表需要几毫秒。只要确保每个表在 EmpName 上都有一个索引。最好进行 75 次索引查找而不是 75 次全表扫描。如果 EmpName 上没有索引,则需要执行以下操作:
ALTER TABLE X1 ADD UNIQUE KEY (EmpName);
ALTER TABLE X2 ADD UNIQUE KEY (EmpName);
.
.
.
ALTER TABLE X75 ADD UNIQUE KEY (EmpName);
CREATE TABLE XMerge LIKE X1;
ALTER TABLE XMerge ENGINE=MRG_MYISAM
UNION=(X1,X2,X3,X4,X5,X6,X7,X8,X9,
X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,
X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,
X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,
X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,
X50,X51,X52,X53,X54,X55,X56,X57,X58,X59,
X60,X61,X62,X63,X64,X65,X66,X67,X68,X69,
X70,X71,X72,X73,X74,X75) INSERT_METHOD=LAST;
SELECT ReqF FROM XMerge WHERE EmpName='John';
Run Code Online (Sandbox Code Playgroud)
试一试 !!!