2014-10-15 3 views
0

У меня есть база данных с двумя таблицами:HTSQL сгенерированный запрос MySQL чрезвычайно медленный

прилагательные - первичный ключ ID; NAME varchar; adjectives_reviews - первичный ключ ID; Внешний ключ ADJECTIVE_ID; Внешний ключ REVIEW_ID; COUNT int

Я хочу получить список различных ADJECTIVE_ID от adjectives_reviews с суммой значений в столбце «COUNT» по всем строкам с тем же ADJECTIVE_ID.

Таблица прилагательных насчитывает 46 000 строк, а прилагательные_объекты имеют ~ 2,849,708.

Я использую следующий запрос: HTSQL

/adjectives{name,sum(adjectives_reviews.count)}

, который транслируется в SQL:

SELECT `adjectives`.`name`, 
     COALESCE(`adjectives_reviews`.`sum`, 0) 
FROM `adjectives` 
    LEFT OUTER JOIN (SELECT CAST(SUM(`adjectives_reviews`.`count`) AS SIGNED INTEGER) AS `sum`, 
          `adjectives_reviews`.`adjective_id` 
         FROM `adjectives_reviews` 
         GROUP BY 2) AS `adjectives_reviews` 
        ON (`adjectives`.`id` = `adjectives_reviews`.`adjective_id`) 
ORDER BY `adjectives`.`id` ASC 

Этот запрос дает результат, который я хочу, но он слишком медленный. На самом деле это так медленно, что HTTP-сервер отключается, и я не могу получить выходной CSV-файл, который мне нужен. Я ищу способ оптимизировать этот запрос или, альтернативно, способ получить результат как CSV без использования HTTP-интерфейса HTSQL.

ответ

0

Я был в состоянии получить результат, как CSV, используя собственный клиент MySQL и добавить 3 строки запроса:

SELECT `adjectives`.`name`, 
     COALESCE(`adjectives_reviews`.`sum`, 0) 
FROM `adjectives` 
    LEFT OUTER JOIN (SELECT CAST(SUM(`adjectives_reviews`.`count`) AS SIGNED INTEGER) AS `sum`, 
          `adjectives_reviews`.`adjective_id` 
         FROM `adjectives_reviews` 
         GROUP BY 2) AS `adjectives_reviews` 
        ON (`adjectives`.`id` = `adjectives_reviews`.`adjective_id`) 
ORDER BY `adjectives`.`id` ASC 
INTO OUTFILE '/tmp/adjectives.csv' 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 

Он бежал достаточно быстро.