sql - 如何在 PostgreSQL 中使用 OR 或 IN 运算符提高查询性能?

标签 sql postgresql

我有一个包含 180 万行的项目表:

Item
-----------
- id
- title
- content
- channel_id

和一个包含 8000 多行的 channel 表:

Channel
-----------
- id
- name

我需要的是在每个结果中显示来自名为“global”的 channel 的项目,例如我有以下 channel :

id    |    name
________________
1     |    global
2     |    restaurants
3     |    hotels
...

所以我尝试了以下咨询:

SELECT * FROM Item WHERE channel_id = 1 OR channel_id = 2 ORDER BY title ASC LIMIT 10
SELECT * FROM Item WHERE channel_id IN (1, 2) ORDER BY title ASC LIMIT 10

两者都需要大约 18 秒! ...并且已经有 id 和 channel_id 两个索引

更新

看起来问题出在 ORDER BY 子句而不是 OR 或 IN 运算符,要订购的商品太多。

更新 我已经解决了这个为标题创建索引的问题:

CREATE INDEX item_by_title ON item (title ASC)

最佳答案

通过按标题排序,您将对 180 万个元组强制执行最后的排序步骤,只是为了获得前 10 条记录。 例如,尝试按 id 排序。

关于sql - 如何在 PostgreSQL 中使用 OR 或 IN 运算符提高查询性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7300308/

相关文章:

sql - DB2 LIKE 匹配模式

SQL 将两个具有键的表连接到不同的列中

mysql - 从 PostgreSQL 到 MySQL/MemSQL 的流式复制

php - SQL 查找接近的匹配项

postgresql - 升级 Postgres Aurora 主版本

python - 使用 Python 根据上次选择的列中提供的整数选择 Postgresql 数据库中的动态行

c# - 如何使用 C# 创建 SQL Server 2012 数据库?

sql - sql中的序列错误。此处不允许使用序列号

sql - PostgreSQL 错误 : there is no unique constraint matching given keys for referenced table

sql - 搜索跨越大量表格的数据 - 设计问题