【问题标题】:Mysql - query on several tables if one of them is common to two others and is not linked to the main oneMysql - 查询多个表,如果其中一个与另外两个通用并且未链接到主表
【发布时间】:2020-07-05 01:23:43
【问题描述】:

我在查询中有很多链接表,假设以下表是必然会导致查询速度变慢的冲突。

这些是链接的 id

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 秒才能执行,因为它有数千条记录。 如果我删除 OR "cl.id_cliente = al.id_cliente" 查询会从 3 秒变为 0.220 毫秒,但它会在表 albaran 中显示空客户端。

我不知道我是否可以进行某种类型的 Join,以便在 NULL 的情况下更改为另一个表或其他方式来加速查询。

____编辑____

这是新查询,现在时间是 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')

【问题讨论】:

    标签: mysql performance join


    【解决方案1】:

    JOIN 是你真正的意思时,不要使用LEFT JOIN。问自己这个问题:“如果缺少匹配的'右手'表格行,我是否想要一堆NULLs?”

    计划 A:通过对两个查询执行 UNION 来摆脱不可优化的 OR。 (我怀疑你可以/应该从两边省略不必要的第二张桌子。)

    B计划:

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

    我倾向于 B 计划,但我猜测总是有一个 eitherfactura 行或 albaran,并且 总是 cliente 行。

    如果不是,请提供足够的数据来帮助解释它们之间的关系。

    【讨论】:

    • 感谢瑞克的帮助。最后,我放置了两个独立的连接和一个根据它是否为空来调用的案例。我已经更新了主帖。
    猜你喜欢
    • 1970-01-01
    • 2015-05-23
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 2019-02-09
    相关资源
    最近更新 更多