@Elesei

Как оптимизировать sql запрос?

Есть запрос:
$querystr= "SELECT ID
FROM $wpdb->posts 
LEFT JOIN $wpdb->postmeta v1 ON (id = v1.post_id)
LEFT JOIN $wpdb->postmeta v2 ON (id = v2.post_id)
LEFT JOIN $wpdb->postmeta v3 ON (id = v3.post_id)
WHERE post_status = 'publish' 
AND ( v1.meta_key = 'meta_key1' AND v1.meta_value = '$meta_value1' )
AND ( v3.meta_key = 'meta_key3' AND v3.meta_value = '$meta_value2' )
AND v2.meta_key = 'meta_key2'
ORDER BY post_date DESC";
$ter = $wpdb->get_results($querystr, ARRAY_A);


Необходимо получить все посты соответствующие запросу.
Как можно упростить?
Affected Rows 124 Time 0,9295
Посты в выборке могут быть из разных категорий с разными метками(возможности составить список нет).
Буду благодарен за любую помощь (хоть скажите в каком направлении капать).
Заранее спасибо.

После немного обдумав решил что поскольку нужно только id, то подключать таблицу posts не имеет смысла.
Запрос преобразован:
SELECT p1.post_id
FROM wp_postmeta p1
JOIN wp_postmeta p2 ON p1.post_id = p2.post_id
AND p1.meta_key =  'meta_key1'
AND p2.meta_key =  'meta_key2'
WHERE p1.meta_value =  '$meta_value1'
ORDER BY p2.meta_value +0 DESC 
LIMIT 10000


Но в любом случае долго...
  • Вопрос задан
  • 258 просмотров
Пригласить эксперта
Ответы на вопрос 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Копать в сторону EXPLAIN и индексов.
Ответ написан
Комментировать
kompi
@kompi
nullstack devoops
Гуглить в сторону анализа sql запросов.
Универсальный способ - сделать дамп запроса, затем explain и оптимизация. Если что-то не понятно по интерпритации результата, опять же, - гуглить нужную информацию.
Ещё более углублённое погружение - perfomance_schema (mysql > 5.5).
Ответ написан
profit
@profit
Разработка | Оптимизация. Telegram: @evzavyalov
SELECT p1.post_id
FROM (select * from wp_postmeta LIMIT 10000 ) p1
JOIN wp_postmeta p2 ON p1.post_id = p2.post_id
AND p1.meta_key =  'meta_key1'
AND p2.meta_key =  'meta_key2'
WHERE p1.meta_value =  '$meta_value1'
ORDER BY p2.meta_value +0 DESC
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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