mysql - 从大型数据集中过滤掉记录的最佳方法是什么
问题描述
我在一个表中有大约 500,000 个用户记录,另一个表包含被其他用户特别阻止的用户的记录(即哪个用户阻止了哪个用户)。我正在使用以下查询来过滤当前用户的用户记录,其中不包含来自被阻止表的被阻止用户。
SELECT * from demouser where id not in (select blockedid from demoblock where userid = 1 )
它很慢,执行查询大约需要 2 秒。有没有更有效的方法来过滤记录而不将 500,000 条用户记录与被阻止的表进行比较以从结果中删除被阻止的用户?
解决方案
我会把它写成not exists
:
select du.*
from demouser du
where not exists (select 1
from demoblock db
where db.blockedid = du.id and
db.userid = 1
);
对于此查询,您需要在demoblock(blockedid, userid)
.
推荐阅读
- google-app-engine - 数据存储模拟器:DatastoreGrpcStub 需要本地 gRPC 安装
- json - 如何使用 Flutter 访问 Firestore 中特定配方的 documentId?
- multithreading - 我将如何知道我的子线程是否已完成执行或是否引发了异常
- android - 未从 Listview 中删除正确的索引项
- javascript - 将 div 置于画布顶部的中心,该画布的大小响应调整为 window.innerWidth 和 window.innerHeight
- c# - 采用任何属性类/模型 C# 的接口方法
- angular - 你如何有两个使用 flex 的表单字段占据 33% 的行?
- angular - 将整页转换为图像
- javascript - 找到最小切片的绝对和 - 可编码性
- python - 使用 AWS S3 路径中的文件创建 zip