查询以使用连接

时间:2016-03-22 13:18:40

标签: mysql database join

简介:我已从具有相同数据库的现有应用程序导入数据。有很多表,因此不可能使用新ID更新数据。每个表的现有主键,例如 serviceprovider sp_id 。对于所有表格,我添加了一个新的主键 id 。我需要从这些表中获取旧的和新的数据(在导入完成后)。为了获取旧数据,我使用旧的主键/外键,并比较 database_id 表,以便从导入表中加入表。新数据仅使用新的主键 id 。由于旧主键的值 0 ,我知道它是否是新数据。

select serviceprovider.* from serviceprovider sp
inner join services ss on ((sp.id = ss.sp_id) AND (ss.ss_id = 0))
OR ((sp.sp_id = ss.sp_id) AND (ss.ss_id <> 0) AND (sp.database_id=ss.database_id))

我构建了这个查询,随着数据的增加,这个查询变得非常慢。最初它工作得很好但是当我从旧数据库导入数据时它几乎停止工作。您可以猜测我需要加入更多表来获取完整数据。所有表都使用相同的连接机制。我正在使用MySQL。可以重新构建查询以获得更好的性能吗?

1 个答案:

答案 0 :(得分:0)

此查询不应该太重,请考虑在所有正在加入的表上添加索引:

serviceprovider(id,sp_id,database_id)

services(sp_id,ss_id,database_id)

这可以加快此查询速度。

您还可以尝试使用EXISTS()而不是内部联接重建查询:

select serviceprovider.* from serviceprovider sp
WHERE EXISTS(select 1 from services ss
             where ((sp.id = ss.sp_id) AND (ss.ss_id = 0))
                    OR ((sp.sp_id = ss.sp_id) AND (ss.ss_id <> 0) AND (sp.database_id=ss.database_id)))

也许它会跑得更快。

编辑:让我们尝试另一种方法,两个选择和一个联合而不是这个OR条件:

select serviceprovider.* from serviceprovider sp
inner join services ss on (sp.id = ss.sp_id AND ss.ss_id = 0)
UNION ALL
select serviceprovider.* from serviceprovider sp
inner join services ss on(sp.sp_id = ss.sp_id AND ss.ss_id <> 0 AND sp.database_id=ss.database_id)