2014-02-12 5 views
0

Эксперты,Повысить производительность в сумме по нескольким строкам для нескольких полей?

У меня есть sub sub запрос MySQL для выбора нескольких строк с 15 именами столбцов, соединяя две таблицы, у которых есть 4 000 000 записей, другой имеет 9000 записей.

В этом фильтре используется уникальный идентификатор в обеих таблицах, где предложение используется с использованием фильтра даты с интервалом между .. и ... date, в основном имеющим только нулевое значение. Добавленный индекс для обоих столбцов таблицы сократился на 28 сек до 17 секунд. .

140 строк, извлекаемых в этот оператор select .. В этом случае сумма для нескольких строк для нескольких полей занимала больше времени для извлечения данных. Как улучшить производительность этого запроса?

SELECT A.xs_id , 
     A.unique_id , 
     sum(A.xs_type) AS TYPE , 
     sum(A.xs_item_type) AS item_type , 
     sum(A.xs_counterno) AS counterno , 
     r.Modified_date , 
     sum(A.sent) AS sent , 
     sum(A.sent_amt) AS amount , 
     (sum(sent_amt)+sum(rec_amt)) AS total 
FROM xs_data A 
JOIN r_data r ON (r.unique_id=A.uniqueid 
        AND summ_id =1 
        AND modified_date IS NOT NULL 
        WHERE date(modified_date) BETWEEN '2012-02-12' AND '2013-01-22') 
GROUP BY date(modified_date), 
     A.xs_id, 
     A.unique_id; 
+4

Пожалуйста, внесите ваш запрос. – Prashant16

+0

привет, я добавил мой запрос и его включить также много столбцов, добавлено несколько его включенных полей count (distinct ..), также добавлены только добавленные поля сумм. – Selva

ответ

0

Если у вас есть индекс на modified_date, то запрос BETWEEN может его использовать. После того как вы поместили столбец в функцию DATE(modified_date), MySQL больше не использует индекс столбца, поэтому он должен пройти все строки (это называется полным сканированием таблицы).

Это может быть полезно использовать

WHERE `modified_date` >= '2012-02-12 00:00:00' 
    AND `modified_date` < '2013-01-23 00:00:00' 

С другой стороны EXPLAIN SELECT расскажет вам больше.

+0

привет приветствую спасибо, а измененный столбец даты имеет 70% нулевых значений есть ли какие-либо проблемы в фильтрации? – Selva

+0

Это может быть фильтрация, поскольку у вас есть миллионы строк. Это также может быть временная таблица, созданная при объединении больших таблиц. Это просто догадки. Использование EXPLAIN SELECT и, возможно, немного ПРОФИЛИНГ может намекнуть. –

+0

ya okay, я пробовал то же самое, но в группе по условию получаю очень медленные результаты. – Selva

0

Найти боль ....

Удалить группу по, удалить столбцы и сосредоточиться на объединении. Вы присоединяетесь к unique_id AND summ_id AND modified_date, поэтому мне нужен индекс с этими тремя полями. Сначала наиболее дискриминирующее поле, это, вероятно, uniqueid/unique_id.

Чтобы помочь вам сосредоточиться на объединение писать только результат объединения в временную таблицу, как:

select uniqueid 
into #temp 
from ... 

ли, что если соединить выплевывает 100k записи вы не получите столкнуться с побочными эффектами (например, если вы отправляете все эти записи в студию управления).

+0

Привет, Пол, проверял ваш запрос, но создайте темп, занимающий 15 секунд, и выберите процесс 15 секунд всего 30 секунд взяв за этот процесс ... это лучшая идея, но это так. – Selva

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