powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Нужна помощь с оптимизацией запроса (избавление от GROUP BY)
11 сообщений из 11, страница 1 из 1
Нужна помощь с оптимизацией запроса (избавление от GROUP BY)
    #39387300
poiuytrewq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день,

имеем

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
--
-- Структура таблицы `numbers`
--

CREATE TABLE IF NOT EXISTS `numbers` (
  `number` int(10) unsigned NOT NULL,
  `real_number` int(10) unsigned NOT NULL,
  `param1` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `param2` tinyint(1) unsigned NOT NULL DEFAULT '0'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Дамп данных таблицы `numbers`
--

INSERT INTO `numbers` (`number`, `real_number`, `param1`, `param2`) VALUES
(100, 0, 1, 0),
(100, 104, 1, 0),
(100, 105, 1, 0),
(101, 0, 1, 0),
(102, 0, 1, 0),
(103, 106, 1, 0);



`real_number` содержит "0", если `real_number` = `number`, или другое число, если это условие не выполняется, запрос, должен вернуть уникальные номера:

Код: sql
1.
2.
3.
4.
5.
SELECT IF(`real_number` > 0, `real_number`, `number`) AS `actual_number`
FROM `numbers`
WHERE `param1` = 1 AND `param2` = 0
GROUP BY `actual_number`
ORDER BY `actual_number` DESC



в итоге получается экстремально медленно, EXPLAIN показывает

Код: sql
1.
Using where; Using temporary; Using filesort



Насколько я понимаю, всё дело в GROUP BY, можно ли как-то от него избавиться? В том числе оптимизировав саму структуру хранения данных?
...
Рейтинг: 0 / 0
Нужна помощь с оптимизацией запроса (избавление от GROUP BY)
    #39387310
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
poiuytrewq`real_number` содержит "0", если `real_number` = `number`, или другое числоА каков смысл такого хранения? что мешает сразу в поле `real_number` хранить реальное значение, а не абстрактный ноль? кстати, тогда содержимое будет больше соответствовать названию... измените - это заодно будет и оптимизацией способа хранения данных. А заодно для конкретно этого запроса создайте индекс по (`param1`, `param2`, `real_number`).

poiuytrewqзапрос, должен вернуть уникальные номера:
Лучше использовать DISTINCT, а не группировку.
Код: sql
1.
2.
3.
4.
SELECT DISTINCT IF(`real_number` > 0, `real_number`, `number`) AS `actual_number`
FROM `numbers`
WHERE `param1` = 1 AND `param2` = 0
ORDER BY 1 DESC


Впрочем, если не внести изменений в хранение, лучше не станет.
...
Рейтинг: 0 / 0
Нужна помощь с оптимизацией запроса (избавление от GROUP BY)
    #39387312
poiuytrewq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaЛучше использовать DISTINCT, а не группировку.

А чем, собственно? Следующий запрос по-прежнему

Код: sql
1.
Using where; Using temporary; Using filesort



Код: sql
1.
2.
3.
4.
SELECT DISTINCT `real_number`
FROM `numbers`
WHERE `param1` = 1 AND `param2` = 0
ORDER BY `real_number` DESC
...
Рейтинг: 0 / 0
Нужна помощь с оптимизацией запроса (избавление от GROUP BY)
    #39387314
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
poiuytrewqСледующий запрос по-прежнему
А что Вы ещё хотите от сервера без индекса?
Текст запроса - тайна?
...
Рейтинг: 0 / 0
Нужна помощь с оптимизацией запроса (избавление от GROUP BY)
    #39387315
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Текст запроса - построен после изменения хранения и избавления от нулей?
...
Рейтинг: 0 / 0
Нужна помощь с оптимизацией запроса (избавление от GROUP BY)
    #39387481
poiuytrewq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaТекст запроса - построен после изменения хранения и избавления от нулей?

Создал индекс (`param1`, `param2`, `real_number`), теперь всё хорошо

Код: sql
1.
Using where; Using index



Но в исходной таблице таких paramN довольно много, десятка два, создавать индексы для каждой искомой комбинации?
...
Рейтинг: 0 / 0
Нужна помощь с оптимизацией запроса (избавление от GROUP BY)
    #39387524
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
poiuytrewq
Код: sql
1.
2.
GROUP BY `actual_number`
ORDER BY `actual_number` DESC

Это можно заменить на
Код: sql
1.
GROUP BY `actual_number` DESC

По идее, это будет быстрее.
...
Рейтинг: 0 / 0
Нужна помощь с оптимизацией запроса (избавление от GROUP BY)
    #39387549
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
poiuytrewqв исходной таблице таких paramN довольно много, десятка два, создавать индексы для каждой искомой комбинации?
Нет, конечно. Нужно проанализировать частоту использования параметров для отбора и селективность по ним. На те, который нужны раз в год, или которые отбирают более 10% записей, можно смело забить, а по остальным думать.
...
Рейтинг: 0 / 0
Нужна помощь с оптимизацией запроса (избавление от GROUP BY)
    #39387556
poiuytrewq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftЭто можно заменить на
Код: sql
1.
GROUP BY `actual_number` DESC

По идее, это будет быстрее.

Благодарю, но от GROUP BY вообще удалось избавиться за счёт DISTINCT
...
Рейтинг: 0 / 0
Нужна помощь с оптимизацией запроса (избавление от GROUP BY)
    #39387596
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
poiuytrewqmiksoftЭто можно заменить на
Код: sql
1.
GROUP BY `actual_number` DESC


По идее, это будет быстрее.Благодарю, но от GROUP BY вообще удалось избавиться за счёт DISTINCTЭто сугубо синтаксический сахар. Внутри оно работает все равно примерно так же (с точностью до сортировки).
...
Рейтинг: 0 / 0
Нужна помощь с оптимизацией запроса (избавление от GROUP BY)
    #39387628
poiuytrewq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
господа, обнаружил что GROUP BY заменить на DISTINCT не получится, т.к. уникальность требуется только в пределах numbers безотносительно params, есть идеи?
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Нужна помощь с оптимизацией запроса (избавление от GROUP BY)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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