繁体   English   中英

MySQL GROUP BY优化 - InnoDB vs MyISAM?

[英]MySQL GROUP BY optimization - InnoDB vs MyISAM?

有谁知道为什么基于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表是“堆”,而InnoDB表是聚类组织表,例如聚簇索引是表(通常是主键,这里是(i)索引)。

引起不同执行计划的另一个区别在于,在InnoDB中,所有非聚集索引(在这种情况下是你的(n)索引),也包括聚集索引的列,在这种情况下是(i) ,所以没有需要全表扫描。

换句话说, (n) InnoDB索引大致相当于(n, PK) MyISAM索引。

MyISAM引擎必须执行全表扫描或(n)索引的索引扫描,然后扫描表(以获取i列的值)。 因此,它选择第一个计划(全扫描+ filesort来查找MAX值)。


在MyISAM表中添加(n, i)索引后再次进行测试:

ALTER TABLE _test2_myisam
    ADD INDEX n_i (n, i) ;

这是因为InnoDB基于主键以索引组织的方式存储。 因此,表扫描和主键扫描将完全相同。 不幸的是,对于MyISAM,情况并非如此,它将不得不做一个文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM