【发布时间】:2012-10-20 20:06:48
【问题描述】:
问题
有谁知道为什么基于 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
测试查询
SELECT MAX(i) FROM _test2_myisam GROUP BY n;
SELECT MAX(i) FROM _test2_innodb GROUP BY n;
结果
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
问题是,如果我使用 MyISAM,将完成一次全表扫描,这在大型表上需要几个小时......而且 MySQL 文档没有提到任何关于具有不同实现的表引擎(http://dev.mysql.com/doc/refman/5.0/en/group-by-optimization.html )。有谁知道为什么内部处理方式不同?
(注意:不,切换到 InnoDB 不是一个好的解决方案) 谢谢
【问题讨论】:
-
这两个测试表具有相同的定义,除了使用的表引擎。当我运行测试时,这两个表中的数据也是相同的。还有什么我应该看的吗?
-
在这一年和今天,几乎没有理由使用 MyISAM。引擎内部有自己的数据结构,并且可以做额外的工作,这样 MySQL 核心就不必这样做了。至于为什么 MyISAM 没有或确实有 - 您必须询问代码的创建者或咨询源代码。
-
“在这一天和这一年,几乎没有理由使用 MyISAM” MyISAM 有很多优点,而 InnoDB 没有。例如,我们构建了使用/严重依赖地理空间数据的移动应用程序。例如,表上的地理空间索引在 InnoDB 中不存在。而我们的服务/代码一直在利用它,因此获得了巨大的性能提升......
-
@Kristof:你说得对,这是 InnoDB 的两个限制之一:空间和全文搜索。
-
全文存在,但是是的,地理空间索引不存在。我不会讨论如何实现类似的功能,但事实仍然是 InnoDB 在使用内存和 I/O 方面要好得多,并且做了很多工作,因此 MySQL 核心不必这样做。就我个人而言,我从未使用过地理空间索引或处理过地理空间数据,因此我在该领域不了解我的知识,因此我不推荐解决方法。
标签: mysql sql group-by query-optimization