Это мой 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
Я хочу сделать это быстро.
Может быть, я могу изменить * на поле, которое мне нужно (поэтому я пытаюсь это сделать).
Меняет ли порядок соединения?
Я могу увеличить память сервера, а также количество процессоров и скорость процессора, в моем запросе, какая из них более эффективна?
Есть ли другие рекомендации?
Заранее спасибо.
Вам следует попытаться использовать объяснение и выяснить, что происходит:
https://dev.mysql.com/doc/refman/5.7/en/using-explain.html
Меняет ли порядок соединения?
Порядок соединения обычно не имеет значения, поскольку большинство движков будут делать внутреннюю оптимизацию заказа. У некоторых также есть способ заставить порядок соединения и проверить себя, может ли ваш случай получить лучшие результаты с определенным порядком, отличным от того, что генерировал двигатель.
Я могу увеличить память сервера, а также количество процессоров и скорость процессора, в моем запросе, какая из них более эффективна?
Я бы сосредоточился на памяти (кеширование, shared_buffer), но перед выполнением любого изменения сервера вам следует вначале тщательно изучить фактическую проблему и попытаться настроить существующую систему. (для идей см. https://wiki.postgresql.org/wiki/Performance_Optimization (раздел "Общая настройка и оптимизация")
Может быть, я могу изменить * на поле, которое мне нужно (поэтому я пытаюсь это сделать).
Определенно. Предпочитайте, чтобы * в целом.