KEY分区和HASH分区的区别

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/echo_hello_world/article/details/80693224

KEY分区和HASH分区相似,但是KEY分区支持除text和BLOB之外的所有数据类型的

分区,而HASH分区只支持数字分区,KEY分区不允许使用用户自定义的表达式进行分

区,KEY分区使用系统提供的HASH函数进行分区。当表中存在主键或者唯一键时,如

果创建key分区时没有指定字段系统默认会首选主键列作为分区字列,如果不存在主键

列会选择非空唯一键列作为分区列,注意唯一列作为分区列唯一列不能为null。

展开阅读全文

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

02-18

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

mysql的分区hash分区探讨

05-16

我先说说我的项目需求,我要根据手机号码去查找联系人的信息,手机号码找不到的话再根据邮箱号去查找联系人的信息,这2者都找不到则返回空的信息就行了,我现在的联系人信息表里面有1500万条数据,虽然我在手机号码字段和邮箱字段加了索引,但是查询速度仍然非常慢,所以现在就想到了mysql表的分区。我想到的方法是:这个表不要主键了,主键通过手机号码和邮箱的组合列去分区,hash方法分区,不知道思路是否正确,下面是分区sql语句,各位大神给瞅瞅呗rnrnCREATE TABLE IF NOT EXISTS `temp_fen` (rn `custname` varchar(10) COLLATE utf8_unicode_ci NOT NULL COMMENT '客户姓名',rn `custemail` varchar(60) COLLATE utf8_unicode_ci NOT NULL COMMENT '客户邮箱',rn `custtel` varchar(30) COLLATE utf8_unicode_ci NOT NULL COMMENT '客户电话',rn `provice` varchar(20) COLLATE utf8_unicode_ci NOT NULL COMMENT '省份',rn `city` varchar(20) COLLATE utf8_unicode_ci NOT NULL COMMENT '市',rn `county` varchar(20) COLLATE utf8_unicode_ci NOT NULL COMMENT '县',rn KEY `custemail` (`custemail`),rn KEY `custtel` (`custtel`)rn) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='联系人表' AUTO_INCREMENT=1 partition by hash(custemail,custtel) partitions 5;rnrn因为我看着以前的hash分区语句都是hash(id),类似于这种的,按照一个列分区的,而我的是按照2列分区hash(custemail,custtel),如果感觉我的思路不对,各位也可以说说正确思路,谢谢各位了!rnrn 论坛

没有更多推荐了,返回首页