Оптимизация подзапросов SQL

204
23 февраля 2018, 15:33

Имееться вот такой запрос

    SELECT SQL_CALC_FOUND_ROWS item.* ,     
    (SELECT metro  FROM catalog_metro as metro WHERE metro.id = item.metro LIMIT 1) as metroname ,
    (SELECT alias FROM catalog_metro as metro WHERE metro.id = item.metro LIMIT 1) as m_alias,
    (SELECT rajon_id FROM catalog_metro as metro WHERE metro.id = item.metro LIMIT 1) as rajon_id,
    (SELECT rajon FROM catalog_rajoni as rajon WHERE rajon_id = rajon.id LIMIT 1) as rajon,
    (SELECT alias FROM catalog_rajoni as rajon WHERE rajon_id = rajon.id LIMIT 1) as r_alias,
    (SELECT option FROM catalog_option as option WHERE item.option = option.id LIMIT 1) as option,
    (SELECT alias FROM catalog_option as option WHERE item.option = option.id LIMIT 1) as n_alias,
    (SELECT color FROM catalog_color as color WHERE color.id = item.color LIMIT 1) as color,
    (SELECT alias FROM catalog_color as color WHERE color.id = item.color LIMIT 1) as coloralias,
    (SELECT GROUP_CONCAT(service) as srv FROM catalog_gs as gs where gs.item=item.id GROUP BY gs.item) as gs
    FROM catalog_item as item WHERE 1 ORDER by item.order ASC  

Вопрос в том как несколько очень похожих по своей сути подзапроса свести в один, и стоит ли это делать (исходя из производительности)

З.Ы. таблица большая около 600к строк , само собой это не все условия в where, просто упрощение для того что бы меньше писать, все равно они тут не существенны

По Вопросам в комментариях: да вы правы лимит тут не нужен там сравнение 1 к 1 кроме момента с GROUP_CONCAT там многое к 1 пробовал переписать все это join'ами но это привило к увеличению времени запроса, За подсказку с PRIMARY KEY уже спасибо

По структурам таблица item это список с кучей параметров (id значений из других таблиц в которых соответственно у свойств есть свои атрибуты) та таблица что service там просто список item.id и service.id из еще одной таблицы не участвующей в данном запросе

Answer 1
SELECT 
  MIN(items_tabl.name_field), 
  MIN(metro.metro) as metroname, 
  MIN(metro.alias) as m_alias, 
  MIN(metro.rajon_id),  
FROM items_tabl
JOIN  metro ON metro.id = items_tabl.metro
GROUP BY items_tabl.FIELD_NAME_PRIMARY_KEY;

FIELD_NAME_PRIMARY_KEY - это название поля в таблице

Здесь групировка идет по полю PRIMARY_KEY, оно имеет индекс, за счет этого запрос будет работать значительно быстрее.

Про форматирования кода нужно помнить :) а то читать его почти нереально. Везде писать as так же не стоит, иногда без него код легче читать.

READ ALSO
Аналог ltree для MySQL

Аналог ltree для MySQL

Добрый деньДля PostgreSQL можно установить пакет postgresql-contrib, с помощью которого можно использовать ltree, позволяющий хранить древовидные структуры...

385
Узнать сколько совпадений в запросе LEFT

Узнать сколько совпадений в запросе LEFT

Здравствуйте! Помогите, пжлст, составить запрос, если таковой вообще возможенЕсть две таблицы

222
Как задать значение по умолчанию для нового мета-поля в wordpress?

Как задать значение по умолчанию для нового мета-поля в wordpress?

Есть сайт на wordpress с большим количеством объявлений (тип записи, созданный темой)Я добавил для объявлений новое произвольное мета-поле cp_wholespare,...

203
C# Чтение из массива

C# Чтение из массива

Помогите понять почему вылетает с ошибкой "SystemFormatException: Входная строка имела неверный формат

339