【问题标题】:Mysql query very slow (group by)Mysql查询很慢(分组)
【发布时间】:2015-10-09 08:43:49
【问题描述】:

mysql 查询很慢但是我使用"group by" 函数...

我通过查询删除组并且查询非常快。

我该如何解决这个问题?

我的查询代码:

$myquery1 = mysql_query("SELECT * FROM konucuklar 
                         WHERE status='' 
                           and category='football' 
                         GROUP BY matchhour 
                         ORDER BY id asc");
while($myquery1record = mysql_fetch_array($myquery1)){

    $myquery2 = mysql_query("SELECT * FROM konucuklar 
                             WHERE mactarihi='$bugunt' 
                               and statu='' 
                               and kategori='futbol' 
                               and macsaati='$myquery1record[matchhour]' 
                             ORDER BY id asc");

     $toplams=@mysql_num_rows($myquery2);


     while ($myquery2record=mysql_fetch_array($myquery2)) {     
// code
     } 
}
}

【问题讨论】:

  • 一段字符串有多长?有多慢?表中有多少行?哪些列有索引?你能显示konucuklar 表的架构吗?
  • 表中真的有字段category和categori吗?以及地位和地位?这些字段是否被索引?此外,在循环中重复查询可能会非常慢,具体取决于迭代次数。这可以通过准备好的语句来加速,但是在您的情况下,您查询的是同一个表,因此不需要在循环中进行查询,因为可以通过第一个查询来检索所需的数据。
  • @syck 我该如何解决这个问题?我不知道:(
  • 除非你告诉我们你的表是什么样的,你的解释输出是什么以及你有多少数据,答案只能是疯狂的猜测(除了@shadow 强调你的嵌套循环的点)

标签: php mysql group-by


【解决方案1】:
  1. 您的第一个查询不符合 SQL 标准,只有在未启用严格 sql 模式时才会由 mysql 处理。
  2. 您正在根据第一个查询返回的结果循环发出第二个查询。因此,如果第一个查询返回 10 行,那么您将执行第二个查询 10 次。这很慢。您应该将这 2 个查询重写为一个,因为这两个查询都查询同一个表并且具有几乎相同的 where 条件。
  3. 不知道第二个 while 循环的作用,因为我看不到 $listele 的定义位置。

【讨论】:

  • 无法回答这个问题,您没有分享足够的详细信息。您必须与我们共享表结构,向我们提供一些样本数据,并提供样本数据的预期结果。我认为您根本不需要分组。
【解决方案2】:

减速可能与 GROUP BY 子句无关。尝试在需要的列上添加索引。

了解索引的链接:http://www.tutorialspoint.com/sql/sql-indexes.htm

MySQL Profiling 也可能对您的工作有所帮助

【讨论】:

  • 所有列都是必需的 :(,我删除 group by 查询和 mysql 查询非常快 -> 问题“group by”@VERYNET
  • GROUP By 是一条消耗 SQL 中大部分资源的指令。您是否检查过 SQL Profiler 以了解您的请求为何花费这么多时间?删除 GROUP BY 不是理解原因的解决方案。
  • @mesut 根本不需要 GROUP BY,因为您不使用任何 aggregate functions
【解决方案3】:

您的查询未优化,可能可以通过其他方式更好地完成,包括仅使用一个组合查询 (JOIN) 一次获取所有数据。

此外,如果您的表有很多项目,最好为过滤器的常见查询中使用的字段创建索引,以加快搜索速度。

例如,您的第一个选择具有这种复杂性(并且可能格式不正确)

SELECT * FROM konucuklar WHERE status='' 
                           and category='football' 
                         GROUP BY matchhour 
                         ORDER BY id asc

但仅用于获取第二个查询的比赛时间。最小的优化是使用查询仅获取所需的字段。

SELECT DISTINCT matchhour FROM konucuklar WHERE status='' and category='football' 

【讨论】:

  • 不需要连接,因为两个查询都针对同一个表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 2014-09-17
  • 2013-08-14
  • 2014-08-02
  • 2018-09-07
相关资源
最近更新 更多