带有大 WHERE IN 子句的 SELECT 需要很长时间

elb*_*ert 5 mysql performance select

我对这一切都很陌生,所以要温柔:)。

我有大型医疗数据库,我需要根据选定的医生为患者提取数据。

现在我建立了一个病人名单

SELECT patID 
FROM appointments 
WHERE docID IN ('docid1', 'docid2', ..... , 'docidn') 
Run Code Online (Sandbox Code Playgroud)

一旦我得到我的病人名单,我就会在从一大堆病人相关的表格中提取数据时使用它。

根据我最初的医生名单,我最终可以得到超过 20,000 名的患者名单。系统中的患者总数接近 1,000,000。

然后我拿我的病人名单开始从其他表中获取数据,或多或少是这样的

Select * 
FROM xrays 
WHERE patID IN ('patid1', 'patid2', 'paid3',....., 'patidn' ) 
Run Code Online (Sandbox Code Playgroud)

我根据第一部分中的列表构建了 patids 列表。

可以想象,对于 20,000 名患者列表,上述查询需要很长时间。

关于更好的方法的任何建议?

ype*_*eᵀᴹ 8

这就是Join的用途。您不必获取患者 ID 列表,然后将它们发送回 SQL 引擎。您可以将两个查询合二为一,使用JOIN

SELECT x.* 
FROM xrays AS x
  JOIN appointments AS a
    ON a.patID = x.patID 
WHERE a.docID IN ('docid1', 'docid2', ..... , 'docidn') 
ORDER BY x.patID                   --- optional so your application gets
                                   --- the data of patients, ordered.
Run Code Online (Sandbox Code Playgroud)

要检查的其他事项是您在表上的索引。根据经验,至少在连接中使用的所有列,例如您的docID, patID,都应该有一个索引。