В вашем первом запросе предикат COALESCE(p.provider_title_id, i.provider_title_id) = "X"
основан на столбцах из двух таблиц.Это заставляет MySQL использовать этот предикат в качестве «предиката фильтрации», а не «предиката доступа».
Что это означает на английском языке?Это означает, что MySQL выполняет перекрестный продукт, полученный в результате JOIN
, используя предикаты доступа [надеюсь, быстрый], но затем он вынужден фильтровать весь набор результатов, используя условие выше.Перекрестное произведение, вероятно, приводит к огромному количеству строк, которые будут отброшены условием.Много работы для небольшого результата.
Второй запрос использует простые предикаты, которые MySQL может использовать для доступа к строкам.На этот раз доступны только несколько строк.Предикат фильтрует некоторые из них, но общий объем работы очень ограничен.
Вы могли бы увидеть это намного яснее, если бы вы создали и сравнили планы выполнения каждого запроса.