Прежде всего:
Кажется, что отношение N: M между items
и categories
: item
может быть в нескольких categories
.Я говорю это потому, что categories
имеет item_id
внешний ключ.
Если это не отношение N: M, вам следует подумать об изменении дизайна.Если это отношение 1: N, где в категории есть несколько элементов, item
должен содержать category_id
внешний ключ.
Работа с N: M:
Я переписал вашзапрос для создания внутреннего объединения, устанавливающий перекрестное соединение:
SELECT e.item_id, e.item_value
FROM
tbl_items AS e
JOIN
tbl_categories AS cat
on e.item_id = cat.item_id
WHERE
cat.cat_id = 6001
ORDER BY
e.timestamp
LIMIT 25
Для оптимизации производительности необходимы следующие индексы:
create index idx_1 on tbl_categories( cat_id, item_id)
это не обязательно индекс для элементов, поскольку первичный ключ также индексируется,Индекс, который содержит метку времени, не помогает как Mutch.Чтобы быть уверенным, можно попробовать использовать индекс по элементу с item_id
и timestamp
, чтобы избежать доступа к таблице и получить значения из индекса:
create index idx_2 on tbl_items( item_id, timestamp)
Чтобы повысить производительность, вы можете изменить цикл по категориям наодин запрос:
select T.cat_id, T.item_id, T.item_value from
(SELECT cat.cat_id, e.item_id, e.item_value
FROM
tbl_items AS e
JOIN
tbl_categories AS cat
on e.item_id = cat.item_id
ORDER BY
e.timestamp
LIMIT 25
) T
WHERE
T.cat_id between 6001 and 6012
ORDER BY
T.cat_id, T.item_id
Пожалуйста, попробуйте эти запросы и вернитесь с комментариями, чтобы уточнить их при необходимости.