首页 > 数据库 >mysql~关于mysql分区表的测试

mysql~关于mysql分区表的测试

时间:2024-03-13 17:58:05浏览次数:25  
标签:hash 哈希 attribute 分区 分区表 user 测试 mysql 主键

在MySQL 8.0中,可以通过创建自定义哈希函数来处理VARCHAR类型的字段,以便用作分区键。下面是一个简单的示例,演示如何在MySQL8.0中创建自定义哈希函数来处理VARCHAR类型的字段

  • 分区后的表效果

方法一,可能无效

步骤:

  1. 创建自定义哈希函数:
DELIMITER //

CREATE FUNCTION custom_hash(str VARCHAR(255)) RETURNS INT
DETERMINISTIC
BEGIN
    DECLARE hash_val INT;
    SET hash_val = 0;
    
    -- 计算字符串的哈希值
    SET hash_val = CRC32(user_id) % 3;
    RETURN hash_val;
END//

DELIMITER ;

在上面的示例中,我们创建了一个名为custom_hash的自定义哈希函数,接受一个VARCHAR类型的参数,并返回一个整数类型的哈希值。这里使用了MD5算法计算字符串的哈希值,并将其转换为有符号整数。

  1. 使用自定义哈希函数进行分区:
CREATE TABLE user_attribute (
    user_id VARCHAR(50),
    attribute_name VARCHAR(50),
    attribute_value VARCHAR(255),
    PRIMARY KEY (user_id, attribute_name)
) PARTITION BY HASH(custom_hash(user_id)) PARTITIONS 4;

在上面的示例中,我们创建了一个名为user_attribute的表,并使用自定义哈希函数custom_hashuser_id字段进行哈希计算,然后将结果用作分区键进行分区。

通过以上步骤,你可以自定义一个哈希函数来处理VARCHAR类型的字段,并将其应用于分区表的设计中。请注意,在实际应用中,需要根据具体需求和数据特征来设计和调整哈希函数的逻辑。希朼这个示例能够帮助你解决问题。如果有任何其他问题,请随时告诉我。

方法二,虚拟字段

 ALTER TABLE user_attribute_pattern ADD COLUMN user_id_hash2    generated always  varchar(512) AS (CRC32(user_id) % 3)  VIRTUAL;

对已经有表分区

ALTER TABLE user_attribute_pattern
PARTITION BY hash(user_id_hash) PARTITIONS 4;

查看分区信息

SELECT table_name, partition_ordinal_position, partition_method, partition_expression
FROM information_schema.partitions
WHERE table_name = 'users';

方法一和方法二产生的问题和错误

  1. 需要hash分区时,分区字段必须是整型
  2. 分区字段必须是主键字段,多主键时,分区字符是其中一个主键
# 虚拟字段的建立
drop table user_attribute_pattern;
CREATE TABLE `user_attribute_pattern` (
  `NAME` varchar(255) ,
  `VALUE` varchar(255),
  `USER_ID` varchar(36) ,
  `ID` varchar(36),
	`user_id_hash` int(11)  generated always  AS (CRC32(user_id) % 4) virtual,
  PRIMARY KEY (`ID`) USING BTREE,
  INDEX `IDX_USER_ATTRIBUTE2`(`USER_ID`) USING BTREE,
  INDEX `IDX_NAME2`(`NAME`) USING BTREE,
  INDEX `IDX_VALUE2`(`VALUE`) USING BTREE
) 
 

最后相互矛盾,没有实现

  • 因为我的主键是varchar的,而hash分区表的键需要是int的
  • 所以我要把它添加一个虚拟字段取主键的hash值
  • 然后经过这些步骤之后,又需要把这个虚拟key添加为主键,当mysql又提示了,虚拟字段不能设为主键

最后可能需要把VIRTUAL这个虚拟的键变成STORE存储的键才行了

最后直接用KEY的方式,它是支持字符串的

事实上,它是mysql内部对这个varchar进行了hash的计算,咱们上面的测试多次一举了!

ALTER TABLE user_attribute_copy1
PARTITION BY KEY(ID) PARTITIONS 5;

根据你提供的代码,针对表 user_attribute_copy1 进行了分区设置。在这段代码中,使用的是 KEY(ID) 来定义分区规则,其中 ID 是主键。根据这个规则,表 user_attribute_copy1 将会以主键 ID 作为分区字段进行分区,共分为5个分区。

在MySQL中,使用 KEY 关键字指定主键作为分区键,表示根据主键的值来进行分区。具体地说,MySQL会根据主键的哈希值或者范围值来将数据行分配到不同的分区中。在这种情况下,如果主键 IDvarchar 类型,MySQL会根据该字段的值进行哈希或范围分区,将数据均匀地分布到5个分区中。

总的来说,这个分区规则会根据表的主键 ID 的值来进行分区,将数据分散存储到5个不同的分区中,有助于提高查询效率和管理大量数据。如果需要进一步了解分区规则的具体实现和效果,可以查看表的分区信息或执行相应的查询来验证数据是否按照预期分布到各个分区中。

标签:hash,哈希,attribute,分区,分区表,user,测试,mysql,主键
From: https://www.cnblogs.com/lori/p/18071189

相关文章

  • pytest测试框架基本使用
    一、pytest测试框架简介pytest是Python中的单元测试框架1、pytest特点:。容易上手,入门简单,丰富的文档资料,文档中有很多实例可进行参考。支持参数化。执行用例过程中可以进行标记跳过用例,标记失败用例。支持重复执行失败的用例。具有很多的第三方插件,并且可以实现自定义......
  • 不使用telnet进行端口测试的方法
    不使用telnet进行端口测试的方法 测试通过样例[root@ip203~]#curl-v10.0.0.210:8082*Abouttoconnect()to10.0.0.210port8082(#0)*Trying10.0.0.210...*Connectedto10.0.0.210(10.0.0.210)port8082(#0)>GET/HTTP/1.1>User-Agent:curl/7.29......
  • Mysql之事务
    前言本文通过实验实现Mysql的事务的创建、回滚。通过实验验证事务不同的隔离级别的区别。Mysql事务事务(Transaction)是一组SQL组成的执行单元(Unit),是数据库并发控制和恢复回滚的基本单位。一个事务中可能包含多个SQL,要么都失败,要么都成功。把需要保证原子性、隔离性、一致性......
  • mysql 刷题
    按日期分组销售产品表Activities:+-------------+---------+|列名|类型|+-------------+---------+|sell_date|date||product|varchar|+-------------+---------+该表没有主键(具有唯一值的列)。它可能包含重复项。此表的每一行都包......
  • Mysql优化之optimize table
    起因出于于性能考虑,生产上采用冷热库的方式,热库中保存最近的数据,每隔一段时间自动备份到冷库中并从热库中删除。但时间久了之后,就会发现磁盘占用量越来越大。主要原因就是delete语句只是将记录的位置标记为“可复用”,但磁盘空间并不会直接回收。解决方案使用optimizetable命令......
  • MySQL索引
    索引是帮助MySQL高效获取数据的数据结构一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是存储在磁盘上的文件中的(可能存储在单独的索引文件中,也可能和数据一起存储在数据文件中)。通常所说的索引,包括聚簇索引、覆盖索引、组合索引、前缀索引、唯一索引等,没有特别说......
  • MYSQL- 使用SQL99 实现7种JOIN 操作
    DESCemployees; DESCdepartments;   ##中图就是内连接SELECTlast_name,department_nameFROMemployeeseJOINdepartmentsdONe.department_id=d.department_id##sql99内连接SELECTlast_name,department_name,cityFROMemployeeseINNERJOIN......
  • dd测试服务器读写速度
     网上dd命令的文章有很多,这里只是自己做下简单的记录。dd命令介绍作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。可以用于测试磁盘命令、数据备份或恢复等。dd命令用于复制文件并对原文件的内容进行转换和格式化处理。用的比较多的还是用dd来备份裸设备。......
  • MYSQL 主从不一致的原因分析
    数据库作为存储数据的组件,数据的一致性一定是要保证的前提,今天给出两个场景来分析数据不一致的原因。binlog同步模式导致主从不一致在MYSQL中主库向从库同步数据是利用binlog记录修改操作,然后将binlog传递给从库进行复制,binlog的格式有3种,row在对update,delete,insert语句进行......
  • 【自动化测试入门】用Airtest - Selenium对Firefox进行自动化测试(0基础也能学会)
    1.前言本文将详细介绍如何使用AirtestIDE驱动Firefox测试,以及脱离AirtestIDE怎么驱动Firefox(VScode为例)。看完本文零基础小白也能学会Firefox浏览器自动化测试!!!2.如何使用AirtestIDE驱动Firefox浏览器对于Web自动化测试,目前AirtestIDE支持chrome浏览器和Firefox2种浏览器,今天......