Codeigniter 3在调用Group By时确实很慢

时间:2017-04-01 04:37:30

标签: mysql codeigniter-3

我有这个查询

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次相同的名字)。

我该如何解决这个问题?

1 个答案:

答案 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子句的情况下,不知道我们猜测每列的哪个表是正确的,不知道列数据类型,没有任何基数估计,没有示例数据和预期输出,。 ..我们是盲目的,只是在猜测。