Оптимизировать запрос JOIN в MySQL

0

Это мой MySQL в целом:

SELECT *
FROM
     Table1
     INNER JOIN Table2 ON (Table1.Table2_id = Table2.id) 
     INNER JOIN Table3 ON (Table1.Table3_id = Table3.id) 
     INNER JOIN Table4 ON (Table1.Table4_id = Table4.id) 
     INNER JOIN Table5 ON (Table1.Table5_id = Table5.id) 
     LEFT JOIN Table6 ON (Table1.Table6_id = Table6.id)  
ORDER BY Table1.barcode DESC 
LIMIT 50 

Я помещаю индекс во все ID (по умолчанию есть, но, конечно, я их перепроверяю), а также для Table1.barcode.

Это очень медленный запрос в моей базе данных (около 15 секунд).

Я проверяю его без order by и, как я понял, это было очень быстро.

Я снимаю limit 50 и order by, он занял то же время (около 15 секунд).

Я должен сказать, что есть много данных:

Table1: 300442 records,
Table2: 77 records,
Table3: 314085 records,
Table4: 28987 records,
Table5: 127805 records,
Table6: 3230 records

Я хочу сделать это быстро.

Может быть, я могу изменить * на поле, которое мне нужно (поэтому я пытаюсь это сделать).

Меняет ли порядок соединения?

Я могу увеличить память сервера, а также количество процессоров и скорость процессора, в моем запросе, какая из них более эффективна?

Есть ли другие рекомендации?

Заранее спасибо.

  • 1
    Каковы отношения между таблицами? Если более чем один не является отношением 1: 1 с таблицей 1, ваш запрос вызывает большие сомнения.
  • 0
    @Uueerdo Все 1: N, кроме Таблицы1 и Таблицы3
Показать ещё 5 комментариев
Теги:
join

1 ответ

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

Вам следует попытаться использовать объяснение и выяснить, что происходит:

https://dev.mysql.com/doc/refman/5.7/en/using-explain.html

Меняет ли порядок соединения?

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

Я могу увеличить память сервера, а также количество процессоров и скорость процессора, в моем запросе, какая из них более эффективна?

Я бы сосредоточился на памяти (кеширование, shared_buffer), но перед выполнением любого изменения сервера вам следует вначале тщательно изучить фактическую проблему и попытаться настроить существующую систему. (для идей см. https://wiki.postgresql.org/wiki/Performance_Optimization (раздел "Общая настройка и оптимизация")

Может быть, я могу изменить * на поле, которое мне нужно (поэтому я пытаюсь это сделать).

Определенно. Предпочитайте, чтобы * в целом.

  • 0
    Это не весь мой ответ. Не могли бы вы ответить на них (например, спецификации сервера), поэтому я отмечу ваш ответ как ответ на мой вопрос.
  • 0
    вот и ты ...
Показать ещё 1 комментарий

Ещё вопросы

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