2012-06-05 3 views
0

Я работаю с довольно большой базой данных, в которой каждая строка имеет определенный класс. Каждый класс, в свою очередь, принадлежит обобщенному классу, который указан в отдельной таблице. Итак, чтобы найти обобщенный класс элемента, необходимо выполнить JOIN.Эффективное вычисление количества результатов по диапазону в сгруппированном SQL-запросе

Кроме того, один из столбцов содержит определенное числовое значение, например 'w'. Я пытаюсь найти эффективный запрос, который дает количество элементов в определенном диапазоне «w», сгруппированных по обобщенному классу. Так, например, одна из строк результата дал бы данные о количестве элементов в этом классе с ж < 500, 500 < < весом 1500 и ш> 1500.

Прямо сейчас, я использую уже существующий представление, которое уже объединяет обобщенный класс в результирующий набор, так что нет необходимости в JOIN в конечном запросе. Этот окончательный запрос использует трюк, который я нашел here, чтобы рассчитать количество элементов в определенном диапазоне.

SELECT generalized_class, 
    SUM(IF(w BETWEEN 1 AND 500, 1, 0)) AS low, 
    SUM(IF(w BETWEEN 500 AND 1500, 1, 0)) AS middle, 
    SUM(IF(w > 1500, 1, 0)) AS high 
FROM table_vw 
GROUP BY generalized_class 

Однако я не совсем уверен, является ли это наиболее эффективным способом его осуществления. Поскольку база данных достаточно велика, для ее завершения требуется всего пять минут. Я полагаю, что вычисление такого рода вещей - дорогостоящая операция в целом, но мне просто интересно, могу ли я использовать другой подход, который бы удалял некоторую нагрузку. Кто угодно?

-edit- Определение точки зрения ничего особенного, это что-то вроде

CREATE VIEW table_vw AS SELECT d.id, d.class, c.generalized_class, <more fields>, 
(w_high/w_low)/2 AS w 
FROM base_table d 
LEFT OUTER JOIN secondary_table c 
    ON (d.class = c.class) 

Я уверен, что есть еще один левый внешнее соединение делается для другой таблицы, но нет строки из этой таблицы (как я уже сказал, это уже существовавший вид, поэтому в нем много материала, не предназначенного для этого запроса). Класс объединения «класс» индексируется только во вторичной таблице.

+0

Каков запрос вида, который вы используете в настоящее время? Какова структура и индексы таблиц, к которым вы присоединяетесь, и что говорит текущий план объяснения? – Ben

+0

Просьба изложить определения viwe и его основных таблиц. – Quassnoi

ответ

1

Причина, по которой ваш запрос занимает много времени, может заключаться в том, что он неправильно использует индексы (или вообще не использует их!). Используйте EXPLAIN, чтобы узнать, как MySQL выполняет ваш запрос.
http://dev.mysql.com/doc/refman/5.5/en/explain.html

Другой причиной может быть то, что MySQL сначала вычисляет весь результат представления, а затем использует, что для вычисления результата всего запроса.
В этом случае решением было бы объединить определение вида с вашим запросом.

+0

Мне удалось получить некоторое ускорение, сняв несколько лишних полей из представления, но это все еще занимает много времени. Насколько я вижу из вывода EXPLAIN, индексирование вряд ли решит проблему. Есть ли другой способ реструктуризации или оптимизации? – JorenB

Смежные вопросы