MySQL-group by仅可使用;文件排序“;及;使用“临时”命令;?
有没有办法在MySQL中不使用“文件排序”和“使用临时”而使用GROUPBY?尝试了不同的索引、不同的broup by、不同的order by,但结果总是一样——“使用filesort”或“使用filesort+使用临时” 即使同一列中的group by和order 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
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)