mysql~關於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類型的字段,並將其應用於分區表的設計中。請注意,在實際應用中,需要根據具體需求和數據特徵來設計和調整哈希函數的邏輯。希朼這個示例能夠幫助你解決問題。如果有任何其他問題,請隨時告訴我。

方法二,添加虛擬字段,失敗而告終

  1. 爲已有表添加虛擬字段
 ALTER TABLE user_attribute_pattern ADD COLUMN user_id_hash2    generated always  varchar(512) AS (CRC32(user_id) % 3)  VIRTUAL;
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個不同的分區中,有助於提高查詢效率和管理大量數據。如果需要進一步瞭解分區規則的具體實現和效果,可以查看錶的分區信息或執行相應的查詢來驗證數據是否按照預期分佈到各個分區中。

分區的操作

  1. 對已經有表分區
ALTER TABLE user_attribute_pattern
PARTITION BY hash(user_id_hash) PARTITIONS 4;
  1. 查看分區信息
SELECT table_name, partition_ordinal_position, partition_method, partition_expression
FROM information_schema.partitions
WHERE table_name = 'users';
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章