powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Скорость выполнения запроса (Большая таблица)
25 сообщений из 30, страница 1 из 2
Скорость выполнения запроса (Большая таблица)
    #39708844
8POWER-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Есть 1 большая таблица, в которой сейчас записей 17млн. Будет 200 млн записей через пару дней, когда мы зальем остальную информацию. В дальнейшем в день таблица будет пополняться на 700к записей.

p1-p9 - это игрок в карты, который может сидеть на разном месте в раздаче за столом.
psd и pp - просто статы, как сыграл.
handLimit - лимит раздачи.

Нужно доставать информацию настолько быстро, на сколько это возможно. В таблице есть составной индекс p*_handLimit , чаще всего выборка будет работать именно по p* + handLimit , но если попытаться выбрать все записи с игроком, то запрос уже сейчас занимает 1.25с. Т.е. в будущем запрос может длиться и 5+ секунд.
Игрок записан в mediumint 3 байта.

Сам запрос:
авторSELECT `id`, `currency`, `pp1` AS `profit`, `psd1` AS `isSD`, `handLimit` FROM `ps_hands` WHERE `p1` = '9121'
UNION ALL (SELECT `id`, `currency`, `pp2` AS `profit`, `psd2` AS `isSD`, `handLimit` FROM `ps_hands` WHERE `p2` = '9121')
UNION ALL (SELECT `id`, `currency`, `pp3` AS `profit`, `psd3` AS `isSD`, `handLimit` FROM `ps_hands` WHERE `p3` = '9121')
UNION ALL (SELECT `id`, `currency`, `pp4` AS `profit`, `psd4` AS `isSD`, `handLimit` FROM `ps_hands` WHERE `p4` = '9121')
UNION ALL (SELECT `id`, `currency`, `pp5` AS `profit`, `psd5` AS `isSD`, `handLimit` FROM `ps_hands` WHERE `p5` = '9121')
UNION ALL (SELECT `id`, `currency`, `pp6` AS `profit`, `psd6` AS `isSD`, `handLimit` FROM `ps_hands` WHERE `p6` = '9121')
UNION ALL (SELECT `id`, `currency`, `pp7` AS `profit`, `psd7` AS `isSD`, `handLimit` FROM `ps_hands` WHERE `p7` = '9121')
UNION ALL (SELECT `id`, `currency`, `pp8` AS `profit`, `psd8` AS `isSD`, `handLimit` FROM `ps_hands` WHERE `p8` = '9121')
UNION ALL (SELECT `id`, `currency`, `pp9` AS `profit`, `psd9` AS `isSD`, `handLimit` FROM `ps_hands` WHERE `p9` = '9121')
ORDER BY `id` ASC
Использую юнион, Потому что обычный OR OR OR ... медленнее на 30%. Движок MyISAM , важен только селект и инсерт.
Апдейтов никогда не будет, а заноситься значения будут раз в день 1 минуту по времени.
my.cnf настроен не знаю как, пару лет назад что-то там пытался, таким он и остался.
Серверная машина - 128гб оперы, 16 потоков 8 ядер.
И соответственно EXPLAIN запроса и стуктуру таблицы приложил в изображениях:

...
Рейтинг: 0 / 0
Скорость выполнения запроса (Большая таблица)
    #39708848
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
8POWER-,

Покажите нормальный DDL таблицы текстом. Разглядывать мелкий мутный jpeg не очень-то хочется.
...
Рейтинг: 0 / 0
Скорость выполнения запроса (Большая таблица)
    #39708850
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще таблица просится на "разворот" в вертикаль и на отделение результатов игроков в отдельную таблицу. Тогда всех этих UNION ALL-ов будет не нужно. И индекс будет нужен один вместо девяти.
...
Рейтинг: 0 / 0
Скорость выполнения запроса (Большая таблица)
    #39708852
8POWER-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Упс, это старая таблица. Прошу прощения. Вот новая

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
CREATE TABLE `ps_hands` (
  `id` bigint(14) NOT NULL DEFAULT '0',
  `roomId` tinyint(1) NOT NULL DEFAULT '0',
  `currency` varchar(1) NOT NULL,
  `handLimit` float(8,2) NOT NULL DEFAULT '0.00',
  `date` date NOT NULL,
  `maxPlayers` int(1) NOT NULL,
  `text` text,
  `p1` mediumint(7) NOT NULL DEFAULT '0',
  `p2` mediumint(7) NOT NULL DEFAULT '0',
  `p3` mediumint(7) NOT NULL DEFAULT '0',
  `p4` mediumint(7) NOT NULL DEFAULT '0',
  `p5` mediumint(7) NOT NULL DEFAULT '0',
  `p6` mediumint(7) NOT NULL DEFAULT '0',
  `p7` mediumint(7) NOT NULL DEFAULT '0',
  `p8` mediumint(7) NOT NULL DEFAULT '0',
  `p9` mediumint(7) NOT NULL DEFAULT '0',
  `pp1` float(8,2) NOT NULL,
  `pp2` float(8,2) NOT NULL,
  `pp3` float(8,2) NOT NULL,
  `pp4` float(8,2) NOT NULL,
  `pp5` float(8,2) NOT NULL,
  `pp6` float(8,2) NOT NULL,
  `pp7` float(8,2) NOT NULL,
  `pp8` float(8,2) NOT NULL,
  `pp9` float(8,2) NOT NULL,
  `psd1` tinyint(1) NOT NULL,
  `psd2` tinyint(1) NOT NULL,
  `psd3` tinyint(1) NOT NULL,
  `psd4` tinyint(1) NOT NULL,
  `psd5` tinyint(1) NOT NULL,
  `psd6` tinyint(1) NOT NULL,
  `psd7` tinyint(1) NOT NULL,
  `psd8` tinyint(1) NOT NULL,
  `psd9` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `maxPlayers` (`maxPlayers`),
  KEY `currency` (`currency`) USING BTREE,
  KEY `p1_handLimit` (`p1`,`handLimit`),
  KEY `p2_handLimit` (`p2`,`handLimit`),
  KEY `p3_handLimit` (`p3`,`handLimit`),
  KEY `p4_handLimit` (`p4`,`handLimit`),
  KEY `p5_handLimit` (`p5`,`handLimit`),
  KEY `p6_handLimit` (`p6`,`handLimit`),
  KEY `p7_handLimit` (`p7`,`handLimit`),
  KEY `p8_handLimit` (`p8`,`handLimit`),
  KEY `p9_handLimit` (`p9`,`handLimit`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT
...
Рейтинг: 0 / 0
Скорость выполнения запроса (Большая таблица)
    #39708854
8POWER-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftВообще таблица просится на "разворот" в вертикаль и на отделение результатов игроков в отдельную таблицу. Тогда всех этих UNION ALL-ов будет не нужно. И индекс будет нужен один вместо девяти.
Честно? Я не представляю как это реализовать :( Пытаюсь, но пока не получается.
...
Рейтинг: 0 / 0
Скорость выполнения запроса (Большая таблица)
    #39708856
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
8POWER-,

Помимо предыдущего замечания:
Вы уверены, что нужно использовать именно float? 4 байта как-никак...
...
Рейтинг: 0 / 0
Скорость выполнения запроса (Большая таблица)
    #39708859
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
8POWER-miksoftВообще таблица просится на "разворот" в вертикаль и на отделение результатов игроков в отдельную таблицу. Тогда всех этих UNION ALL-ов будет не нужно. И индекс будет нужен один вместо девяти.
Честно? Я не представляю как это реализовать :( Пытаюсь, но пока не получается.одна запись в таблицу партий и 9 записей в таблицу игроков-партий.
...
Рейтинг: 0 / 0
Скорость выполнения запроса (Большая таблица)
    #39708860
8POWER-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft8POWER-,

Помимо предыдущего замечания:
Вы уверены, что нужно использовать именно float? 4 байта как-никак...
Смотрите, я вчера думал о том, чтобы урезать handLimit с флоат до smaillint , итого экономлю 2 байта * строки.
Возможно так и поступлю, а умножать на 100 буду в пхп.

Но, профит как использовать не флоат? Если допустим писать в центах вместо 1.01 , понимаю, но если игрок выиграл 150000$ , это я не преувеличил, действительно в день есть больше 50 выигрышей от 80к+$. То тогда не влезет запись и все равно придется 4 байта уже отдавать(
...
Рейтинг: 0 / 0
Скорость выполнения запроса (Большая таблица)
    #39708867
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
8POWER-Но, профит как использовать не флоат? Если допустим писать в центах вместо 1.01 , понимаю, но если игрок выиграл 150000$ , это я не преувеличил, действительно в день есть больше 50 выигрышей от 80к+$. То тогда не влезет запись и все равно придется 4 байта уже отдавать(Даже в этом случае float плохой выбор, если не хотите потом удивляться, почему у вас 0.1+0.1=0.19999..., а не 0.2.
Для денег лучше использовать либо более приспособленные типы, например, DECIMAL, либо целочисленные в нужном масштабе.
Для масштаба 0.01 ... 150000 хватит типа MEDIUMINT, правда, без запаса. INT - с запасом.
...
Рейтинг: 0 / 0
Скорость выполнения запроса (Большая таблица)
    #39708869
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что такое psd1-9 и зачем их столько?
currency явно просится tinyint, да и вообще, нужно ли это поле?
...
Рейтинг: 0 / 0
Скорость выполнения запроса (Большая таблица)
    #39708871
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
SELECT `id`, `currency`, `pp1` AS `profit`, `psd1` AS `isSD`, `handLimit` FROM `ps_hands` WHERE `p1` = '9121'

отдельно этот фрагмент за какое время выполняется?
...
Рейтинг: 0 / 0
Скорость выполнения запроса (Большая таблица)
    #39708872
8POWER-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft8POWER-Но, профит как использовать не флоат? Если допустим писать в центах вместо 1.01 , понимаю, но если игрок выиграл 150000$ , это я не преувеличил, действительно в день есть больше 50 выигрышей от 80к+$. То тогда не влезет запись и все равно придется 4 байта уже отдавать(Даже в этом случае float плохой выбор, если не хотите потом удивляться, почему у вас 0.1+0.1=0.19999..., а не 0.2.
Для денег лучше использовать либо более приспособленные типы, например, DECIMAL, либо целочисленные в нужном масштабе.
Для масштаба 0.01 ... 150000 хватит типа MEDIUMINT, правда, без запаса. INT - с запасом.
Да судя по mysql.com, mediumint хватит в Maximum Unsigned value , а это не вредно? Я обычно по Maximum Value ориентировался. сейчас посмотрю какие максимальные выигрыши были за 17млн.
Про 0.1 + 0.1 - уже удивлялись, поэтому округляли и качали bmath для php , mysql - javascript #2 :D
...
Рейтинг: 0 / 0
Скорость выполнения запроса (Большая таблица)
    #39708874
8POWER-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft
Код: sql
1.
SELECT `id`, `currency`, `pp1` AS `profit`, `psd1` AS `isSD`, `handLimit` FROM `ps_hands` WHERE `p1` = '9121'

отдельно этот фрагмент за какое время выполняется?

SELECT SQL_NO_CACHE `id`, `currency`, `pp1` AS `profit`, `psd1` AS `isSD`, `handLimit` FROM `ps_hands` WHERE `p1` = '9121' Total execution time in seconds: 0.11549305915833

Если в кеше запрос - то 0.02
...
Рейтинг: 0 / 0
Скорость выполнения запроса (Большая таблица)
    #39708875
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
8POWER-,

И еще - план показывает оценку порядка 300 тысяч записей в результате (сумма колонки rows). Вам точно нужны все эти записи? Да еще в отсортированном виде?
...
Рейтинг: 0 / 0
Скорость выполнения запроса (Большая таблица)
    #39708878
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
8POWER-Да судя по mysql.com, mediumint хватит в Maximum Unsigned value , а это не вредно?Не понял, что именно может быть вредно? Либо вам хватает диапазона и точности, либо нет.
Диапазоны целочисленных типов .
...
Рейтинг: 0 / 0
Скорость выполнения запроса (Большая таблица)
    #39708881
8POWER-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft8POWER-,

И еще - план показывает оценку порядка 300 тысяч записей в результате (сумма колонки rows). Вам точно нужны все эти записи? Да еще в отсортированном виде?

Да, нужно получать все данные, если пользователь указал фильтр за всё время, сортировка так же нужна для построения графика.
...
Рейтинг: 0 / 0
Скорость выполнения запроса (Большая таблица)
    #39708882
8POWER-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft8POWER-Да судя по mysql.com, mediumint хватит в Maximum Unsigned value , а это не вредно?Не понял, что именно может быть вредно? Либо вам хватает диапазона и точности, либо нет.
Диапазоны целочисленных типов .

Не подходит unsigned, так как профит игрока может быть отрицательным.
...
Рейтинг: 0 / 0
Скорость выполнения запроса (Большая таблица)
    #39708884
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
8POWER-Не подходит unsigned, так как профит игрока может быть отрицательным.Тогда INT или DECIMAL. Но все равно не FLOAT.
...
Рейтинг: 0 / 0
Скорость выполнения запроса (Большая таблица)
    #39708886
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
8POWER-miksoft8POWER-,

И еще - план показывает оценку порядка 300 тысяч записей в результате (сумма колонки rows). Вам точно нужны все эти записи? Да еще в отсортированном виде?

Да, нужно получать все данные, если пользователь указал фильтр за всё время, сортировка так же нужна для построения графика.С этим надо что-то делать. Никакой пользователь не будет читать сотни тысяч записей и никакой экран не покажет график из сотен тысяч точек.
Либо отказывать пользователю в таком запросе, либо показывать предагрегированные данные, либо что-то еще.
...
Рейтинг: 0 / 0
Скорость выполнения запроса (Большая таблица)
    #39708891
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
8POWER-,

Показанный запрос - единственный тип запросов, которые будут выполняться или есть и другие?
...
Рейтинг: 0 / 0
Скорость выполнения запроса (Большая таблица)
    #39708894
8POWER-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft8POWER-пропущено...


Да, нужно получать все данные, если пользователь указал фильтр за всё время, сортировка так же нужна для построения графика.С этим надо что-то делать. Никакой пользователь не будет читать сотни тысяч записей и никакой экран не покажет график из сотен тысяч точек.
Либо отказывать пользователю в таком запросе, либо показывать предагрегированные данные, либо что-то еще.

Мы не отдаём пользователю все точки, однако нам они нужны чтобы подсчитать каждую и вывести ему график со всеми результатами.
Данные разделяются на 1 тысячу точек, а при приближении любой части графика - рендерятся новые точки.
К тому же пользователь запрашивает даже не 300тыс. записей, а может и 2млн запросить, если у оппонента наиграно столько рук и ему нужна статистика за все время.. А в 90% случаях нужна.
...
Рейтинг: 0 / 0
Скорость выполнения запроса (Большая таблица)
    #39708896
8POWER-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft8POWER-,
Показанный запрос - единственный тип запросов, которые будут выполняться или есть и другие?
Только такой тип.
...
Рейтинг: 0 / 0
Скорость выполнения запроса (Большая таблица)
    #39708904
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
8POWER-Мы не отдаём пользователю все точки, однако нам они нужны чтобы подсчитать каждую и вывести ему график со всеми результатами.
Данные разделяются на 1 тысячу точек, а при приближении любой части графика - рендерятся новые точки.Вполне вероятно, что вам помогут предагрегаты. Если, конечно, возможно заранее как-то определить интервалы группировки.
...
Рейтинг: 0 / 0
Скорость выполнения запроса (Большая таблица)
    #39708906
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
8POWER-miksoft8POWER-,
Показанный запрос - единственный тип запросов, которые будут выполняться или есть и другие?
Только такой тип.Тогда я бы попробовал разделить таблицу на две, как писал выше - 21687504 .
И, возможно, перейти на InnoDB. Он может быть быстрее при выборке по первичному ключу.
Но, конечно, нужно делать тесты.
...
Рейтинг: 0 / 0
Скорость выполнения запроса (Большая таблица)
    #39708907
8POWER-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft8POWER-пропущено...

Только такой тип.Тогда я бы попробовал разделить таблицу на две, как писал выше - 21687504 .
И, возможно, перейти на InnoDB. Он может быть быстрее при выборке по первичному ключу.
Но, конечно, нужно делать тесты.
Хорошо, спасибо
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Скорость выполнения запроса (Большая таблица)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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