Оптимизация sql запроса с join
-
Доброе утро. Облазив просторы интернета примерно до 7 утра, так и не смог найти оптимального решения выполнения задачи, решил обратиться к вам коллеги, может что посоветуете.
Имеем такой запрос
SELECT wp_posts.* FROM wp_posts INNER JOIN wp_postmeta as pm_product ON pm_product_salon.meta_value = wp_posts.ID INNER JOIN wp_postmeta as pm_product2 ON pm_product_salon2.post_id = pm_product_salon.post_id INNER JOIN wp_postmeta as pm_salon ON pm_salon.post_id = pm_product2.meta_value WHERE 1=1 AND wp_posts.post_type = 'product' AND pm_product_salon.meta_key = 'sp_product_id' AND pm_product_salon.meta_key = 'sp_salon' AND pm_salon.meta_key = 'salon_region' AND pm_salon.meta_value IN (1511, 1512, 1513) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 24
Запрос рабочий но выполняется уж слишком долго 0.3289 сек.
Вся проблема как я полагаю заключается в том что у нас в post_meta информация хранится не в столбцах а в стоках и соответственно приходится постоянно обращаться к postmeta чтобы выбрать единственный элемент для поста.Разберу запрос по порядку:
1. INNER JOIN wp_postmeta as pm_product_salon ON pm_product_salon.meta_value = wp_posts.ID
(у меня есть post_type товары и есть post_type товары салонов. В товарах салона указывается салон и товар. В салонах указывается регион )
соответственно в это join я обращаюсь чтобы выбрать все товары которые имеются в товарах салона
AND pm_product_salon.meta_key = ‘sp_product_id’
2. Дальше я обращаюсь в туже таблицу чтобы по post_id(товара салона вытащить ID салона)
INNER JOIN wp_postmeta as pm_product2 ON pm_product_salon2.post_id = pm_product_salon.post_id
AND pm_product_salon.meta_key = ‘sp_salon’
Вот здесь я считаю что происходит потеря производительности (во 2)3. Ну и в третьем запросе я по полученному ID салона я сравниваю тот ли регион мне нужен
INNER JOIN wp_postmeta as pm_salon ON pm_salon.post_id = pm_product2.meta_value
AND pm_salon.meta_key = ‘salon_region’
AND pm_salon.meta_value IN (1511, 1512, 1513)Друзья буду рад любому совету с вашей стороны насчет оптимизации запроса. Представить страшно какое время будет если еще начать проверку на «помещена ли запись в trash»..
- Тема «Оптимизация sql запроса с join» закрыта для новых ответов.