首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是更快,子选择或不同(MySQL)?

什么是更快,子选择或不同(MySQL)?
EN

Stack Overflow用户
提问于 2016-05-12 11:39:28
回答 3查看 76关注 0票数 0

让我描述一下我的怀疑。我有系统,我有三个实体,医生,病人和预约。预约有医生的身份证和病人的身份证。

我现在需要检索所有与具体医生有预约的病人,我不知道什么会更快、更明显或更适合id,以下是查询:

使用distinct>

代码语言:javascript
复制
SELECT DISTINCT patient.id, patient.name, patient.surname FROM
appointment INNER JOIN patient ON patient.id = appointment.patientid WHERE
appointment.doctorid = @id;

使用子选择->

代码语言:javascript
复制
SELECT patient.id, patient.name, patient.surname FROM patient
WHERE patient.id IN (select appointment.patientid FROM appointment 
WHERE appointment.doctorid = @id);

由于不确定这是否会影响,系统将在MariaDB集群上运行。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-12 11:48:28

与任何性能问题一样,您应该对数据和硬件进行测试。第一个版本DISTINCTJOIN之后的可疑问题;这可能需要很多额外的处理。

您可以将第二个写成:

代码语言:javascript
复制
SELECT p.id, p.name, p.surname
FROM patient p
WHERE p.id IN (select a.patientid FROM appointment a WHERE a.doctorid = @id);

为此,您需要appointment(doctorid, patientid)上的索引。

您也可以考虑这个版本:

代码语言:javascript
复制
select p.id, p.name, p.surname
from patient p join
     (select distinct appointment.patientid
      from appointment
      where appointment.doctorid = @id
     ) a
     on p.id = a.patientid;

这特别需要相同的索引。这推动了distinct,因此它只在单个表上操作,这意味着MySQL可能能够为该操作使用索引。

而这个:

代码语言:javascript
复制
SELECT p.id, p.name, p.surname
FROM patient p
WHERE EXISTS (select 1
              from appointment a
              where a.doctorid = @id and a.patientid = p.id
             );

此查询需要appointment(patientid, doctorid)上的索引。它需要对patient进行完整的表扫描,并对每一行进行快速索引查找。根据数据的不同,这通常是最快的方法。

注意:哪个查询执行得更好,也可能取决于数据的大小和分布。

票数 6
EN

Stack Overflow用户

发布于 2016-05-24 22:09:15

都不是。

这些国家遭受“膨胀-紧缩”的痛苦。也就是说,JOIN会导致临时表中出现更多的行,但只会将其修剪回所需的位置。这太昂贵了。(它可能给出COUNTSUM的错误答案。)

代码语言:javascript
复制
SELECT DISTINCT ... JOIN ...
and
SELECT ... JOIN ... GROUP BY ...

由于优化器的限制,这一性能很差:

代码语言:javascript
复制
... IN ( SELECT ... )

这就是你想要的:

代码语言:javascript
复制
SELECT ...
    FROM ( SELECT id FROM ... WHERE ... )
    JOIN ...

如果子查询需要DISTINCTGROUP BY和/或LIMIT,则特别好。这是因为它将在执行JOIN之前创建一小部分行,从而减少所需的JOINs数量。

票数 1
EN

Stack Overflow用户

发布于 2016-05-12 11:49:49

我认为约会应该有身份证明.这里有个密码..。我希望它能帮上忙

代码语言:javascript
复制
SELECT patient.id, patient.name, patient.surname FROM patient
INNER JOIN appointment ON appointment.id = patient.patientid 
INNER JOIN doctor ON doctor.id = appointment.id
WHERE appointment.doctorid = @id
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37185793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档