Вы не ответили на разъяснения, поэтому я приму несколько вещей:
- Вы хотите ВСЕ коробки, а не только 10 из них.
- Существует опечатка, когдасравнивая по имени.Должно быть:
Item.name = 'my_name'
- Вы сказали: «Я проиндексировал все атрибуты предмета».Я бы предположил, что у вас есть индексы из одного столбца для всех столбцов таблицы
Item
. - Столбец
id
в Box является первичным ключом, и поэтому у него уже есть индекс.
Теперь я считаю, что используемые вами индексы не оптимальны для этого запроса, поскольку они содержат только столбцы отдельно.Если у вас их еще нет, попробуйте создать следующие индексы:
create index ix1 on Item (box_id, type);
create index ix2 on Item (box_id, name);
Да, оба из них.Повторите запрос еще раз и посмотрите, сколько времени это займет.
Если все еще медленно, пожалуйста, опубликуйте план объяснения, используя:
EXPLAIN ANALYZE
SELECT Box.id
FROM Box
WHERE
(EXISTS (SELECT 1 FROM Item WHERE Item.box_id = Box.id AND Item.type = 'my_type'))
AND
(EXISTS (SELECT 1 FROM Item WHERE Item.box_id = Box.id AND Item.name = 'my_name'))