использует выражение where в моем индексированном столбце для получения диапазона данных, что делает запрос быстрее - PullRequest
0 голосов
/ 08 ноября 2019

У меня 200 миллионов строк даты, где они проиндексированы в столбце с именем date.

Я пытаюсь перевести таблицу в python с помощью pymysql, чтобы я мог проанализировать.

Имеет ли гдепредложение, чтобы получить меньший кусок данных, занимает больше времени, чем получение всех данных?

Вот мой запрос:

query = """
select 
  serial_number,
  k.date,
  battery_rate,
  controller_battery,
  mode
from table k
where k.date between date('2019-06-15') and date('2019-06-20');
"""

Я хотел бы получить всю таблицу, если это возможно, но я подумал, так как индекс находится в столбце даты, я могу использовать выражение where для получения диапазона данныхбыстрее, так как MySQL не нужно смотреть на строки вне диапазона. Поправьте меня, если моя гипотеза неверна.

Какой самый эффективный способ получения данных?

ПРИМЕЧАНИЕ: кардинальность индекса даты высока, однако я не могу его изменить.

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Если количество элементов в столбце date будет высоким, то ваш индекс на date уже должен помогать запросу. Вы можете запустить EXPLAIN SELECT ... в своем запросе, чтобы увидеть, что MySQL на самом деле хочет сделать изнутри. При этом вы можете добавить следующий индекс, который охватывает все предложение SELECT:

CREATE INDEX cover_idx ON yourTable (date, serial_number, battery_rate,
    controller_battery, mode);

Этот индекс, если он используется MySQL, будет полностью покрывать весь запрос, что означает, что нет возврата кпотребуется кластеризованный индекс (т.е. исходная таблица).

0 голосов
/ 08 ноября 2019

Если у вас достаточно памяти и вам не нужны записи из разных блоков одновременно, вы можете просто использовать формулу:

время = постоянная * громкость

и игнорировать все остальное. Поэтому, если вам нужны все данные для обработки, не имеет значения, разделяете вы их или нет, и вы даже тратите дополнительное время на обработку разделения.

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

Однако это идеально рабочая среда. В реальной среде 200 миллионов записей могут привести к неожиданным задержкам и даже системным проблемам, особенно с MySQL. Так что было бы неплохо разделить его, хотя теоретически это занимает одно и то же время.

Просто поиграйте с данными, запросите данные в своей среде и посмотрите на разницу.

...