Как индексировать и запрашивать очень большую БД с 60M строками и 50 столбцами - PullRequest
0 голосов
/ 03 октября 2019

EXPLAIN SQL У меня есть большая таблица с 60M строк и 50 столбцов (столбцы включают "company_idx" и "timestamp"). Таким образом, когда я выполняю свой простой SQL-запрос, такой как:

SELECT * FROM companies_Scores.Scores 
WHERE `company_idx`=11 
  AND `timestamp` BETWEEN  '"+start_date+" 00:00:00' AND '"+end_date+" 00:00:00'

В основном это занимает 4 минуты (что слишком долго). Таким образом, я подумал об индексации своей таблицы, поэтому я сделал:

CREATE INDEX idx_time ON companies_Scores.Scores(company_idx, timestamp) USING BTREE;

Однако, когда я сейчас делаю следующее, для запуска также требуется 4 минуты.

SELECT * FROM companies_Scores.Scores 
USE INDEX(idx_time) 
WHERE `company_idx`=11 
  AND `timestamp` BETWEEN  '"+start_date+" 00:00:00' AND '"+end_date+" 00:00:00'

Я действительно новичок с SQL и индексами. Так что я не совсем уверен, как использовать индексы в запросе. Я думаю, что тот, который я сделал выше, является правильным? Почему это занимает так много времени? Как я могу улучшить это? Я бы хотел, чтобы мои запросы для каждого company_idx были максимально быстрыми.

Когда я запускаю EXPLAIN, я получаю:

[{'Cardinality': 115751,
  'Collation': 'A',
  'Column_name': 'company_idx',
  'Comment': '',
  'Index_comment': '',
  'Index_type': 'BTREE',
  'Key_name': 'idx_time',
  'Non_unique': 1,
  'Null': 'YES',
  'Packed': None,
  'Seq_in_index': 1,
  'Sub_part': None,
  'Table': 'Scores'},
 {'Cardinality': 45831976,
  'Collation': 'A',
  'Column_name': 'timestamp',
  'Comment': '',
  'Index_comment': '',
  'Index_type': 'BTREE',
  'Key_name': 'idx_time',
  'Non_unique': 1,
  'Null': 'YES',
  'Packed': None,
  'Seq_in_index': 2,
  'Sub_part': None,
  'Table': 'Scores'}]

1 Ответ

0 голосов
/ 03 октября 2019

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

Одна проблема может заключаться в том, что индекс нельзя использовать. Это может произойти, если у вас есть проблемы с типом столбцов. Например, значение сравнения 11 является числом. Если customer_idx является строкой, у вас есть проблема. Сравнение должно быть строкой - '11'.

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

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