.我在 Mysql DB 中有太多表 X1、X2、...Xn(它们可能超过 75 个表)来代表一个非常大的公司的部门。
每张桌子都有这样的结构
描述 X1; +--------+------------+------+-----+--------+-- -----+ | 领域 | 类型 | 空 | 键 | 默认 | 额外 | +--------+------------+------+-----+--------+-- -----+ | 请求F | 整数(11) | 是 | | 空 | | | 企业名称 | 变种(32) | 是 | 多个 | 空 | |
现在我应该从 John 工作的部门返回所有 ReqF。我知道我可以通过这样的 left join 来做到这一点
选择 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) 存储引擎。以下是如何做到这一点:
使用此方法,您可以像这样同时查询 4 个表:
就这么简单,还是什么???
在您的例子中,您有 75 张桌子。你会这样做:
这样做的美妙之处在于创建 MERGE 表需要几毫秒。只要确保每个表都有 EmpName 上的索引即可。最好进行 75 次索引查找,即 75 次全表扫描。如果 EmpName 上没有索引,则需要执行以下操作:
试试看 !!!
鉴于此表结构,我会这样做:
因为这会使 ReqF 值处于更一致的结构(同一列)中。