sql查询的性能不佳

时间:2014-07-28 15:09:02

标签: mysql sql performance

SELECT orcamentos.id
FROM usuarios, clientes, empresas, orcamentos
WHERE 
(
    (
        clientes.nome LIKE '%VARIAVEL%'
        AND clientes.email=usuarios.usuario
    )
    AND orcamentos.cliente=usuarios.id
)
OR 
(
    (
        (
            empresas.razao_social LIKE '%VARIAVEL%' 
            OR empresas.nome_fantasia LIKE '%VARIAVEL%'
        ) 
        AND empresas.email=usuarios.usuario
    ) 
    AND orcamentos.cliente=usuarios.id
)
OR orcamentos.nome_cliente LIKE '%VARIAVEL%'
GROUP BY orcamentos.id;

我有这个查询,它可以正常工作,但有性能问题。我想要一些查询结构的提示来optimeze,比如说:在这种情况下更好的是join等等.SGBD是mysql。

感谢。

2 个答案:

答案 0 :(得分:1)

我认为这个查询更清楚:

SELECT orcamentos.id
FROM usuarios
join orcamentos on orcamentos.cliente=usuarios.id
left join clientes on clientes.email=usuarios.usuario
left join empresas on empresas.email=usuarios.usuario
WHERE 
  COALESCE(clientes.nome,'') + COALESCE(empresas.razao_social,'') +
  COALESCE(empresas.nome_fantasia,'') + orcamentos.nome_cliente LIKE '%VARIAVEL%'
GROUP BY orcamentos.id;

注意哪些是左连接,你可以使orcamentos成为左连接,但是你的结果集中将有一行为null。

您仍会遇到性能问题。像clientes.nome LIKE '%VARIAVEL%'这样的搜索速度很慢,因为无法使用索引。某些SQL平台具有CONTAINS关键字,但除非您使用的产品具有全文搜索功能且已针对要搜索的列启用,否则仍然很慢。需要全表扫描才能在字段中查找任意字符串。索引要快得多。

如果你一直在寻找相同的东西,你可以采取一些技巧来加速搜索。

答案 1 :(得分:0)

以下查询如何:

SELECT orcamentos.id
FROM usuarios
  INNER JOIN orcamentos ON orcamentos.cliente = usuarios.id
  LEFT JOIN clientes ON clientes.email = usuarios.usuario
  LEFT JOIN empresas ON empresas.email = usuarios.usuario
WHERE clientes.nome LIKE '%VARIAVEL%'
  OR empresas.razao_social LIKE '%VARIAVEL%'
  OR empresas.nome_fantasia LIKE '%VARIAVEL%'
  OR orcamentos.nome_cliente LIKE '%VARIAVEL%'
GROUP BY orcamentos.id;