我有这个查询
SELECT `PR_CODIGO`, `PR_EXIBIR`, `PR_NOME`, `PRC_DETALHES` FROM `PROPRIETARIOS` LEFT JOIN `PROPRIETARIOSCONTATOS` ON `PROPRIETARIOSCONTATOS`.`PRC_COD_CAD` = `PROPRIETARIOS`.`PR_CODIGO` WHERE `PR_EXIBIR` = 'T' LIMIT 20
它运行速度非常快,不到1秒。
如果我添加GROUP BY,则需要几秒钟(5+)才能运行。甚至Group By字段也是索引。
我使用group by是因为上面的查询返回了重复的行(我在另一个表上搜索名称和他的联系人,显示了4次相同的名字)。
我该如何解决这个问题?
答案 0 :(得分:0)
使用GROUP BY子句,只有在之后按行按组折叠行才会应用LIMIT子句。
为了了解MySQL正在执行的操作以及优化器正在考虑和选择哪些索引,我们使用 EXPLAIN
。
问题中没有陈述的是GROUP BY
子句中的“字段”(列或表达式)。所以我们只是在猜测。
根据问题中显示的查询...
SELECT pr.pr_codigo
, pr.pr_exibir
, pr.pr_nome
, prc.prc_detalhes
FROM `PROPRIETARIOS` pr
LEFT
JOIN `PROPRIETARIOSCONTATOS` prc
ON prc.prc_cod_cad = pr.pr_codigo
WHERE pr.pr_exibir = 'T'
LIMIT 20
我们对最合适的指数的猜测......
... ON PROPRIETARIOSCONTATOS (prc_cod_cad, prc_detalhes)
... ON PROPRIETARIOS (pr_exibir, pr_codigo, pr_exibir, pr_nome)
我们的猜测将根据GROUP BY子句中列出的列而改变。我们也可能会建议一个替代查询来返回等效结果。
但是在不知道GROUP BY
子句的情况下,不知道我们猜测每列的哪个表是正确的,不知道列数据类型,没有任何基数估计,没有示例数据和预期输出,。 ..我们是盲目的,只是在猜测。