Это на самом деле не LEFT
объединение, так как вам требуется store_id = 100
. Это не изменит производительность; Оптимизатор уже разобрался. (Это помогает читателям попытаться выяснить цель запроса.)
Вы говорите SELECT *
. Если вам не нужны все столбцы, не просите их всех. Если какой-либо столбец является большим TEXT
, текст находится в блоке «off-record», который требует усилий для извлечения.
INDEX(customer_id), INDEX(date)
не так хорош, как «составной» INDEX(customer_id, date)
При этом он может сосредоточиться на записях для этого одного клиента и сканировать нужные даты. Это может сделать улучшение скорости. Примечание: важен порядок столбцов в этом индексе - сначала поставьте столбцы =
(customer_id
), а диапазон (date >=...
) последним.
(Q1) MySQL (за редким исключением) не использует более одного индекса за раз. Вы фильтруете shipments
по двум вещам: customer_id
и date
, а не только date
. С другой стороны, в этом запросе будет использоваться INDEX(date)
, а , а не будет использоваться составной индекс, приведенный выше: SELECT * FROM shipments where date >= CURDATE();
(Это позволяет получить всю информацию обо всех отгрузках на сегодняшний день для всех клиентов.
Примечание: вы включаете полночь с обоих концов. Измените последнее сравнение с <=
на <
.
(Q2) Числа в EXPLAIN
являются оценочными. на «статистику» и «исследования», которые не обязательно являются очень точными. Кроме того, в некоторых случаях некоторые советы игнорируются. Явное упущение: LIMIT
.
Остерегайтесь использования USE INDEX
и FORCE INDEX
. Если Вы чувствуете потребность в этом, возможно, вы упускаете что-то важное. Если вы его используете, «это может помочь сегодня, но ухудшит ситуацию завтра, когда изменится распределение данных.
Совет: для сравнения с DATE / DATETIME / DATETIME (1) / TIMESTAMP, время полуночи может опускаться из части 'time': '2020-05-01'
работает так же, как '2020-05-01 00:0:00.0'
Версия 5.5? Это довольно старый. 5.6 добавляет EXPLAIN FORMAT=JSON
, что даст больше информации - подробности об использовании индекса, сортировке, query_cost и т. д. c.
«Этот материал по оптимизации все еще довольно неясен для меня.» - Да. И MySQL имеет один из более простых оптимизаторов.