Производительность MySQL. Повышает ли производительность соединение с помощью ключа?

0

У меня есть две таблицы с миллионами данных. обе таблицы имеют 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 справки?

  • 0
    Всегда присоединяйтесь к индексируемому идентификатору. Я не понимаю, почему вы присоединяетесь на свидание. И у вас есть end_date и enddate . Я знаю, что это разные поля, но вы должны придерживаться одной нотации, а не писать поля по-разному.
  • 0
    "Поможет ли производительность GROUP BY records.mnumber, records.enddate производительности?" Нет, и он испортит результаты вашего запроса, если вы просто добавите его, предполагая, что сервер не работает в режиме ONLY_FULL_GROUP_BY.
Показать ещё 4 комментария
Теги:
database-performance

2 ответа

0
Лучший ответ

В 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.)

0

Будет ли производительность GROUP BY records.mnumber, records.enddate справки?

GROUP BY управляет вашим набором результатов - он для агрегации, а не для производительности...

Вы выбираете между тремя вариантами:

  1. Оптимизируйте свою схему и сделайте соответствующие идентификаторы, а не в поле даты
  2. Добавить индекс в поле даты
  3. Добавьте составной индекс по обоим полям

Чтобы проверить, что работает лучше всего, используйте EXPLAIN перед запросами и сравните вывод (меньше запросов обычно означает лучшую производительность).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню