關於 web service, unity, blogger 等軟體工程筆記

MariaDB (MySQL) UUID 優化之儲存方式 (storage)

Edit icon 沒有留言
MariaDB

最近專案的資料庫調整,由於有使用到 UUID,再煩惱怎麼要儲存減少資料量,讓之後的索引建置能夠更有效率,原先的儲存方式為 char(36) 想必是超級浪費空間的作法。

關於 UUID 以及調整函數

UUID,Universally unique identifier,是使用 128 bits 長度來描敘其 ID,因此最少的儲存空間需要 16 bytes,但在規範的標準型式中,會以 32 個十六進位數字,以連字號 (hyphens) 分成 (8-4-4-4-12) 共 36 個字元顯示。例如:

123e4567-e89b-12d3-a456-426655440000

但直接存 UUID 字串顯得沒有效率,應該轉換成二進位 (binary) 儲存,因此參考網路上的資料,建立以下兩個函數來使用。

由 UUID 字串到二進位,UUID_TO_BIN:

CREATE FUNCTION `UUID_TO_BIN` (`uuid` char(36) CHARACTER SET 'ascii')
RETURNS binary(16) DETERMINISTIC
RETURN unhex(replace(uuid,'-',''))

由 UUID 二進位到字串,UUID_FROM_BIN:

DELIMITER |
CREATE FUNCTION `UUID_FROM_BIN` (`uuid` binary(16))
RETURNS char(36) CHARACTER SET 'ascii' DETERMINISTIC
BEGIN
DECLARE hex CHAR(32);
SET hex = HEX(uuid);
RETURN LOWER(CONCAT(SUBSTR(hex, 1, 8), '-', SUBSTR(hex, 9, 4), '-', SUBSTR(hex, 13, 4), '-', SUBSTR(hex, 17, 4), '-', SUBSTR(hex, 21)));
END
|
DELIMITER ;

新增函數錯誤

但實務上在 AWS RDS 上,嘗試建立這兩個函數時,卻會跳出以下錯誤:

Error in query (1419): You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

原來只是資料庫參數設定問題,按照這份指南,在 RDS Parameter Groups 中,調整 log_bin_trust_function_creators 為 1,並且重新套用該參數設定,便可以成功建立這兩個函數。

Reference

沒有留言: