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

Мне тут подсказали, что такой запрос положит сервер.
SELECT `post_id`
FROM `wp_postmeta` AS p
WHERE p.`meta_key` LIKE 'fromcity_%' AND p.`meta_value` = 'Пафос'
    AND EXISTS (
        SELECT 1
        FROM wp_postmeta AS c
        WHERE c.post_id = p.post_id
            AND c.`meta_key` LIKE concat('fromdistrict_', substring(p.`meta_key`, 10))
            AND c.`meta_value` = 'Юго-запад'
    )


Как уменьшить его?=)
  • Вопрос задан
  • 2213 просмотров
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Во-первых, длина никакого отношения к "укладыванию сервера не имеет". Важен не размер, а умение. Уменьшать надо не запрос, количество просматриваемых запросом строк.
Во-вторых, надо не досужих доброхотов спрашивать, а самому смотреть, тормит запрос, или нет. Если нет - то и не париться раньше времени.
В-третьих, почему бы не спросить того же "знатока", который это тебе сказал?

Единственная проблема, которую я здесь вижу - это множественные суб-селекты exists, которые при большой выборке могут стать проблемой. Но если выборка небольшая, то и проблемы нет.

Если прям хочется разобраться, то для начала выполни в консоли две команды
\W
EXPLAIN EXTENDED дальше твой запрос

и посмотри таблицу. Если цифры в колонке rows копеечные, то и не парься. Заодно можешь посмотреть, во что оптимизатор превратил твой запрос - возможно, он уже научился эту красоту сам транслировать в джойны.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Lol4t0
Я видел предыдущий вопрос, и мне кажется, лучшим решением будет переделать структуру базы данных так, чтобы не возникало необходимости в выделении чего-то из подстрок, то есть, например

cities
+---------+-----------+
| city_id | city_name |
+---------+-----------+

stricts
+-----------+---------+-------------+
| strict_id | city_id | strict_name |
+-----------+---------+-------------+

posts
+---------+---------+-----------+
| post_id | city_id | strict_id |
+---------+---------+-----------+
Ответ написан
Ваш ответ на вопрос

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

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