通过查询优化MYSQL COUNT ORDER ORDER

时间:2012-05-16 10:43:34

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

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

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

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个幸福等级以选择形式。 (问题在表格的右侧和顶部,然后您回答问题相交的地方)

用户 - 年龄组

table,row,col - 上面解释

选择 - dooooh上面解释

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

现在(在最初的论文之后)我的问题是:我故意将索引排除在外,因为在调查期间写了大量数据,这将是一个坏主意。但是由于此时没有新数据出现,为表索引所有字段是否有意义?索引从未超过10的整数有多大意义? (你可以猜到我还没有得到关于索引的线索)。我需要此表中的主要唯一ID吗?我

我在某处读到了索引可以帮助组,但只有当你按照表格中的第一列分组时(因为我的ID是第一个,从我的观点来看,无用,我可以删除它并获得任何东西吗?)

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

提前感谢您的所有建议!

1 个答案:

答案 0 :(得分:2)

为“GROUP BY”或“WHERE”的条目添加索引。因此,这是一个包含用户,表格,列,行和在您的案例中选择的一个索引。

一些快速规则:

  • 将字段组合起来,首先是WHERE,最后是GROUP BY元素。
  • 如果您有其他查询只使用其中的一部分(例如用户,表格,col和所选),则最后保留缺失值(在此示例中为行)。

不要使用过多的索引/ indeces,因为每个索引都会使表缓慢升级 - 所以在非常大的系统上,你需要平衡查询和索引。


编辑:您是否需要GROUP BY用户,col,行,因为这些在WHERE中使用。如果WHERE已将它们过滤掉,则只需要“选择”组。