Как улучшить производительность запросов с помощью операторов OR или IN в PostgreSQL? - PullRequest
1 голос
/ 04 сентября 2011

У меня есть таблица с 1,8 миллионами строк:

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

и таблица каналов с 8000+ строками:

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

Мне нужно, чтобы в каждом результате отображались элементы из канала, называемого «глобальным», например, у меня есть следующие каналы:

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)

1 Ответ

1 голос
/ 04 сентября 2011

Упорядочивая по названию, вы выполняете последний шаг сортировки для 1,8 млн. Кортежей, просто чтобы получить 10 лучших записей. Попробуйте отсортировать по id, например.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...