Здравствуйте, помогите оптимизировать запрос, чтобы снизить время ответа.
В общем есть запрос для выборки публикаций для ленты новостей схожей с ВК.
При этом есть категории и города, которые может выбрать пользователь.
Одна публикация может быть в нескольких городах и в нескольких категориях.
И последняя сложность, есть категории и города, которые можно смотреть только подписчикам.
Структура такая:
Publication:
id
--много полей--
Sities:
id
name
Categories:
id
name
Pub_kat
id
kat_id
pub_id
Pub_sity
id
sity_id
pub_id
В php генерирую переменные:
//выбранные категории, вернет строку типа - "1,2,3" исключая недоступные для юсера
$true_kat;
//выбранные города, вернет строку типа - "1,2,3" исключая недоступные для юсера
$true_sity;
//запрещенные для юсера категории, если он подписчик или их нет то вернет 0
$false_kat;
//запрещенные для юсера города, если он подписчик или их нет то вернет 0
$false_sity;
Сам запрос, с небольшой добавкой, чтобы получить лайки и дизлайки к публикациям
SELECT c.id, c.text, c.date, c.name,
(SELECT count(liked) FROM Likes_pub
WHERE liked = 1 and pub_id=c.id) as 'like',
(SELECT count(liked) FROM Likes_pub
WHERE liked = 0 and pub_id=c.id) as 'dislike'
FROM Publication c
WHERE c.id in
(SELECT pub_id FROM Pub_kat WHERE kat_id in ($true_kat) and pub_id in
(SELECT pub_id FROM Pub_sity WHERE sity_id in ($true_sity)))
AND
c.id not in
(SELECT pub_id FROM Pub_kat WHERE kat_id in ($false_kat) and pub_id not in
(SELECT pub_id FROM Pub_sity WHERE sity_id in ($false_sity)))
ORDER by c.id DESC LIMIT 0,20
Без лишнего:
SELECT c.name
FROM Publication c
WHERE c.id in
(SELECT pub_id FROM Pub_kat WHERE kat_id in ($true_kat) and pub_id in
(SELECT pub_id FROM Pub_sity WHERE sity_id in ($true_sity)))
AND
c.id not in
(SELECT pub_id FROM Pub_kat WHERE kat_id in ($false_kat) and pub_id not in
(SELECT pub_id FROM Pub_sity WHERE sity_id in ($false_sity)))
ORDER by c.id DESC LIMIT 0,20
В общем этот запрос, на локальном хостинге, выполняется 2.6 секунды, что-то я как-то написал вместо переменных, выполнялся вообще 8 секунд. На хостинге это будет еще хуже.
Чувствую я, что так быть не должно, а как оптимизировать в голову не приходит.
Буду рад любым советам)
Заранее спасибо за ответ.