mysql - 优化 IN 子查询

标签 mysql sql join query-optimization in-subquery

我有一个 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/

相关文章:

MySQL 查询仅在字符串不包含数字时有效

php - 如何使用 foreach 进行连续的 mysql 插入?

java - 从数据库(my sql)获取ID返回null

sql - 多列上的连接条件与连接列上的单连接?

MySQL - 计算多个表的相关行数

php - 使用准备好的语句执行类似于 "mysqli_fetch_array"的操作。 PHP MYSQL

php - 从php mysql数据库填充一个选择框

sql - 从两个表到单个 View 的 T-SQL 层次结构

sql - 区分问题和答案

MySQL select join many to many tables 加上 IN 和 NOT IN