.Tenho muitas tabelas X1,X2,...Xn (elas podem exceder 75 tabelas) no banco de dados Mysql para representar departamentos de uma empresa muito grande.
toda tabela tem estrutura algo assim
desc X1; +--------+-------------+------+-----+---------+-- -----+ | Campo | Tipo | Nulo | Chave | Padrão | Adicional | +--------+-------------+------+-----+---------+-- -----+ | ReqF | int(11) | Sim | | NULO | | | EmpName | varchar(32) | Sim | MUL | NULO | |
agora devo retornar todos os ReqF dos departamentos em que John trabalha. Sei que posso fazer isso juntando à esquerda assim
selecione X1.ReqF,X2.ReqF,...,Xn.ReqF FROM X1 junção esquerda X2 em (EmpName) junção esquerda .... junção esquerda Xn em X1.EmpName=Xn.EmpName onde X1.EmpName='John'
existe alguma maneira melhor de fazer isso e se precisarmos recuperar campos diferentes de tabelas (ex X1.ReqF1, X2.ReqF2 ou número aleatório de campos de tabelas como [SELECT X1.F1, X1.F2, X2.F3, ...])??
Se todas as tabelas usam o mecanismo de armazenamento MyISAM e têm a mesma estrutura de tabela, tenho boas notícias para você.
Você pode criar uma única tabela que não consome espaço adicional, exceto um
.frm
arquivo e algumas informações de mapeamento. A chave é tirar proveito do mecanismo de armazenamento MERGE (MRG_MyISAM) .Aqui está como você pode fazer isso:
Usando este método, você pode consultar as 4 tabelas ao mesmo tempo assim:
Foi simples ou o quê???
No seu caso, você tem 75 tabelas. Você faria isso:
A beleza disso é que a criação de uma tabela MERGE leva milissegundos. Apenas certifique-se de que cada tabela tenha um índice em EmpName. É melhor fazer 75 pesquisas indexadas do que 75 verificações de tabela completas. Se não houver índice em EmpName, você precisará fazer isso:
De uma chance !!!
Dada esta estrutura de tabela, eu faria:
pois isso traria os valores de ReqF em uma estrutura mais consistente (mesma coluna).