SQL (HFSQL): INNER JOIN не симметричен по производительности, если предложение WHERE?

У меня есть базовая база данных HFSQL с 3 таблицами: Company, Person и Worker. Каждая таблица имеет ~5 столбцов и 5000 записей. У рабочего есть внешний ключ для лица с именем IDPerson и внешний ключ для объекта с именем IDCompany.

Я проверил 2 следующих запроса ( я изменяю только порядок INNER JOIN):

ЗАПРОС 1 (время выполнения ~5 мс)

      SELECT *
FROM Person
INNER JOIN Worker ON Worker .IDPerson = Person.IDPerson
WHERE Worker.Company = 1;

ЗАПРОС 2 ( время выполнения ~50 мс )

      SELECT *
FROM Worker
INNER JOIN Person ON Worker .IDPerson = Person.IDPerson
WHERE Worker.Company = 1;

Количество найденных записей такое же, но время выполнения в 10 раз меньше. Что, черт возьми? Разве INNER JOIN не должен быть симметричным? Почему порядок меняет производительность до 10 раз при использовании предложения WHERE?

Пожалуйста, помогите мне понять это поведение WTF!

PS: проблема с производительностью такая же, если я выберу только несколько столбцов вместо " " *

Искренне,

Ricola3D

2 ответа

Даже если вам нужны все столбцы, всегда рекомендуется выбирать именно их, а не использовать «*». Причина этого заключается в том, что вы знаете, что хотите, в базе данных, а не собираете все (даже если вы собираете все).

Если вы выберете только несколько столбцов, вы сообщаете базе данных, что знаете, что хотите извлечь, поэтому она будет искать только определенные столбцы, а не использовать «скрытый запрос» для получения всех столбцов.

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

При тестировании не стесняйтесь использовать что-нибудь для очистки кеша (это может иметь некоторое влияние)

Посмотрите на вывод EXPLAIN your_sql_query, он покажет вам, где находятся завалы.

Другие вопросы по тегам