【问题标题】:How to optimize mysql query with COUNT(*) and GROUP BY如何使用 COUNT(*) 和 GROUP BY 优化 mysql 查询
【发布时间】:2015-11-10 14:14:19
【问题描述】:

我有4列的原始表格,描述如下:

+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| FieldID  | varchar(10) | NO   | MUL | NULL    |       |
| PaperID  | varchar(10) | NO   |     | NULL    |       |
| RefID    | varchar(10) | NO   |     | NULL    |       |
| FieldID2 | varchar(10) | NO   | MUL | NULL    |       |
+----------+-------------+------+-----+---------+-------+

我想使用COUNT(*)GROUP BY 运行查询:

select FieldID, FieldID2, count(*) from nFPRF75_1 GROUP BY FieldID, FieldID2

我已经在字段 ID 列和字段 ID2 列上创建了索引,但是,它们似乎无效。我也尝试过 OPTIMIZE table_name 并在这两列上创建了冗余索引(如其他优化问题所示),不幸的是它也没有成功。 p>

这是我从EXPLAIN 得到的信息:

 | id | select_type | table     | type | possible_keys | key  | key_len | ref  | rows     | Extra                           |
 +----+-------------+-----------+------+---------------+------+---------+------+----------+---------------------------------+
 |  1 | SIMPLE      | nFPRF75_1 | ALL  | NULL          | NULL | NULL    | NULL | 90412507 | Using temporary; Using filesort |

我想知道我是否可以在此查询中使用索引或任何其他方式来优化它。现在线路很多,效率很低。

非常感谢您的帮助!

【问题讨论】:

标签: mysql optimization count group-by


【解决方案1】:

如果您按它们分组,请创建 FieldID、FieldID2 的索引。那必须提高速度。

另外,我建议您将 count(*) 更改为 count('myIntColumn'),这也可以提高速度。

【讨论】:

  • 长度只有 10 个字符的 Varchar 字段不会对性能造成太大影响。
  • @RobBailey 如果她有 90412507 行,我想它会
  • 对不起,我是 mysql 的新手。当FieldID的原始数据包含数字以外的字符时,我可以使用int field吗?像'173F24A5'这样的东西?
  • @IreneW。按照 Rob Bailey 所说的去做,如果您只执行该查询并对这些字段进行分组,这是一个好主意。删除表上的所有索引,然后选择两个列(fieldId,fieldId2)并创建索引
  • @AlbertoFernández 是的,我已经尝试过了,它有效!也感谢更改 count(*) 的建议!
【解决方案2】:

您应该创建一个 (FieldID, FieldID2) 的多列索引。

【讨论】:

  • 感谢它的工作!我想知道为什么单列索引在这种情况下不起作用。 (对不起,我是 sql 新手...)
  • 单列索引在这种情况下不能很好地工作,因为在查询时还有太多的工作要做。即使每个 FieldID 平均只有 100 个 FieldID2,为了计算 FieldID/FieldID2 的每个唯一组合,您的数据库仍必须查看每个唯一 FieldID2 以便计算它们(不仅仅是 100 个)。因此,即使您在每列上分别有一个索引,仍然需要做太多的工作。如果您有一个多列索引,那么在插入时所有的分组都已经完成,只剩下大约 100 个实例上的“计数”执行。希望有帮助!
  • 我明白了,这很有道理!非常感谢您的解释!
猜你喜欢
  • 2020-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多