ArtDenis
@ArtDenis
Разработчик сайтов и мобильных приложений

Какое должно быть время выполнения MySQL запроса?

Здравствуйте, помогите оптимизировать запрос, чтобы снизить время ответа.

В общем есть запрос для выборки публикаций для ленты новостей схожей с ВК.
При этом есть категории и города, которые может выбрать пользователь.
Одна публикация может быть в нескольких городах и в нескольких категориях.
И последняя сложность, есть категории и города, которые можно смотреть только подписчикам.

Структура такая:
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 секунд. На хостинге это будет еще хуже.
Чувствую я, что так быть не должно, а как оптимизировать в голову не приходит.
Буду рад любым советам)
Заранее спасибо за ответ.
  • Вопрос задан
  • 1731 просмотр
Решения вопроса 3
iiifx
@iiifx
PHP, OOP, SOLID, Yii2, Composer, PHPStorm
Поддерживаю предыдущего автора - explain. Не гадайте на кофейной гуще. Разберите запрос, определите что именно тупит.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
65536
@65536
Не обладаю глубинными знаниями субд. Как то раз тоже наделал таких вложенных запросов, именно таких же ...IN(SELECT id... Почему-то интуитивно решил что это будет быстрее чем делать отдельные запросы. А потом наткнулся на эти тормоза. Для эксперимента попробовал сделать вложенные разными запросами а потом сформировать уже основной. Оказалось быстрее раз в 400
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы