Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите оптимизировать GROUP BY / 4 сообщений из 4, страница 1 из 1
26.05.2015, 18:07:42
    #38969098
meph
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать GROUP BY
Есть TableA (field1, field2, field3) ~1000 записей и TableB (field1, field2, field4, field5, field6) ~ 1000000 записей. Все поля типа varchar. В TableA Primary Index field1 + field2. В TableB ниодна из комбинаций полей не является уникальной, т.е. присутствуют дубликаты строк.

Есть запрос с группировкой, который выполняется около 10 часов из-за using temporary.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT
    TableA.field1,
    TableA.field2,
    sum(TableA.field3),
    TableB.field4,
    TableB.field5,
    sum(TableB.field6),
FROM TableA
NATURAL JOIN TableB
GROUP BY
    TableA.field1,
    TableA.field2,
    TableB.field4,
    TableB.field5;



Как можно оптимизировать сам запрос добавлением индексов или ключей? Структуру таблиц или логику самого запроса поменять не предстваляется возможным.

Моей первой идеей было добавить индекс для TableB (field1, field2, field4, field5) и изменить запрос на

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT
    TableA.field1,
    TableA.field2,
    sum(TableA.field3),
    TableB.field4,
    TableB.field5,
    sum(TableB.field6),
FROM TableA
NATURAL JOIN TableB
GROUP BY
    TableB.field1,
    TableB.field2,
    TableB.field4,
    TableB.field5;



К сожалению, анализатор этот индекс использовать не стал.

Результат Explain:
Код: plsql
1.
2.
1	SIMPLE	TableA	index	PRIMARY	        PRIMARY	124	null	                216	Using index; Using temporary; Using filesort
1	SIMPLE	TableB	ref	<indexes list>	field2  	30	TableA.field2	914	Using where
...
Рейтинг: 0 / 0
26.05.2015, 18:19:23
    #38969113
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать GROUP BY
mephМоей первой идеей было добавить индекс для TableB (field1, field2, field4, field5)
Достаточно индекса TableB (field1, field2) - он сможет использоваться при связывании.

mephизменить запрос на
Тогда уж и таблицы во WHERE поменяй местами.

mephВсе поля типа varchar.
...
Код: plsql
1.
2.
3.
4.
5.
SELECT
...
    sum(TableA.field3),
...
    sum(TableB.field6),



Ага... сумма по варчарам - это не только сильно, но и умно.
...
Рейтинг: 0 / 0
26.05.2015, 19:30:11
    #38969179
meph
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать GROUP BY
AkinaДостаточно индекса TableB (field1, field2) - он сможет использоваться при связывании.

Спасибо за совет, это вполне разумно, и работает мгновенно, если нет группировки.

Результат Explain улучшился, теперь для TableB используется индекс field1, field2 и значение rows упало до 338. Однако итоговое
216*338 довольно велико и Copying To Tmp Table по-прежнему занимает довольно много времени. Мне кажется, что единственным вариантом ускорить этот запрос, является изменение логики или создание промежуточной таблицы.

AkinaТогда уж и таблицы во WHERE поменяй местами.

В смысле в JOIN, тут же нет WHERE ? Я пробовал и это, но оптимизатор сам решает, какую из таблиц использовать первой.

AkinaАга... сумма по варчарам - это не только сильно, но и умно.

Извините, конечно сам запрос немного сложнее, я привел его немного к более читаемому виду и забыл отредактировать эту часть. Давайте жить дружно )
...
Рейтинг: 0 / 0
28.05.2015, 05:40:32
    #38970299
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать GROUP BY
meph,

попробуйте сделать ОТДЕЛЬНЫЕ селекты
в обоих таблицас с груб БУ по фиелд1,фиелд2
а потом джоините результат, типа:

селецкт Ф1, Ф2, СУМ(СФ3), Ф4, Ф5, СУМ(СФ6)
Фром
(
селецт Ф1, Ф2, сум(Ф3) СФ3
фром Т1
гроуп бу Ф1, Ф2
) А1
Жоин в натуре!
(селецт Ф1, Ф2,Ф4, Ф5, СФ6
Фром Т2
гроуп бы Т2.Ф1, Т2.Ф2) А2
гроуп бы Ф1, Ф2, Ф4, Ф5


вообше мне чтото не нравится СУМ(СФ3)...
надо бы проверить правильность расчетов....
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите оптимизировать GROUP BY / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]