MySQL индексирование по столбцам max и min с предложением where - PullRequest
1 голос
/ 25 января 2020

У меня есть таблица, которую можно создать с помощью

CREATE TABLE 
`1m_candles` (`exchange_name` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL,
              `market_name` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL,
              `open` decimal(20,8) unsigned DEFAULT NULL,
              `high` decimal(20,8) unsigned NOT NULL,
              `low` decimal(20,8) unsigned NOT NULL,
              `close` decimal(20,8) unsigned DEFAULT NULL,
              `time` datetime NOT NULL,
              PRIMARY KEY (`exchange_name`,`market_name`,`time`),
              KEY `make_candles` (`exchange_name`, `market_name`, `time`, `high`, `low`)
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

, и я часто использую следующий запрос:

SELECT MAX(`high`), MIN(`low`) 
FROM `1mi_candles` 
WHERE exchange_name = 'BINANCE' 
  AND market_name = 'ADABTC' 
  AND `time` >= '2020-01-01 00:00:00' 
  AND `time` < '2020-01-03 00:00:00'

Я использую первичный ключ для уникального строка (exchange_name, market_name и time).

Действительно ли работает моя индексация? Это правильный способ, которым я создал ключи?

1 Ответ

2 голосов
/ 26 января 2020

Ваш PRIMARY KEY практически лучший. Добавленный KEY не добавляет к ситуации достаточно, чтобы его стоило иметь.

Наличие AUTO_INCREMENT было бы расточительным, так как у вас есть совершенно хороший «естественный» первичный ключ.

В этом приложении хорошо иметь DATETIME в уникальном (или первичном) ключе. Это, однако, предполагает, что у вас никогда не будет двух показаний для тикера в одно и то же секунда . Если вы захватываете каждую сделку, это необходимо переадресовать.

Если в таблице будет много тикеров в течение многих дней, таблица будет довольно большой. Если вас беспокоит размер таблицы, подумайте:

  • Вторичный индекс можно отбросить (как указано выше).

  • decimal(20,8) кажется излишним. Он занимает 10 байтов.

  • Обмен и market_name могут быть нормализованы в другую таблицу, заменяя их одним 3-байтовым MEDIUMINT UNSIGNED.

Имя таблицы "make_candles". Значит ли это, что вы будете рисовать «свечи»? Это означает, что вам нужен максимум, минимум, открытие и закрытие для каждой единицы времени для каждого тикера. Если для этого нужно собрать тысячу строк, чтобы получить каждую свечу, то мы должны поговорить о "сводных таблицах", чтобы получить достаточную информацию для каждой свечи. Очень легко суммировать и сворачивать максимумы, минимумы, открытия и закрытия, скажем, для каждого дня, скажем, недельного или месячного максимума, минимума, открытия и закрытия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...