#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. Количество элементов не имеет значения. Структура индекса является .