在MySql中一次获得15个表的更好方法

时间:2016-06-22 13:33:57

标签: mysql sql database optimization database-optimization

我有大约20张桌子。这些表只有id(主键)和description(varchar)。对于一个表,数据大约达到400行。

现在我必须一次获得至少15个表的数据。 现在我一个接一个地打电话给他们。这意味着在一个会话中我给了15个电话。这使我的过程变慢。

任何人都可以建议更好的方法从数据库中获取结果吗?

我在服务器端使用MySQL database并使用Java Springs。为所有组合观看会帮助我吗? 由于这个问题,应用程序变得越来越慢,我需要一个能让我的流程更快的解决方案。

3 个答案:

答案 0 :(得分:0)

听起来你的架构不是很好。 20个id / varchar表听起来就像一个破碎的EAV,通常被认为是破碎的。同样,我认为UNION查询会有所帮助。这将是在数据库中创建的“视图”,因此您只需SELECT * FROM thisviewyoumade并让它担心击中所有表格。

UNION查询通过将多个SELECT stataements“堆叠”在彼此之上来工作。重要的是每个SELECT语句具有相同的数字,序数和字段类型,因此当它堆叠结果时,所有内容都匹配。

在您的情况下,制造一个额外的字段是有意义的,这样您就可以知道它来自哪个表。如下所示:

SELECT 'table1' as tablename, id, col2 FROM table1
UNION ALL
SELECT 'table2', id, col2 FROM table2
UNION ALL
SELECT 'table3', id, col2 FROM table3
... and on and on

第一个SELECT语句中字段的名称或别名是返回的结果集中使用的字段名称,因此不必担心在后续AS blahblahblah中执行一堆SELECT 1}}陈述。

真正的问题是,这种联合查询在这么微小的数据上是否会比15次单独调用执行得更快。我认为更好的选择是更改您的架构,以便这些东西已经存储在一个表中,就像这个UNION查询输出一样。那么你需要针对单个表的单个select语句。并且400x20 = 8000仍然是一个很难查询的小桌子。

答案 1 :(得分:0)

要在一次往返中将所有描述的行添加到应用程序代码中,请发送查询类型

select t1.description, ... t15.description
from  t -- this should contain all needed ids
join table1 t1 on t1.id = t.t1id
...
join table1 t15 on t15.id = t.t15id

答案 2 :(得分:0)

我无法得到你真正需要的东西,但是这里将所有这些表值合并到单个表中     CREATE TABLE table_name AS(

SELECT * 
  FROM table1 t1
  LEFT JOIN table2 t2 ON t1.ID=t2.ID AND
  ...
  LEFT JOIN tableN tN ON tN-1.ID=tN.ID

)