Вы делаете естественное объединение 4 таблиц. Кроме того, в вашем заявлении "ГДЕ" нет особых условий.
Ядро базы данных сделает следующее:
Сначала выполняется рекурсивное произведение всех данных в каждой таблице.
Рассмотрим следующие строки в таблицах A, B и C:
A = rowA1
rowA2
rowA3;
B = rowB1
rowB2
rowB3;
C = rowC1
rowC2
rowC3;
По сути, если вы выполните естественное объединение этих 3 таблиц, ядро будет иметь в памяти:
rowA1 - rowB1 - rowC1
rowA1 - rowB1 - rowC2
rowA1 - rowB1 - rowC3
rowA1 - rowB2 - rowC1
rowA1 - rowB2 - rowC2
rowA1 - rowB2 - rowC3
rowA1 - rowB3 - rowC1
rowA1 - rowB3 - rowC2
rowA1 - rowB3 - rowC3
...
...
...
rowA3 - rowB3 - rowC1
rowA3 - rowB3 - rowC2
rowA3 - rowB3 - rowC3
Всего в память помещено 27 строк. Однако мы хотим только 3 строки:
rowA1 - rowB1 - rowC1
rowA2 - rowB2 - rowC2
rowA3 - rowB3 - rowC3
Если ваш движок базы данных не выполняет оптимизацию сам по себе, естественное объединение трех таблиц очень дорого. Для 4 таблиц это невозможно представить даже для ограниченного числа строк.
Теперь, как мы можем получить что-то лучше?
Во-первых, глядя на код, мы знаем, что нам нужно всего 5 значений. Также при оптимизации баз данных говорят, что вы должны сделать SELECT как можно раньше.
Вот некоторый непроверенный код, который должен вам помочь. Возможно, вам придется изменить его, в зависимости от того, какой механизм БД вы используете:
SELECT *
FROM (SELECT * FROM equipment LIMIT 5) e, tiremap, workreference, tirework
WHERE e.tiremap = tiremap.TireID AND
tiremap.WorkMap = workreference.`aMap` AND
workreference.`bMap` = tirework.workmap
Просто сделав это, вы почувствуете, что у нас всего 3 таблицы, а не 4. Тем не менее, это не совсем то, что вы хотите. Если на одну строку «оборудования» нет ссылок в других таблицах, вы получите менее 5 строк в конце. Тем не менее, это пример, демонстрирующий, что нам не обязательно нужны все строки из всех таблиц.
Теперь, я думаю, вы хотите, чтобы это было:
SELECT * FROM equipment
INNER JOIN tiremap ON equipment.tiremap = tiremap.TireID
INNER JOIN workreference ON tiremap.WorkMap = workreference.aMap
INNER JOIN tirework ON workreference.bMap = tirework.workmap
LIMIT 5
У вас может быть проблема: если ваш движок не так хорош (mySQL, извините), это может занять много времени.
Если вы действительно хотите провести оптимизацию самостоятельно:
SELECT * FROM tirework,
(SELECT * FROM workreference,
(SELECT * FROM tiremap,
(SELECT * FROM equipment) e
WHERE e.tiremap = tiremap.TireID) t
WHERE t.WorkMap = workreference.aMap) w
WHERE w.bMap = tirework.workmap
LIMIT 5
И вуаля! Даже если ваш оптимизатор движка не существует, этот запрос не должен занимать слишком много времени. Вместо того, чтобы делать большой продукт из всего, ваш движок будет делать один продукт за раз и выводить плохие строки перед тем, как объединить его с новой таблицей.
Попробуй.