У меня есть две таблицы с миллионами данных. обе таблицы имеют 2 параметра, по которым я хочу присоединиться к этим таблицам. пример запроса:
SELECT
bills.meter_id,
records.record_id
FROM records
JOIN bills ON (
bills.mnumber = records.mnumber
AND bills.end_date = records.enddate
)
WHERE records.mnumber IS NOT NULL
AND records.enddate IS NOT NULL
Итак, вы можете видеть, что у меня есть две таблицы записей и счетов, которые соединяются с использованием полей mnumber и endate. в настоящее время ни один из этих столбцов не индексируется. Какая наилучшая комбинация индексов дает наилучшую производительность для этого запроса. Будет ли производительность GROUP BY records.mnumber,records.enddate
справки?
В JOIN
(но не в LEFT JOIN
) сначала посмотрите, какая таблица может извлечь выгоду из индекса для фильтрации. Поскольку WHERE
ссылается только на records
, это, вероятно, будет первая таблица, которую будет использовать Оптимизатор.
WHERE records.mnumber IS NOT NULL
AND records.enddate IS NOT NULL
может выиграть от INDEX(mnumber, enddate)
- в любом порядке. Это зависит от того, какая часть таблицы имеет оба столбца: NULL
.
Перейдем к следующей таблице (bills
):
ON bills.mnumber = records.mnumber
AND bills.end_date = records.enddate
безусловно, выиграют от этого составного индекса по bills
:
INDEX(mnumber, enddate) -- in either order
(Я согласен с другим ответом о GROUP BY
.)
Будет ли производительность GROUP BY records.mnumber, records.enddate справки?
GROUP BY
управляет вашим набором результатов - он для агрегации, а не для производительности...
Вы выбираете между тремя вариантами:
Чтобы проверить, что работает лучше всего, используйте EXPLAIN
перед запросами и сравните вывод (меньше запросов обычно означает лучшую производительность).
end_date
иenddate
. Я знаю, что это разные поля, но вы должны придерживаться одной нотации, а не писать поля по-разному.