MySQL-group by仅可使用;文件排序“;及;使用“临时”命令;?

MySQL-group by仅可使用;文件排序“;及;使用“临时”命令;?,mysql,Mysql,有没有办法在MySQL中不使用“文件排序”和“使用临时”而使用GROUPBY?尝试了不同的索引、不同的broup by、不同的order by,但结果总是一样——“使用filesort”或“使用filesort+使用临时” 即使同一列中的group by和order by也会给出相同的结果: CREATE TABLE IF NOT EXISTS `ank1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `uid` int(11) NOT NULL DE

有没有办法在MySQL中不使用“文件排序”和“使用临时”而使用GROUPBY?尝试了不同的索引、不同的broup by、不同的order by,但结果总是一样——“使用filesort”或“使用filesort+使用临时”

即使同一列中的group by和order by也会给出相同的结果:

CREATE TABLE IF NOT EXISTS `ank1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` int(11) NOT NULL DEFAULT '0',
  `kmk` int(3) NOT NULL,
  `order_by` int(11) NOT NULL,
  `gender` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `gender` (`gender`,`kmk`,`order_by`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

mysql> explain SELECT gender, kmk, order_by FROM ank1
    -> where
    -> gender IN (1, 2, 3) and
    -> kmk IN (1, 2, 3, 12, 13, 23, 123)
    -> group by order_by
    -> order by order_by DESC limit 0, 30;
+----+-------------+-------+-------+---------------+--------+---------+------+------+-----------------------------------------------------------+
| id | select_type | table | type  | possible_keys | key    | key_len | ref  | rows | Extra                                                     |
+----+-------------+-------+-------+---------------+--------+---------+------+------+-----------------------------------------------------------+
|  1 | SIMPLE      | ank1  | index | gender        | gender | 9       | NULL |    6 | Using where; Using index; Using temporary; Using filesort |
+----+-------------+-------+-------+---------------+--------+---------+------+------+-----------------------------------------------------------+
1 row in set (0.00 sec)

您的SQL语句格式不正确,因为它使用了MySQL的(mis)功能,允许SQL中不在
group by
中的列。使用此(mis)功能时,可能无法绕过文件排序。我尝试在select语句中不使用group by,但结果相同。
CREATE TABLE IF NOT EXISTS `ank1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` int(11) NOT NULL DEFAULT '0',
  `kmk` int(3) NOT NULL,
  `order_by` int(11) NOT NULL,
  `gender` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `gender` (`gender`,`kmk`,`order_by`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

mysql> explain SELECT gender, kmk, order_by FROM ank1
    -> where
    -> gender IN (1, 2, 3) and
    -> kmk IN (1, 2, 3, 12, 13, 23, 123)
    -> group by order_by
    -> order by order_by DESC limit 0, 30;
+----+-------------+-------+-------+---------------+--------+---------+------+------+-----------------------------------------------------------+
| id | select_type | table | type  | possible_keys | key    | key_len | ref  | rows | Extra                                                     |
+----+-------------+-------+-------+---------------+--------+---------+------+------+-----------------------------------------------------------+
|  1 | SIMPLE      | ank1  | index | gender        | gender | 9       | NULL |    6 | Using where; Using index; Using temporary; Using filesort |
+----+-------------+-------+-------+---------------+--------+---------+------+------+-----------------------------------------------------------+
1 row in set (0.00 sec)