gpt4 book ai didi

mysql - 优化 IN 子查询

转载 作者:太空宇宙 更新时间:2023-11-03 10:43:05 24 4
gpt4 key购买 nike

我有一个 workers 表和一个关联的 workerGeofence 表。

CREATE TABLE IF NOT EXISTS `workergeofences` (
`ID` int(11) NOT NULL,
`WorkerID` varchar(20) NOT NULL,
`GeofenceID` int(11) NOT NULL,
`isActive` tinyint(4) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=107 DEFAULT CHARSET=latin1;

我只需要返回在 workerGeofences 表中至少有一个 isActive 为 1 的条目。

我能够通过以下方式获得预期的结果:

    SELECT distinct w.ID, Title, FName, SName, Email, Birthday, Address, Phone, description,
companyID
FROM Workers w WHERE companyID = ?
and w.ID IN (SELECT WorkerID FROM WorkerGeofences WHERE isActive <> 0)
limit ?,10

但是 in 子查询是详尽无遗的,因为当我运行解释时,我可以看到它正在扫描整个表。我该如何解决这个问题?

最佳答案

您走在正确的轨道上,但您不需要select distinct。这会减慢查询速度,除非您知道存在重复项——这不太可能,因为您选择的是 WOrkers.Id

SELECT w.* 
FROM Workers w
WHERE w.companyID = ? AND
EXISTS (SELECT 1
FROM workerGeofences wg
WHERE w.ID = wg.WorkerID AND wg.isActive <> 0
)
LIMIT ?, 10;

然后,对于此查询,您需要 Workers(CompanyId, Id)workerGeofences(WorkerId, isActive) 上的索引。

注意:为了方便,我只是输入了select *。我假设所有列都来自 Workers 表。

关于mysql - 优化 IN 子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35179631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com