Как использовать мультииндекс для повышения производительности в mysql и в python - PullRequest
0 голосов
/ 14 января 2020

У меня есть таблица в MySQL, которая состоит из более чем 400 миллионов строк. Это выглядит примерно так:

device    date       type .....
  A     2019-06-16    1
  A1    2019-06-20    2 
  A2    2019-10-16    3
  B     2019-06-16    3

В настоящее время, когда я запускаю запрос show index, он выдает:

Table         Non_unique     key_name       seq_in_index    col_name   Collation    Cardinality   Index_type
device_table      1      table_device_date      1             device       A           6444       BTREE
device_table      1      table_device_date      2             date         A           418571     BTREE

Поскольку мои данные слишком велики, я хочу звонить изо дня в день в python затем добавляйте каждый день. (Вызов месяца в python не работает, и я не хочу увеличивать масштаб.)

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

Explain select * from device_table
where date between DATE('2019-10-01') AND DATE('2019-10-02');

который выводит

Id    select_type table         type       rows      Extra
1         simple  device_table   All       400mil   Using Where

У меня есть индекс по столбцу даты, почему он не используется в приведенном выше запросе?

Кроме того, что означает seq_in_index в запросе show index?

Спасибо.

EDIT: Спасибо EdmCoff, Akina.

С их помощью, если я правильно понял. Поскольку индексация в моей таблице имеет порядок [устройство, дата], я не могу go прямо и искать [дату], поэтому для использования индекса даты необходимо сделать это через устройство.

, чтобы сделать это , Я делаю что-то вроде

select * from device_table
where 
  device = 'A' and
  date between DATE('2019-10-01') and DATE('2019-10-02');

и, кажется, работает отлично.

Только сейчас у меня есть около 7000 различных устройств и нужно получить дату с 2019-10-01 ~ 2019- 12-01.

Мой подход сейчас заключается в использовании python (используя py mysql),

date_range = pd.date_range(start='2019-10-01', end='2019-10-10', freq='1d').strftime('%Y-%m-%d')

for device_id in device_list:
    for i in range(1, len(date_range)):
        query = f"""
        select * from device_table
        where
          device = '{device_id}' and
          date between DATE('{date_range[i-1]}') and DATE('{date_range[i]}');
        """

        df = pd.read_sql(query, con=conn)

        final_df.append(df, sort=False, ignore_index=True)

Примечание: список_устройств = ['A', "B", .... и т. д. *

Был бы другой способ - изменить индексирование или другое?

...