2012-03-27 8 views
1

У меня есть этот запрос со многими левыми соединениями и внутренним соединением с датами. Мне нужно сгруппировать по id_art (from articles_art) и date_dat (date_dat). Проблема в том, что это очень медленно. он занимает 3 секунды для 1000 записей. date_dat индексируется в таблице date_dat, а id_art - первичный ключ articles_art. Что я могу сделать, чтобы оптимизировать этот запрос?mysql: fast group by with join

SELECT 
    id_art, image2_art, video_art, website, 
    text.title_int, text.intro_int, text.text_int, text.extra_int, 
    dat.date_dat, dat.date2_dat, 
    group_concat(tim.time_tim), 
    prd.name_prd, 
    group_concat(cat.name_cat), 
    trg.name_trg, 
    spa.name_spa, 
    spa2.name_spa 
FROM 
    articles_art AS art 
    LEFT JOIN internText_int AS text ON text.idart_int = art.id_art 
    INNER JOIN dates_dat AS dat ON art.id_art = dat.idart_dat 
    LEFT JOIN spaces_spa As spa ON spa.id_spa = dat.idspa_dat 
    LEFT JOIN spaces_spa As spa2 ON spa.id_spa = dat.idspa2_dat 
    LEFT JOIN times_tim AS tim ON tim.iddat_tim = dat.id_dat 
    LEFT JOIN articles_products_artprd AS artprd ON artprd.idart_artprd = art.id_art 
    LEFT JOIN products_prd AS prd ON prd.id_prd = artprd.idprd_artprd 
    LEFT JOIN cater_cev AS cev ON cev.idart_cev = dat.idart_dat 
    LEFT JOIN categories_cat AS cat ON cat.id_cat = cev.idcat_cev 
    LEFT JOIN targets_trg AS trg ON trg.id_trg = art.idtrg_art 
WHERE 
    prd.id_prd in (1,2) 
    AND validated_art = 1 
    AND text.idlin_int in (1,4) 
GROUP BY 
    id_art, date_dat 
+3

Можете ли вы опубликовать план объяснения? – ruakh

+0

индексы являются ключом к производительности в выбранном запросе - добавление объяснения из вашего запроса поможет определить, где вам не хватает индексов. – ManseUK

+0

Как объяснение запроса должно помочь? Я вижу возможные_keys, key, ref, rows и extra, но я не знаю, как это может мне помочь. Вы можете мне объяснить? спасибо – Pietro

ответ

1

Посмотрите, как вы можете поместить индекс по этим столбцам

prd.id_prd 
validated_art 
text.idlin_int 

Проверить эту первую затем, если это не работает, ставить индексы на условиях столбцов в условии ON

0

Если данные задержки ISN Не проблема, можете ли вы убрать данные (возможно, за одну ночь?) в единую нормализованную таблицу? Таким образом, вы запрашиваете одну таблицу без всех этих JOINS. Вы даже можете применять индексы, чтобы ускорить работу.

+0

объединение не проблема, потому что только с объединениями требуется 7-10 мс. Проблема состоит в следующем. – Pietro

+0

А, ОК. Если предположить задержку, это не проблема, можете ли вы нормализовать данные GROUP BY за одну ночь? – Phil