Kri*_*tai 5 mysql sql group-by query-optimization
有谁知道为什么基于MyISAM的表没有GROUP BY优化?(我正在使用这个版本:5.1.49-3)
CREATE TABLE `_test2_innodb` (
`i` int(10) unsigned NOT NULL AUTO_INCREMENT,
`n` smallint(5) unsigned NOT NULL,
`t` int(10) unsigned NOT NULL,
`v` smallint(6) NOT NULL,
PRIMARY KEY (`i`),
KEY `i_n` (`n`),
KEY `i_t` (`t`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `_test2_myisam` (
`i` int(10) unsigned NOT NULL AUTO_INCREMENT,
`n` smallint(5) unsigned NOT NULL,
`t` int(10) unsigned NOT NULL,
`v` smallint(6) NOT NULL,
PRIMARY KEY (`i`),
KEY `i_n` (`n`),
KEY `i_t` (`t`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
Run Code Online (Sandbox Code Playgroud)
SELECT MAX(i) FROM _test2_myisam GROUP BY n;
SELECT MAX(i) FROM _test2_innodb GROUP BY n;
Run Code Online (Sandbox Code Playgroud)
id, select_type, table, type, poss_keys, key, key_len, ref, rows, extra
1, SIMPLE, _test2_myisam , ALL, , , , , 19998, Using temporary; Using filesort
1, SIMPLE, _test2_innodb, index, , i_n, 2, , 20024, Using index
Run Code Online (Sandbox Code Playgroud)
问题是,如果我使用的MyISAM,全表扫描会做,这需要对大型表...和MySQL文档小时没有提及有不同的实现(表发动机什么的http://开发. mysql.com/doc/refman/5.0/en/group-by-optimization.html).有谁知道为什么内部处理不同?
(注意:不,切换到InnoDB不是一个好的解决方案)谢谢
尽管定义看似相同,但这两个表之间的区别在于MyISAM表是“堆”,而InnoDB表是聚集组织的表,例如聚集索引是表(通常是主键,(i)这里是索引)。
导致执行计划不同的另一个区别是,在 InnoDB 中,所有非聚集索引((n)在本例中为您的索引)还包括聚集索引的列((i)在本例中为 ),因此不需要全表扫描。
换句话说,(n)InnoDB索引大致相当于(n, PK)MyISAM索引。
MyISAM 引擎必须执行全表扫描或索引的索引扫描(n),然后还扫描表(以获取i列的值)。因此,它选择第一个计划(全面扫描+文件排序以查找最大值)。
(n, i)在MyISAM表中添加索引后再次进行测试:
ALTER TABLE _test2_myisam
ADD INDEX n_i (n, i) ;
Run Code Online (Sandbox Code Playgroud)