2014-01-26 129 views
0

我正在为我的iOS & Android应用程序制作一些跟踪系统。当我的mysql服务器有很大的查询时(我不知道有多少),我的mysql服务器重新启动。所以我在表演中想。Mysql加入vs选择里面选择

我不知道是否有帮助,但我的服务器可以处理超过每分钟500所陈述

我的问题是:它的速度更快,使两个在同一个语句选择(或以上)或进行加入?

DB:我有两个表格,一个是人员连接的设备,另一个是连接到我的应用程序的应用程序。

编辑:我的分贝它在InnoDB上,主要的&自动增加索引到ID。和FK到设备ID & appID

所以当用户登录时,我需要检查他是否在服务器注册。 (我使用SELECT * FROM测试提出)

两个SELECT语句

SELECT * FROM devicesApps WHERE appID='$idApp' and 
deviceID IN (SELECT id FROM devices WHERE fingerprint='$fingerprint') 

加入

SELECT * FROM devicesApps da, devices d WHERE da.appID='$idApp' 
and da.deviceID=d.id and d.fingerprint='$fingerprint' 

这是更快或两者是相同的?我只需要1排。

谢谢

+1

我会打赌2.更快.. – Hardy

+0

我反驳@Tmckeown来设计一个场景,其中1更快! – Strawberry

回答

0

它总是取决于索引查找,扫描等多种因素。如果您有执行计划进行比较,您的答案将变得更加清晰。

+0

我的数据库在InnoDB上,主索引和自动递增索引为ID。和FK到deviceID&appID – Edig

+0

FK并不意味着索引,它们只是约束。您应该使用EXPLAIN来查看计划。但是如果你的PK是ID并且你有大量的数据,那么这将是你最可能的最佳选择。 –

0

对于早期版本的MySQL,带子查询的in不是最理想的,我相信问题已在最新版本中修复。

应使用显式连接语法编写带有join的版本。这不会影响性能,但它是首选的SQL语法:

SELECT * 
FROM devicesApps da join 
    devices d 
    on da.deviceID = d.id 
WHERE da.appID = '$idApp' and d.fingerprint = '$fingerprint'; 

注意,顺便说一句,该查询的两个版本做做同样的事情。如果有多个设备匹配,则每个设备应用第一个返回一行,第二个每个设备返回一行。

您可以使用其他索引加速查询,例如device(fingerprint, id)devicesApps(appId, deviceId)

+0

嗨戈登,关于第二个,我让它真的很快,但我的意思是返回相同的东西:S。但是你说哪一个(假设返回相同)会更快? – Edig

+0

@EduardoIglesias。 。 。我会选择第二个,因为它的性能与版本无关。 –

+0

太好了,谢谢! – Edig