Mysql - запрос к нескольким таблицам, если одна из них является общей для двух других и не связана с основной - PullRequest
0 голосов
/ 24 марта 2020

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

Это идентификаторы, которые связаны

Tabla A: ventacompra(#id_ventacompra,id_factura, id_albaran)
Tabla B: factura(#id_factura,id_cliente)
Tabla C: albaran(#id_albaran,id_cliente)
Tabla D: cliente(#id_cliente)

Запрос

SELECT *
FROM ventacompra v
LEFT JOIN factura f ON v.id_factura = f.id_factura 
LEFT JOIN albaran al ON v.id_albaran = al.id_albaran 
LEFT JOIN cliente cl ON (cl.id_cliente = f.id_cliente OR  cl.id_cliente = al.id_cliente)

Этот запрос занимает 3 секунды, потому что он имеет тысячи записей. Если я удаляю ИЛИ "cl.id_cliente = al.id_cliente", запрос выполняется от 3 секунд до 0,220 мс, но в таблице отображается нулевой клиент.

Я не знаю, смогу ли я это сделать некоторый тип Join, так что в случае NULL он меняется на другую таблицу или другой способ ускорения запроса.

____ EDIT ____

Это новый запрос, и теперь время составляет 300 мс.

CASE 
 WHEN clf.nombre IS NOT NULL THEN clf.nombre 
 WHEN cla.nombre IS NOT NULL THEN cla.nombre
END AS nombre
LEFT JOIN cliente clf ON (clf.id_cliente = f.id_cliente and transacion='venta')
LEFT JOIN cliente cla ON (cla.id_cliente = al.id_cliente and transacion ='venta')

1 Ответ

1 голос
/ 25 марта 2020

Не используйте LEFT JOIN, когда JOIN - это то, что вы действительно имеете в виду. Задайте себе вопрос: «Хочу ли я получить кучу NULLs, если отсутствует соответствующая строка правой таблицы?»

План A: Избавиться от неоптимизируемого OR, выполнив UNION из двух запросов. (Я подозреваю, что вы можете / должны пропустить ненужный второй стол с каждой стороны.)

План B:

SELECT .. 
    FROM ventacompra 
    LEFT JOIN ( SELECT .. FROM factura JOIN cliente .. )
    LEFT JOIN ( SELECT .. FROM albaran JOIN cliente .. )

Я склоняюсь к Плану B, но я предполагая , что всегда есть или a factura строка или albaran, И всегда a cliente строка.

Если нет, пожалуйста предоставить достаточно данных, чтобы объяснить, как они связаны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...