sql - 优化连接查询,需要“过滤”不同的
问题描述
我想知道我还能优化多少相对简单的查询。对于抽象,我只有 2 个表,albums
分别是专辑 ID 和专辑标题,另一个是albums_genre
专辑 ID 和专辑类型作为列。
我的查询如下:
SELECT DISTINCT album_title
from albums
INNER JOIN albums_genre
ON albums.album_id = albums_genre.album_id AND (genre = 'Metal' OR genre = 'Jazz')
对我来说问题是,在albums
表 1 中,id 可能与多个专辑标题匹配,我试图找到一种方法来减少 distinct 所需的时间,因为它需要一半以上的总时间。我正在使用微软数据库。
提前感谢大家!
解决方案
第一步是使用以下命令编写查询exists
:
SELECT a.album_title
FROM albums a
WHERE EXISTS (SELECT 1
FROM albums_genre ag
WHERE ag.album_id = a.album_id AND
ag.genre IN ('Metal', 'Jazz')
);
然后为了性能,你需要一个关于albums_genre(album_id, genre)
. 并且 index on just(album_id)
可能也足够好。
请注意,性能增益来自删除外部查询中的聚合/不同的删除。
推荐阅读
- javascript - 如何以服务角度从 JSON 获取数据
- postgresql - Postgres - 附加到 jsonb 字符串
- c# - 添加 httpModule Applicationhost.config 仅用于本地开发
- spring - 使用 Auth0 的 Spring Boot 中的无效注册
- c++ - Doxygen 抱怨没有记录 vector<>.resize
- java - 如何在获取映射请求中使用 RequestHeader 值,而不是在 Spring Boot 中使用 PathVariable 来使用 findById 获取数据?
- javascript - 使用 Selenium javascript 禁用 Chrome 对话框“加载扩展失败”
- python - Flask 应用程序在本地运行顺利,但在 Heroku 上部署时出错
- c++ - 使用通配指针和空指针调用函数时的输出说明
- node.js - Friebase:如何加入多个表并使用 API 发送 json