Вы используете LEFT JOIN, хотя вам требуется не-NULL поле в объединенной таблице в WHERE.
`trans`.`company_id` = 1
не может быть истинным, если LEFT JOIN создает строку NULL для trans
, поэтому нетиз дополнительных строк, созданных LEFT JOIN (по сравнению с внутренним JOIN), будут допущены к конечному результату.
При использовании LEFT JOIN вы создаете не менее 769970 строк (т. е. как минимум по одной на строку в trans_email
).), затем вы обрезаете их до 25. Если вместо этого у вас был внутренний JOIN, вы бы сразу сократили до 50-ти строк (при условии примерно равного распределения логического столбца) только из основного индекса, а затем урезали до 25 с помощью логического значения.условие.
РЕДАКТИРОВАТЬ: Изменение другого ЛЕВОГО СОЕДИНЕНИЯ (email_statuses
) фактически изменит ваши результаты, если у вас нет полного покрытия в таблице email_statuses
, и это не должно реально влиять на вашу среду выполнения, котораяпосле того, как другой LEFT JOIN пропадет, не стесняйтесь оставить этот LEFT JOIN без изменений.
Таким образом - попробуйте это (только одно слово меньше):
SELECT `trans_email`.*
, `email_statuses`.`recipient`, `email_statuses`.`status_id`, `email_statuses`.`message`, `email_statuses`.`status_received_at`
, `trans`.`doc`
FROM `trans_email`
JOIN `email_statuses` ON `trans_email`.`id` = `email_statuses`.`trans_email_id`
LEFT JOIN `trans` ON `trans_email`.`trans_id` = `trans`.`id`
WHERE `trans_email`.`type_id` = 0 AND `trans`.`company_id` = 1
ORDER BY `email_statuses`.`status_received_at` DESC
LIMIT 25 OFFSET 0