powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вопрос про Distinct и ресурсы
20 сообщений из 20, страница 1 из 1
Вопрос про Distinct и ресурсы
    #38909819
maverik-svao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
У меня есть простенький сервачок из системника, 4х ядерный AMD 2,6 и 8 гБ Озу. На нем стоит ubuntu и использую я его только под MySQL.
У меня несколько таблиц такой структуры:
NameN (CHAR (10)), ColN (CHAR (10)), Param (CHAR (5)).
Это "разворот" таблицы из примерно 1000 NameN по вертикали и примерно 1000000 ColN по горизонтали. Каждое пересечение - значение.
Весит каждая таблица несколько гБ. Используются они редко, чаще всего запрос из серии NameI - ColI. Естественно индексы я ставлю по обеим колонкам.
Иногда (раз в сутки, вручную) мне требуется выполнить запрос:
Select Distinct(NameN), Count(ColN) FROM TABLE GROUP BY NameN.
И вот тут начинаются проблемы.
Сервер пытается взять всю таблицу в оперативку и зависает.
Грубо говоря, если колонок и имен мало, то это работает быстро.
Explain выдает Using Temporary, Using Filesort.
Да, движок InnoDB, в my.cnf внесено что размер озу для innodb 6G, предел кэша - 1G.

Как ускорить вышеуказанный запрос?
Выполнение 1-2 минуты такого запроса нормальное, сейчас он выполняется примерно 1,5 часа (!) при объеме 500 000 х 400 = 20 000 000 строк.
Да, на машине с Oracle (проц похожий, 64гБ ОЗУ) выполняется те самые 1-2 минуты. Если строк под 100 миллионов, то 5 минут.

Какое железо вообще должно быть под такую БД.
...
Рейтинг: 0 / 0
Вопрос про Distinct и ресурсы
    #38909840
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maverik-svaoЕстественно индексы я ставлю по обеим колонкам.Напрасно...

maverik-svaoИногда (раз в сутки, вручную) мне требуется выполнить запрос:
Код: sql
1.
Select Distinct(NameN), Count(ColN) FROM TABLE GROUP BY NameN.


После GROUP BY значение поля NameN уже уникально. DISTINCT не имеет смысла.
...
Рейтинг: 0 / 0
Вопрос про Distinct и ресурсы
    #38909869
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maverik-svao,

Поле ColN может быть NULL?
А вообще покажите лучше DDL целиком.
...
Рейтинг: 0 / 0
Вопрос про Distinct и ресурсы
    #38909984
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maverik-svao,

Код: sql
1.
2.
3.
Select NameN, Count(ColN) 
FROM TABLE 
GROUP BY NameN



авторКак ускорить вышеуказанный запрос?

Да никак. Тут нет фильтра, поэтому группируется вся таблица.

В лучшем случае нужно создать индекс по NameN, чтобы группировке не нужно было сортировать данные,
но всё равно обрабатывается ВСЯ таблица,

1000 NameN по вертикали * 1,000,000 ColN = 1,000,000,000 записей (миллиард).

Какую ещё скорость ты хочешь от этого запроса -- не понятно.

Зачем тебе вся тыща NameN сразу -- тоже не понятно.
И откуда у тебя миллион (!) колонок -- не понятно совсем.
...
Рейтинг: 0 / 0
Вопрос про Distinct и ресурсы
    #38909997
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv1000 NameN по вертикали * 1,000,000 ColN = 1,000,000,000 записей (миллиард).Сфига? у него тупо EAV-like таблица, лям записей, 1к уникальных категорий.
...
Рейтинг: 0 / 0
Вопрос про Distinct и ресурсы
    #38910015
maverik-svao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Таблица такая
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE illness.BANK_CVD55 (
  PERSON_ID char(50) NOT NULL,
  SNP char(50) NOT NULL,
  AB char(5) NOT NULL,
  INDEX CVD55_PERSON_ID (PERSON_ID),
  INDEX CVD55_SNP (SNP)
)
ENGINE = INNODB
CHARACTER SET utf8
COLLATE utf8_general_ci;

Ну это "рулон" поля с клеточками, где по горизонтали люди (1000 человек), по вертикали параметры (1миллион), на пересечениях значения.
Иногда значений не бывает, тогда такая тройка пропущена.
Для того, чтобы понять, есть ли такие пропуски я и пользуюсь тем запросом:
Код: sql
1.
Select distinct(PERSON_ID), COUNT(SNP) FROM BANK_CVD55 GROUP BY PERSON_ID
...
Рейтинг: 0 / 0
Вопрос про Distinct и ресурсы
    #38910025
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maverik-svao,

Перепишите запрос так:
Код: sql
1.
Select PERSON_ID, COUNT(*) FROM BANK_CVD55 GROUP BY PERSON_ID

И покажите план этого запроса.

P.S. Уже не первый раз вижу бессмысленную конструкцию distinct(PERSON_ID). Откуда вы ее берете?
...
Рейтинг: 0 / 0
Вопрос про Distinct и ресурсы
    #38910040
maverik-svao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

BANK_CVD55 1 SIMPLE index CVD55_PERSON_ID 153 25748507 Using index
...
Рейтинг: 0 / 0
Вопрос про Distinct и ресурсы
    #38910042
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maverik-svaoТаблица такая
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE illness.BANK_CVD55 (
  PERSON_ID char(50) NOT NULL,
  SNP char(50) NOT NULL,
  AB char(5) NOT NULL,
  INDEX CVD55_PERSON_ID (PERSON_ID),
  INDEX CVD55_SNP (SNP)
)
ENGINE = INNODB
CHARACTER SET utf8
COLLATE utf8_general_ci;

Ну это "рулон" поля с клеточками, где по горизонтали люди (1000 человек), по вертикали параметры (1миллион), на пересечениях значения.
Иногда значений не бывает, тогда такая тройка пропущена.
Для того, чтобы понять, есть ли такие пропуски я и пользуюсь тем запросом:
Код: sql
1.
Select distinct(PERSON_ID), COUNT(SNP) FROM BANK_CVD55 GROUP BY PERSON_ID




Сколько записей в ней ?

Код: sql
1.
select count(*) from illness.BANK_CVD55;
...
Рейтинг: 0 / 0
Вопрос про Distinct и ресурсы
    #38910050
maverik-svao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv
Сколько записей в ней ?

Код: sql
1.
select count(*) from illness.BANK_CVD55;



25823444
...
Рейтинг: 0 / 0
Вопрос про Distinct и ресурсы
    #38910054
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maverik-svaomiksoft,

BANK_CVD55 1 SIMPLE index CVD55_PERSON_ID 153 25748507 Using indexА быстрее-то стало?

И, кстати, зачем вам тип char ? более компактный тип нельзя использовать?
...
Рейтинг: 0 / 0
Вопрос про Distinct и ресурсы
    #38910152
maverik-svao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

более компактный - varchar? А разве он не удиняет запрос?
...
Рейтинг: 0 / 0
Вопрос про Distinct и ресурсы
    #38910189
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maverik-svaoТаблица такаяЁпрст! а почему PERSON_ID имеет тип char(50)? неужели нет таблицы пёрсонов, где есть нормальный чисельный ключ? Да и SNP тоже выволочь бы в отдельную таблицу. И получится нормально работающая компактная структура...
...
Рейтинг: 0 / 0
Вопрос про Distinct и ресурсы
    #38910236
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maverik-svaomiksoft,

более компактный - varchar?VARCHAR или INT, смотря какие данные внутри реально хранятся.maverik-svao А разве он не удиняет запрос?Тип поля разве как-то влияет на длину запроса?
...
Рейтинг: 0 / 0
Вопрос про Distinct и ресурсы
    #38910241
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaДа и SNP тоже выволочь бы в отдельную таблицу.Это как? Если делать нормально, то SNP должен входить в первичный ключ.

Кстати, отсутствие явного первичного ключа утяжеляет таблицу, если не ошибаюсь, еще на 6 байт на запись.
...
Рейтинг: 0 / 0
Вопрос про Distinct и ресурсы
    #38910244
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftAkinaДа и SNP тоже выволочь бы в отдельную таблицу.Это как?А, понял, как справочник.
...
Рейтинг: 0 / 0
Вопрос про Distinct и ресурсы
    #38910436
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akinamaverik-svaoТаблица такаяЁпрст! а почему PERSON_ID имеет тип char(50)? неужели нет таблицы пёрсонов, где есть нормальный чисельный ключ? Да и SNP тоже выволочь бы в отдельную таблицу. И получится нормально работающая компактная структура...

Да это мелочи всё, по сравнению с тем, что он обрабатывает 26 миллионов строк.
...
Рейтинг: 0 / 0
Вопрос про Distinct и ресурсы
    #38910443
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maverik-svaoMasterZivСколько записей в ней ?

Код: sql
1.
select count(*) from illness.BANK_CVD55;



25823444

Сколько записей на одно PERSON_ID ?
Поровну, по 26 тыщ записей ?

Тогда ПО ТРЕБОВАНИЮ бери и выполняй этот запрос ДЛЯ ОДНОГО PERSON_ID.

Естественно, нужно создать индекс для этого по PERSON_ID, если его ещё нет.


Кстати:

Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE illness.BANK_CVD55 (
  PERSON_ID char(50) NOT NULL,
  SNP char(50) NOT NULL,
  AB char(5) NOT NULL,
  INDEX CVD55_PERSON_ID (PERSON_ID),
  INDEX CVD55_SNP (SNP)
)



должен быть первичный ключ по (PERSON_ID, SNP, AB)
Где он ?
...
Рейтинг: 0 / 0
Вопрос про Distinct и ресурсы
    #38910455
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivдолжен быть первичный ключ по (PERSON_ID, SNP, AB)C таким первичным ключом и таблицы не надо...
...
Рейтинг: 0 / 0
Вопрос про Distinct и ресурсы
    #38910459
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaMasterZivдолжен быть первичный ключ по (PERSON_ID, SNP, AB)C таким первичным ключом и таблицы не надо...


Ну если он InnoDB будет использовать, он всё равно кластерным будет, так что таблица и ключ -- будет одно и то же.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вопрос про Distinct и ресурсы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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