请教关于MYSQL的hash分区和range分区的问题
场景:
CREATE TABLE IF NOT EXISTS `stream` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
`type` int(10) unsigned NOT NULL COMMENT '流水类型',
`ext_1` bigint(20) unsigned NOT NULL COMMENT '扩展字段1 [相关id、相关值]',
`ext_2` bigint(20) unsigned NOT NULL COMMENT '扩展字段2 [相关id、相关值]',
`datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '发生时间',
PRIMARY KEY (`id`,`time`),
KEY `idx_type` (`type`),
KEY `idx_time` (`time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY HASH (TO_DAYS(`datetime`))
PARTITIONS 360;
CREATE TABLE IF NOT EXISTS `stream_new` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
`type` int(10) unsigned NOT NULL COMMENT '流水类型',
`ext_1` bigint(20) unsigned NOT NULL COMMENT '扩展字段1 [相关id、相关值]',
`ext_2` bigint(20) unsigned NOT NULL COMMENT '扩展字段2 [相关id、相关值]',
`datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '发生时间',
PRIMARY KEY (`id`,`time`),
KEY `idx_type` (`type`),
KEY `idx_time` (`time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY RANGE (to_days(datetime)) (
PARTITION p20130202 VALUES LESS THAN (to_days('20130202')),
PARTITION p20130203 VALUES LESS THAN (to_days('20130203')),
PARTITION p20130204 VALUES LESS THAN (to_days('20130204')),
PARTITION p20130205 VALUES LESS THAN (to_days('20130205')),
PARTITION p20130206 VALUES LESS THAN (to_days('20130206')),
.
.
.#一直向后300天
.
PARTITION pn VALUES LESS THAN MAXVALUE
)
也就是上面两个表结构是相同的,但一个使用hash分区,另一个使用range分区
现在表stream中有2000万条数据,我将数据导入stream_new中
接下来我的测试:
第一步、然后我使用sql语句,对两个表进行分析
explain partitions SELECT * FROM `stream` where `datetime` > '2013-02-17'order by `datetime` limit 10;
explain partitions SELECT * FROM `stream_new` where `datetime` > '2013-02-17'order by `datetime` limit 10;
发现stream会查询所有的分区,而stream_new只会查询2013-02-17后的分区
我去掉上面两个语句中的explain partitions进行执行,前一个语句执行了20s,而后一个只用了不到1s
问题:为什么hash分区的查询速度会慢于range分区,我在网上查了一些资料,hash分区也是根据取模将数据放入不同分区中,为什么我根据分区字段去查询,也会扫描所有分区。还有一种说法据说对分区的查询时并发的,是这样的吗?
第二步、我把上面查询条件中的where语句`datetime` > '2013-02-17'去掉,又进行了一遍查询,前后者的时间基本没有变化
问题:没有按分区定义字段进行过滤查询,为什么查询速度没有变慢。
我还有另一个表结构与上面的表基本相同,我没有建立分区,只是有索引,数据量也有1000万多,做各种查询的速度明显优于使用了hash分区的表,这是为什么?