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 數據庫的使用體驗。加密關鍵字守護敏感數據,壓縮關鍵字降低存儲成本,分區表關鍵字解決大數據量查詢慢的問題。在實際應用中,處理敏感信息、存儲海量日誌、管理大規模訂單數據等場景,都能通過它們實現安全、高效、低成本的數據庫操作。