请教关于MYSQL的hash分区和range分区的问题

gxk9933 gxk9933 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
场景:
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分区的表,这是为什么?

...全文

相关推荐

MySQL优化之分区表

当数据库数据量涨到一定数量时,性能就成为我们不能不关注的问题,如何优化呢? 常用的方式不外乎那么几种:   1、分表,即把一个很大的表达数据分到几个表中,这样每个表数据都不多。     优点:提高并发量,减小锁的粒度     缺点:代码维护成本高,相关sql都需要改动   2、分区,所有的数据还在一个表中,但物理存储数据根据一定的规则存放在不同的文件中,文件也可以放到另外磁盘上     优点:代码维护量小,基本不用改动,提高IO吞吐量     缺点:表的并发程度没有增加   3、拆分业务,这个本质还是分表。     优点:长期支持更好     缺点:代码逻辑重构,工作量很大   当然,每种情况

weixin_38644780

MySQL分表和分区的具体实现方法

主要介绍了MySQL分表和分区的具体实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

weixin_38670531

基于MySQL分区性能的详细介绍

一,      分区概念  分区允许根据指定的规则,跨文件系统分配单个表的多个部分。表的不同部分在不同的位置被存储为单独的表。MySQL从5.1.3开始支持Partition。 分区和手动分表对比 手动分表  分区 多张数据表 一张数据表 重复数据的风险 没有数据重复的风险 写入多张表 写入一张表 没有统一的约束限制 强制的约束限制   MySQL支持RANGE,LIST,HASH,KEY分区类型,其中以RANGE最为常用: Range(范围)–这种模式允许将数据划分不同范围。例如可以将一个表通过年份划分成若干个分区。 Hash(哈希)–这中模式允许通过对表的一个或多个列的Has

weixin_38612811

mysql的分区技术详细介绍

主要介绍了mysql的分区技术详细介绍,本文讲解了分区技术概述、分区的类型及分区操作等内容,需要的朋友可以参考下

weixin_38678172

MYSQL 通过分区(Partition)提升MySQL性能

MYSQL 通过分区(Partition)提升MySQL性能,看清楚,不要浪费分数,是MYSQL,不是SQL SERVER2000,有需要的可以下载.

zelie
评论 8
收藏 已收藏
分享
返回顶部
gxk9933
MySQL 57,062 成员 56,759 内容