php - 优化 MYSQL COUNT ORDER BY 查询

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

用户 - 年龄段

表、行、列 - 上面解释过

已选择 - 上面解释得很好

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

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

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

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

提前感谢您的所有建议!

最佳答案

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

一些快速规则:

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

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


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

关于php - 优化 MYSQL COUNT ORDER BY 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10616901/

相关文章:

php - autoremove 已删除 Plesk。我可以重新安装它并保留所有以前的设置吗?

php - CodeIgniter/MySQL - 选择,其中不等于和喜欢两次

mysql - 插入后更新已读/未读表

php - 如何防止 PHP 中的 SQL 注入(inject)?

sql - 如何在按时间顺序排序的单个表中加入成对的记录(使用 MySQL)

mysql - 从多个表和字符串中选择

php - 可执行文件有更多数据要发送,但不知道如何向可执行文件发送信号,表明已发送的数据已处理并准备好下一个 block

jquery - Droppable 的值计数 (JQuery)

javascript - 使用 JavaScript 递归计算字符串中的元音

php - HTML 到经典 ASP - 页面加载为代码行 (ASP)