上接RANGE分区
HASH分区:
hash分区的目的是将数据均匀的分布到预先定义的各个分区中,保证各分区的数据数量大致一致。在RANGE和LIST分区中,必须明确指定一个给定的列值或列值集合应该保存在哪个分区中;而在HASH分区中,MYSQL自动完成这些工作,用户所要做的只是基于将要被散列的列值指定一个列值或者表达式,以及指定呗分区的表将要被分割成的分区数量。
要使用HAHS分区来分割一个表,要在CREATE TABLE语句上添加一个PARTITION BY HASH(expr)子句,其中“expr”是返回一个整数的表达式。expr可以仅仅是字段类型为整型的列名。此外,用户很可能需要在后面再添加一个PARTITITIONS num子句,其中num是非负的整数,它表示将要被分割成分区的数量。如果没有包含一个PARTITIONS子句,分区数量默认为1.
mysql> create table t_hash (
-> a int,
-> b datetime)
-> partition by hash (YEAR(b))
-> partitions 4;
Query OK, 0 rows affected (0.85 sec)
插入2010-04-01进入表t_hash,那么
MOD(YEAR('2010-04-01'),4)
=MOD(2010,4)
=2
因此该记录会被放入分区p2中。
mysql> insert into t_hash select 1,'2010-01-01';
Query OK, 1 row affected (0.14 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select * from information_schema.partitions
-> where table_schema=database() and table_name='t_hash'\G;
*************************** 1. row ***************************
TABLE_CATALOG: def
TABLE_SCHEMA: test
TABLE_NAME: t_hash
PARTITION_NAME: p0
SUBPARTITION_NAME: NULL
PARTITION_ORDINAL_POSITION: 1
SUBPARTITION_ORDINAL_POSITION: NULL
PARTITION_METHOD: HASH
SUBPARTITION_METHOD: NULL
PARTITION_EXPRESSION: YEAR(b)
SUBPARTITION_EXPRESSION: NULL
PARTITION_DESCRIPTION: NULL
TABLE_ROWS: 0
AVG_ROW_LENGTH: 0
DATA_LENGTH: 16384
MAX_DATA_LENGTH: NULL
INDEX_LENGTH: 0
DATA_FREE: 0
CREATE_TIME: NULL
UPDATE_TIME: NULL
CHECK_TIME: NULL
CHECKSUM: NULL
PARTITION_COMMENT:
NODEGROUP: default
TABLESPACE_NAME: NULL
*************************** 2. row ***************************
TABLE_CATALOG: def
TABLE_SCHEMA: test
TABLE_NAME: t_hash
PARTITION_NAME: p1
SUBPARTITION_NAME: NULL
PARTITION_ORDINAL_POSITION: 2
SUBPARTITION_ORDINAL_POSITION: NULL
PARTITION_METHOD: HASH
SUBPARTITION_METHOD: NULL
PARTITION_EXPRESSION: YEAR(b)
SUBPARTITION_EXPRESSION: NULL
PARTITION_DESCRIPTION: NULL
TABLE_ROWS: 0
AVG_ROW_LENGTH: 0
DATA_LENGTH: 16384
MAX_DATA_LENGTH: NULL
INDEX_LENGTH: 0
DATA_FREE: 0
CREATE_TIME: NULL
UPDATE_TIME: NULL
CHECK_TIME: NULL
CHECKSUM: NULL
PARTITION_COMMENT:
NODEGROUP: default
TABLESPACE_NAME: NULL
*************************** 3. row ***************************
TABLE_CATALOG: def
TABLE_SCHEMA: test
TABLE_NAME: t_hash
PARTITION_NAME: p2
SUBPARTITION_NAME: NULL
PARTITION_ORDINAL_POSITION: 3
SUBPARTITION_ORDINAL_POSITION: NULL
PARTITION_METHOD: HASH
SUBPARTITION_METHOD: NULL
PARTITION_EXPRESSION: YEAR(b)
SUBPARTITION_EXPRESSION: NULL
PARTITION_DESCRIPTION: NULL
TABLE_ROWS: 1
AVG_ROW_LENGTH: 16384
DATA_LENGTH: 16384
MAX_DATA_LENGTH: NULL
INDEX_LENGTH: 0
DATA_FREE: 0
CREATE_TIME: NULL
UPDATE_TIME: NULL
CHECK_TIME: NULL
CHECKSUM: NULL
PARTITION_COMMENT:
NODEGROUP: default
TABLESPACE_NAME: NULL
*************************** 4. row ***************************
TABLE_CATALOG: def
TABLE_SCHEMA: test
TABLE_NAME: t_hash
PARTITION_NAME: p3
SUBPARTITION_NAME: NULL
PARTITION_ORDINAL_POSITION: 4
SUBPARTITION_ORDINAL_POSITION: NULL
PARTITION_METHOD: HASH
SUBPARTITION_METHOD: NULL
PARTITION_EXPRESSION: YEAR(b)
SUBPARTITION_EXPRESSION: NULL
PARTITION_DESCRIPTION: NULL
TABLE_ROWS: 0
AVG_ROW_LENGTH: 0
DATA_LENGTH: 16384
MAX_DATA_LENGTH: NULL
INDEX_LENGTH: 0
DATA_FREE: 0
CREATE_TIME: NULL
UPDATE_TIME: NULL
CHECK_TIME: NULL
CHECKSUM: NULL
PARTITION_COMMENT:
NODEGROUP: default
TABLESPACE_NAME: NULL
4 rows in set (0.04 sec)
可以看到P2分区有一条记录。当前这个例子并不能把数据均匀的分布到各个分区,因为按照YEAR函数进行的,该值本身是离散的。如果对连续的值进行HASH分区,如自增长的主键,则可以较好地将数据平均分布。
MYSQL还支持一种LINEAR HASH分区,分区算法不一样,算法如下:
mysql> create table t_hash (
-> a int,
-> b datetime)
-> partition by linear hash (YEAR(b))
-> partitions 4;
取大于分区数量4的下一个2的幂值V,V=POWER(2,CEILING(LOG(2,num)))=4
所在分区N=YEAR('2010-04-01')&(V-1)=2.
LINEAR HASH分区的优点在于增加、删除、合并和拆分分区将变得更加快捷,有利于处理含有
大量数据的表。缺点在于,与使用HASH分区得到的数据分布相比,各个分区间数据的分布可能不大均衡。
相关推荐
2. **InnoDB存储引擎**:MySQL 5.6对InnoDB进行了大量改进,如支持自适应hash索引,这允许数据库自动创建hash索引来加速查询。此外,还引入了多线程插入,提高了并发插入性能。 3. **Full-Text Search增强**:MySQL...
3. **分区功能**:增强了对分区表的支持,允许更大规模的数据管理和分析。 4. **复制改进**:引入了半同步复制,确保主库上的事务在被复制到从库之前已提交,提高了数据一致性。 5. **查询优化器**:新的查询优化...
哈希连接(Hash Join) 克隆插件 (Clone Plugin) 在JSON函数中使用多值索引(JSON functions using multi-valued indexes) MySQL shell (管理MGR的MySQL客户端 ) Innodb Cluster (来自官方的MGR产品解决...
它引入了自适应哈希索引(Adaptive Hash Index)和双读缓冲区(Double Write Buffer),提高了数据一致性和可靠性。 2. **查询性能提升**:MySQL 5.7引入了Query Optimizer改进,如Cascading Ref优化器和更智能的...
MySQL存储分区是数据库管理系统中一种优化查询性能和管理大量数据的技术。通过将大表分成多个较小、更易管理和处理的部分,存储分区可以提高查询效率,减少维护成本,并有助于数据的组织和备份。以下是对实验内容的...
9. **分区表改进**:支持更多的分区类型和更灵活的分区策略,便于管理和查询大型表。 10. **MySQL Shell**:提供了一个统一的交互式环境,集成了命令行、JavaScript和Python接口,方便用户进行数据库管理、脚本编写...
3. **分区功能增强**:支持更多的分区类型,如线性键值分区,使得数据管理和查询更加灵活。 4. **Full-text Search**:全文搜索功能得到了改进,支持对部分单词的搜索和更丰富的查询语法。 5. **复制功能**:主从...
3. **分区表**:MySQL 5.5增强了分区表功能,支持更多的分区策略,如线性哈希分区,使得大数据管理更为高效。 4. **并行复制**:MySQL 5.5引入了半同步复制(Semi-Synchronous Replication),确保主服务器上的事务...
4. **Partitioning(分区)增强**:MySQL 5.5 提供了更灵活的分区选项,如线性 Hash 和范围分区,有助于管理大型表和提高查询速度。 5. **存储引擎多样化**:除了 InnoDB,MySQL 还支持 MyISAM、MEMORY、ARCHIVE 等...
5. **分区**:在大型数据库中,MySQL 5.5支持表分区,将大表逻辑上划分为较小、更易管理的部分,以提升查询性能。 6. **触发器和存储过程**:MySQL支持创建触发器,可以在特定事件(如INSERT、UPDATE或DELETE)发生...
- **分区表的增强**:支持更多的分区类型和更灵活的分区操作,有助于大数据管理和查询优化。 2. **安装与配置**: - 解压"mysql-5.6.44-winx64.zip"后,你需要根据MySQL提供的安装指南进行安装。这通常包括设置...
另外,InnoDB实现了自适应hash索引,能自动优化索引的使用,提高查询速度。 3. **并行复制**: 在这个版本中,MySQL开始支持半同步复制(Semi-Synchronous Replication),确保至少有一个从服务器接收到主服务器的...
- **定义**:Hash分区使用哈希函数计算出一个数值,并根据该数值将数据分配到不同的分区中。适用于没有明显范围划分的数据。 - **适用场景**:对于那些无法根据具体值范围进行分区的表,或者需要均衡分布数据的场景...
3. **分区表优化**:支持更多的分区类型,如线性哈希分区,增强了数据管理和查询效率。 4. **复制功能**:增强了半同步复制,确保数据在主从节点间的一致性,并提供了更灵活的复制拓扑结构。 5. **查询优化器**:...
- **KEY分区**:类似于HASH分区,但仅支持计算一列或多列,并且MySQL提供了自己的哈希函数。这种方式同样适用于均匀分布数据。 - **复合分区**:可以在RANGE/LIST类型的分区表的基础上进一步进行子分区。子分区...
针对大规模数据存储,MySQL 提供了一种高效的管理策略——分区(Partitioning),这有助于提高查询性能,尤其是在处理海量数据时。分区是将一个大表划分为逻辑上独立的部分,每个部分(或称为分区)可以在物理上分散...
5. **分区功能增强**:MySQL 5.6扩展了表的分区功能,支持更多的分区类型,如线性哈希和RANGE COLUMNS,提高了大数据量处理的能力。 6. **查询优化器改进**:优化器现在可以更智能地选择执行计划,包括基于成本的...
4. **KEY 分区**:与 HASH 分区相似,但使用 MySQL 自己的哈希函数,适用于整数列。 下面是一些分区创建的例子: 1. **RANGE 分区示例**: ```sql CREATE TABLE t_range ( id INT(11), money INT(11) UNSIGNED ...
Oracle分区表中的Hash分区是一种基于哈希算法的分区策略,适用于处理无法清晰定义分区范围的大型数据表。这种分区方式通过计算分区键的哈希值来决定数据存储在哪个分区,以此达到数据分散和负载均衡的目的。Hash分区...