MySQL оптимизировать запрос с диапазоном дат

#mysql #select #optimization

#mysql #выберите #оптимизация

Вопрос:

У меня есть следующая структура таблицы.

 id (INT) index
date (TIMESTAMP) index
companyId (INT) index
  

Это проблема, с которой я сталкиваюсь

CompanyID 111: имеет в общей сложности 100000 строк за период времени в 1 год.

CompanyID 222: содержит в общей сложности 8000 строк за период времени в 1 год.

Если CompanyID 111 имеет 100 строк между '2020-09-01 00:00:00' AND '2020-09-06 23:59:59' и CompanyID 222 имеет 2000 строк в том же диапазоне дат, CompanyID 111 работает намного медленнее, чем 222, даже если у него меньше строк в выбранном диапазоне дат.

Разве MySQL не должен игнорировать все строки за пределами диапазона дат, чтобы запрос стал быстрее?

Это пример запроса, который я использую:

 SELECT columns FROM table WHERE date BETWEEN '2020-09-01 00:00:00' AND '2020-09-06 23:59:59' AND companyId = 111;
  

Спасибо

Комментарии:

1. Пожалуйста, опубликуйте ТЕКСТОВЫЕ результаты SHOW CREATE TABLE таблица; чтобы мы могли видеть, применили ли вы какие-либо из предложений к этому моменту времени. Кто-нибудь поможет вам добиться высокой производительности.

2. У вас было бы время опубликовать текущие текстовые результаты SHOW CREATE TABLE table; чтобы мы могли видеть, что у вас получилось для таблицы с индексами?

3. Было бы нормально ответить — Нет. Мы бы поняли.

Ответ №1:

Я бы предложил здесь составной индекс:

 CREATE INDEX idx ON yourTable (companyId, date);
  

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

 CREATE INDEX idx ON yourTable (date, companyId);
  

Комментарии:

1. Должен ли я создать этот новый индекс и оставить остальные без изменений или я должен отредактировать / удалить их?

2. @CrashOverride — Пожалуйста, предоставьте SHOW CREATE TABLE ; мы не можем догадаться, какие другие индексы у вас есть. В общем, добавьте любой индекс, который является левой частью другого индекса.

3.Поместите companyID первым, потому что он тестируется с помощью «=». Тогда все необходимые «строки» индекса будут последовательными.

4. @RickJames Я бы также предложил первую версию в предположении, что companyId она будет иметь более высокую мощность.

5. Количество элементов не имеет значения. Структура индекса является .