2013-08-18 3 views
0

Здравствуйте, я добавил функцию GROUP_CONCAT в свой запрос, и эта функция убила мой запрос: /. Мой запрос:GROUP_CONCAT слишком медленно

SELECT u.username,a.user_id,a.id,a.text,a.lang as fromLang,b.lang as toLang,GROUP_CONCAT(DISTINCT b.id) AS translation_ids FROM sentence as a 
    INNER JOIN sentence_relationship as sr ON 
    (sr.sentence_id = a.id) 
    INNER JOIN sentence as b ON 
    (b.id = sr.translation_id AND a.id = sr.sentence_id) 
    INNER JOIN users as u ON 
    (u.id = a.user_id) GROUP BY a.id LIMIT 10; 

Что случилось с этим запросом?

+0

Вы всегда можете получить идентификаторы в виде отдельного запроса. – mpen

+0

Да, я мог бы, но я хочу сделать все в одном запросе. –

ответ

0

Это ваш запрос (несколько отформатирован):

SELECT u.username, a.user_id, a.id,a.text,a.lang as fromLang, b.lang as toLang, 
     GROUP_CONCAT(DISTINCT b.id) AS translation_ids 
FROM sentence a INNER JOIN 
    sentence_relationship sr 
    ON sr.sentence_id = a.id INNER JOIN 
    sentence b 
    ON b.id = sr.translation_id AND a.id = sr.sentence_id INNER JOIN 
    users as u 
    ON u.id = a.user_id 
GROUP BY a.id 
LIMIT 10; 

Неясно из вашего вопроса, является ли group_concat() был добавлен с group by. Это может замедлить работу.

limit 10 принимает первые 10 a.id s, которые соответствуют (group by делает неявный заказ). Если вы сделаете это с подзапрос, это, вероятно, ускорит запрос:

SELECT u.username, a.user_id, a.id,a.text,a.lang as fromLang, b.lang as toLang, 
     GROUP_CONCAT(DISTINCT b.id) AS translation_ids 
FROM (select s.* 
     from sentence s 
     order by a.id 
     limit 10 
    ) a INNER JOIN 
    sentence_relationship sr 
    ON sr.sentence_id = a.id INNER JOIN 
    sentence b 
    ON b.id = sr.translation_id AND a.id = sr.sentence_id INNER JOIN 
    users as u 
    ON u.id = a.user_id 
GROUP BY a.id; 

Это предполагает, что все стыки делают работу и матч записи. Если соединения используются для фильтрации, вы можете получить менее 10 строк назад.

+0

Спасибо, что ответили. Это мне очень помогло. –

+0

Я попытался создать представление с этим запросом, но представление не принимает подзапрос в выражении FROM. Мне нужен запрос с одинаковой производительностью со старым. Что мне делать? –

+0

@ HalilBİLGİN. , , Единственный способ, который я могу сделать для MySQL, - использовать два представления. Один для подзапроса и один для внешнего запроса. –