【问题标题】:Optimizing an MYSQL COUNT ORDER BY query优化 MYSQL COUNT ORDER BY 查询
【发布时间】:2012-05-16 10:43:34
【问题描述】:

我最近编写了一个调查应用程序,它完成了它的工作并收集了所有数据。现在我必须分析数据,我遇到了一些时间问题。 我必须找出有多少人选择了哪个选项并将其全部显示出来。

我正在使用这个查询,它确实可以完成它的工作:

SELECT COUNT(*)
  FROM survey
 WHERE users = ? AND table = ? AND col = ? AND row = ? AND selected = ?
 GROUP BY users,table,col,row,selected

正如“?”所示我正在使用 MySQLi(在 php 中)在需要时获取数据,但我担心这会导致它如此缓慢。

该表包含上述所有元素(+ 唯一 ID),并且它们都是整数。 解释一些字段: 每个调查分为 3 或 4 个表格(大小从 2x3 到 5x5),以 1 到 10 的幸福等级来选择表格。 (问题在表格的右侧和顶部,然后您回答问题相交的地方)

用户 - 年龄组

表格、行、列 - 上面解释过

已选中 - 上面已经解释过了

现在,随着调查的完成和表中大约 100 万个条目,查询变得非常缓慢。有时需要 3 分钟,有时(我猜)时间限制到期,你根本没有得到任何数据。我也无法访问完整的数据库,只是我的空“测试”数据库,因为客户有点偏执:S(他的服务器似乎有点慢)

现在(在最初的文章之后)我的问题是:我故意留下索引,因为在调查期间写入了大量数据,这将是一个坏主意。但是由于此时没有新数据进入,索引表的所有字段是否有意义?索引从不超过 10 的整数有多大意义? (你可以猜到我对索引一无所知)。我需要此表中的主要唯一 ID 吗?我

我在某处读到索引可能有助于分组,但前提是您按表中的第一列分组(因为我的 ID 是第一位的,从我的角度来看没用,我可以删除它并从中获得任何东西吗?)

是否有另一种方法来编写我的查询,它基本上可以做同样的事情,但在更短的时间内?

提前感谢您的所有建议!

【问题讨论】:

  • 我肯定会为列添加索引:用户、表、列、行和选择。这应该会缩短运行查询的时间。

标签: php mysql count mysqli sql-order-by


【解决方案1】:

为您“GROUP BY”或“WHERE”的条目添加索引。所以这是一个包含用户、表、列、行并在您的案例中选择的索引。

一些快速规则:

  • 组合字段以使 WHERE 在前,GROUP BY 元素在后。
  • 如果您有其他查询只使用其中的一部分(例如 users、table、col 和 selected),则将缺失值(在本例中为行)留在最后。

不要使用太多的索引/索引,因为每个索引都会稍微减慢表的更新速度 - 所以在非常大的系统上,您需要平衡查询和索引。


编辑:您是否需要 GROUP BY 用户、列、行,因为它们在 WHERE 中使用。如果 WHERE 已经把它们过滤掉了,你只需要 group by “selected”。

【讨论】:

  • 我能通过以下方式获得什么:
  • 感谢您的帮助。我是否可以通过将查询重写为类似:SELECT selected, COUNT(selected) WHERE .... 并让 php 循环将它们回显出来。该索引将不再适用吗? (它们确实在页面上一个接一个出现)。 (在这个论坛上的 shift-enter 事情上史诗般的失败:D)
  • 如果您全部需要,SELECT users, table, col, row, selected, COUNT(*) FROM survey GROUP BY users,table,col,row,selected 是您的最佳选择(使用索引) 并且会加快速度。循环遍历所有结果。
  • 还可以查看 ORDER BY 以按正确顺序获取结果,这样您就可以按正确顺序循环遍历结果,而无需保存为临时中间数组。
  • 感谢您所做的一切。向你致敬 m8(或 +1 或喜欢或任何当今流行的东西!:D)
猜你喜欢
  • 1970-01-01
  • 2011-05-13
  • 2012-06-12
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多