(вопросы производительности запросов MySQL) Индексирование большой базы данных по историческим ценам - PullRequest
0 голосов
/ 31 декабря 2018

это может быть тривиальным вопросом для некоторых из вас, но я не нашел / не понял решение следующей проблемы:

У меня большая база данных объемом 60 ГБ c, структурированная следующим образом:

| Field      | Type     | Null | Key | Default | Extra |
+------------+----------+------+-----+---------+-------+
| date       | datetime | YES  | MUL | NULL    |       |
| chgpct1d   | double   | YES  |     | NULL    |       |
| pair       | text     | YES  |     | NULL    |       |

В базе данных хранятся последние 10 лет ежедневных процентных изменений для 200 000 различных парных сделок.Таким образом, ни дата, ни пара не являются уникальными ключами (комбинация дата + пара будет).Имеется c 2600 различных записей даты и c 200k различных пар, которые генерируют> 520 строк MM.

Следующий запрос занимает c несколько минут, чтобы вернуть результат.

SELECT date, chgpct1d, pair FROM db WHERE date = '2018-12-20';

Что я могу сделатьускорить процесс?

Я читал об индексах с несколькими столбцами, но я не уверен, поможет ли это в моем случае, учитывая, что все WHERE-запросы будут указывать только на «дату».поле.

1 Ответ

0 голосов
/ 01 января 2019

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

Две вещи:

  1. Создать индекс по этим столбцам: (date, chgpct1d, pair).
  2. Поскольку столбец с именем date имеет тип данных DATETIME, он может содержать такие значения, как 2018-12-20 10:17:20.Когда вы говорите WHERE date = '2018-12-20', это на самом деле означает WHERE date = '2018-12-20 00:00:00'.Таким образом, используйте это вместо

    WHERE date >= '2018-12-20'
      AND date <  '2018-12-21`
    

Это будет захватывать все значения date в любое время в выбранную вами дату.

Почему это помогает?Поскольку ваш многоколонный индекс начинается с date, MySQL может выполнить сканирование диапазона по нему, используя имеющийся оператор WHERE.И, поскольку индекс содержит все необходимое для вашего запроса, серверу баз данных не нужно искать где-либо еще, но он может удовлетворить запрос непосредственно из индекса.Этот индекс, как говорят, покрывает запрос.

Обратите внимание, что с половиной гигару в вашей таблице создание индекса займет некоторое время.Сделай это на ночь или еще что-нибудь.

...