如何使用COUNT(*)和GROUP BY优化mysql查询

如何使用COUNT(*)和GROUP BY优化mysql查询,mysql,optimization,count,group-by,Mysql,Optimization,Count,Group By,我有4列的原始表格,描述如下: +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | FieldID | varchar(10) | NO | MUL | NULL | | |

我有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    |       |
+----------+-------------+------+-----+---------+-------+
我想使用
计数(*)
分组依据运行查询:

select FieldID, FieldID2, count(*) from nFPRF75_1 GROUP BY FieldID, FieldID2
我已经在列FieldID和列FieldID2上创建了索引,但是,它们似乎无效。我还尝试了
优化表名
,并在这两列上创建了冗余索引(如其他优化问题所示),不幸的是,也没有成功

以下是我从
解释中得到的信息:

 | 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 |
我想知道是否有任何方法可以在这个查询中使用索引,或者用任何其他方法来优化它。现在它的效率非常低,因为有很多生产线


非常感谢你的帮助

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

如果要按字段id,FieldID2进行分组,请创建字段id,FieldID2的索引。这必须提高速度


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

您可以参考这个问题,长度只有10个字符的Varchar字段不会对性能造成太大影响。@RobBailey如果她有90412507行,我想我很抱歉我是mysql的新手。当FieldID的原始数据包含数字以外的字符时,我可以使用int field吗?类似“173F24A5”的东西?@IreneW。按照Rob Bailey说的做,如果您只执行该查询并对这些字段进行分组,这是一个好主意。删除表上的所有索引,然后选择两列(fieldId,fieldId2)并创建一个index@AlbertoFern是的,我试过了,效果不错!谢谢您对更改计数(*)的建议!谢谢,这很有效!!!我想知道为什么单列索引在这种情况下不起作用。(对不起,我是sql新手…)在这种情况下,单列索引不能很好地工作,因为在查询时还有太多的工作要做。即使每个FieldID的平均值只有100个FieldID2,为了统计每个FieldID/FieldID2的唯一组合,您的数据库仍然必须查看每个唯一的FieldID2,以便统计它们(而不仅仅是100个)。所以,即使你在每一列上都有一个单独的索引,仍然有太多的工作要做。如果您有一个多列索引,那么在插入时,所有分组都已经完成,只在~100个实例上执行“计数”。希望有帮助!我明白了,这是有道理的!非常感谢你的解释!