H2 數據庫中的加密與壓縮及分區表相關關鍵字

在 H2 數據庫的安全與高性能場景中,加密關鍵字保障數據存儲和傳輸安全,壓縮關鍵字減少存儲佔用,分區表關鍵字則通過數據分片提升查詢效率。這三類關鍵字覆蓋了數據安全、存儲優化和性能提升的核心需求,讓 H2 在敏感數據存儲、大數據量場景中更具競爭力。

一、加密相關關鍵字

H2 提供了數據加密和連接加密能力,ENCRYPTED、PASSWORD、ENCRYPT、DECRYPT等關鍵字從存儲和傳輸層面守護數據安全,適合處理手機號、身份證號等敏感信息。

1. 數據庫文件加密(創建加密數據庫)

創建數據庫時,通過ENCRYPTED指定加密算法,PASSWORD設置加密密碼,確保數據文件存儲在磁盤上時是加密狀態:

-- 連接時指定加密參數(JDBC URL格式)
-- jdbc:h2:file:D:/h2/encrypted_db;ENCRYPTED=AES;PASSWORD=MyStrongPassword123!

對應的 SQL 語句創建加密表(依賴數據庫加密環境):

-- 在加密數據庫中創建敏感信息表
CREATE TABLE user_sensitive_info (
    user_id INT PRIMARY KEY,
    id_card VARCHAR(20) NOT NULL, -- 加密存儲身份證號
    phone VARCHAR(15) NOT NULL    -- 加密存儲手機號
);

數據庫文件會以 AES 算法加密,無密碼無法讀取,即使文件被竊取也能保障數據安全。

2. 字段級加密(敏感字段單獨加密)

使用ENCRYPT函數加密字段值,DECRYPT函數解密,適合僅需加密部分敏感字段的場景,密鑰由用户自行管理:

-- 插入數據時加密敏感字段(密鑰為自定義字符串)
INSERT INTO user_sensitive_info (user_id, id_card, phone)
VALUES (
    1,
    ENCRYPT('AES', 'MyFieldKey456!', '110101199001011234'),
    ENCRYPT('AES', 'MyFieldKey456!', '13800138000')
);

-- 查詢時解密字段
SELECT 
    user_id,
    DECRYPT('AES', 'MyFieldKey456!', id_card) AS id_card,
    DECRYPT('AES', 'MyFieldKey456!', phone) AS phone
FROM user_sensitive_info;

支持的加密算法包括 AES、DES 等,密鑰需妥善保管,丟失後無法解密數據。

3. 連接加密(SSL/TLS)

通過SSL=true開啓連接加密,確保客户端與數據庫之間的傳輸數據不被竊聽或篡改(JDBC URL 參數):

-- jdbc:h2:tcp://localhost:9092/encrypted_db;SSL=true;ENCRYPTED=AES;PASSWORD=MyStrongPassword123!

配合數據庫文件加密,實現 “存儲 + 傳輸” 雙重安全保障。

二、壓縮相關關鍵字

H2 支持對錶數據進行壓縮存儲,COMPRESS關鍵字減少磁盤佔用,尤其適合文本數據多、存儲量大的表,且不影響查詢邏輯。

1. 創建壓縮表

創建表時指定COMPRESS參數,支持ZLIB或LZ4算法(ZLIB 壓縮率更高,LZ4 速度更快):

-- 創建ZLIB壓縮的日誌表(文本數據多,適合壓縮)
CREATE TABLE system_logs (
    log_id BIGINT PRIMARY KEY AUTO_INCREMENT,
    log_time TIMESTAMP NOT NULL,
    log_content VARCHAR(2000) NOT NULL,
    log_level VARCHAR(10) NOT NULL
) COMPRESS ZLIB;

-- 創建LZ4壓縮的大字段表(追求壓縮/解壓速度)
CREATE TABLE large_text_data (
    data_id INT PRIMARY KEY,
    content CLOB NOT NULL -- 大文本字段,壓縮效果明顯
) COMPRESS LZ4;

壓縮表的插入、查詢操作與普通表完全一致,無需修改 SQL 語句:

-- 插入數據(自動壓縮存儲)
INSERT INTO system_logs (log_time, log_content, log_level)
VALUES (CURRENT_TIMESTAMP, '用户登錄成功,IP:192.168.1.100', 'INFO');

-- 查詢數據(自動解壓,透明訪問)
SELECT * FROM system_logs WHERE log_level = 'INFO';

2. 壓縮表性能説明

  • 適合場景:文本數據、大字段(VARCHAR、CLOB、BLOB)、數據量大且讀寫頻率適中的表。

  • 注意事項:壓縮 / 解壓會消耗少量 CPU 資源,高頻寫入的表(如秒殺訂單表)不建議使用,避免 CPU 瓶頸。

三、分區表相關關鍵字

H2 支持按字段對錶進行分區(分片),PARTITION BY關鍵字將數據分散到多個物理分區中,查詢時僅掃描目標分區,提升大數據量下的查詢速度。

1. 按範圍分區(常用場景:時間分區)

按日期、數值等範圍分區,比如將訂單表按年月分區,查詢特定時間段訂單時僅掃描對應分區:

-- 創建按訂單時間範圍分區的訂單表
CREATE TABLE orders_partition (
    order_id BIGINT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    order_time TIMESTAMP NOT NULL,
    pay_amount DECIMAL(10,2) NOT NULL
) PARTITION BY RANGE (YEAR(order_time), MONTH(order_time)) (
    PARTITION p202301 VALUES LESS THAN (2023, 2),
    PARTITION p202302 VALUES LESS THAN (2023, 3),
    PARTITION p202303 VALUES LESS THAN (2023, 4),
    PARTITION p202401 VALUES LESS THAN (2024, 2),
    PARTITION p_other VALUES LESS THAN (MAXVALUE, MAXVALUE) -- 兜底分區
);

插入數據時,H2 自動根據order_time分配到對應分區:

-- 自動插入p202401分區
INSERT INTO orders_partition (user_id, order_time, pay_amount)
VALUES (1, '2024-01-15 10:30:00', 299.99);

-- 自動插入p_other分區
INSERT INTO orders_partition (user_id, order_time, pay_amount)
VALUES (2, '2024-03-20 14:20:00', 599.99);

查詢 2024 年 1 月的訂單時,僅掃描p202401分區,避免全表掃描:

SELECT * FROM orders_partition 
WHERE YEAR(order_time) = 2024 AND MONTH(order_time) = 1;

2. 按列表分區(適合離散值分組)

按字段的離散值分區,比如將商品表按分類 ID 分區:

CREATE TABLE products_partition (
    product_id INT PRIMARY KEY,
    product_name VARCHAR(100) NOT NULL,
    category_id INT NOT NULL,
    price DECIMAL(10,2) NOT NULL
) PARTITION BY LIST (category_id) (
    PARTITION p_electronics VALUES IN (1, 2, 3), -- 電子類(分類1-3)
    PARTITION p_lifestyle VALUES IN (4, 5),       -- 生活類(分類4-5)
    PARTITION p_other VALUES IN (DEFAULT)         -- 其他分類
);

查詢電子類商品時,僅掃描p_electronics分區,效率大幅提升。

3. 分區管理關鍵字

  • 添加分區:當需要擴展新分區時(如新增 2024 年 2 月訂單分區):
ALTER TABLE orders_partition ADD PARTITION p202402 VALUES LESS THAN (2024, 3);
  • 刪除分區:刪除歷史數據時,直接刪除分區(比 DELETE 語句快無數倍):
-- 刪除2023年1月的分區及數據
ALTER TABLE orders_partition DROP PARTITION p202301;

這些加密、壓縮和分區表相關關鍵字,從安全、存儲、性能三個維度優化 H2 數據庫的使用體驗。加密關鍵字守護敏感數據,壓縮關鍵字降低存儲成本,分區表關鍵字解決大數據量查詢慢的問題。在實際應用中,處理敏感信息、存儲海量日誌、管理大規模訂單數據等場景,都能通過它們實現安全、高效、低成本的數據庫操作。