傳統架構:Application → MySQL (SQL 解析、優化器、執行器) → InnoDB
直接存取 InnoDB 存儲引擎介面,繞過 SQL 層:
Application → HandlerSocket Plugin → InnoDB Storage Engine (Buffer Pool + B+Tree)
yum install Percona-Server-server-57
# 已內建 handlersocket.so,直接啟用
# 1. 安裝依賴
yum install gcc-c++ cmake openssl-devel mysql-devel
# 2. 下載源碼 (對應 MySQL 版本)
git clone https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL.git
cd HandlerSocket-Plugin-for-MySQL
# 3. 編譯 (需 MySQL 源碼目錄)
./autogen.sh
./configure --with-mysql-source=/usr/local/src/mysql-5.7.30 \
--with-mysql-bindir=/usr/bin \
--with-mysql-plugindir=/usr/lib64/mysql/plugin
make && make install
[mysqld]
# HandlerSocket 設定
loose_handlersocket_port = 9998 # 讀請求埠
loose_handlersocket_port_wr = 9999 # 寫請求埠
loose_handlersocket_threads = 16 # 讀執行緒數 (建議 CPU 核心數 x 2)
loose_handlersocket_threads_wr = 4 # 寫執行緒數
open_files_limit = 65535 # 大量連線需調大
# 關鍵:InnoDB 緩衝池必須足夠大裝下熱點索引
innodb_buffer_pool_size = 4G # 視資料量調整
mysql> INSTALL PLUGIN handlersocket SONAME 'handlersocket.so';
mysql> SHOW PROCESSLIST; -- 可見 handlersocket 執行緒
CREATE TABLE `test`.`user` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) NOT NULL,
`email` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_name` (`name`)
) ENGINE=InnoDB;
$ telnet localhost 9999
# 開啟索引: P <索引ID>
P 1 test user PRIMARY id,name,email
# 插入: <索引ID> + <欄位數> <值1> <值2> ...
1 + 3 1001 Alice alice@example.com
# 回應: 0 1 0 (0=成功, 1=影響行數, 0=insert_id)
# 主鍵精確查詢: <索引ID> = <欄位數> <值> <限制> <偏移>
1 = 1 1001 1 0
# 回應: 0 3 1001 Alice alice@example.com
# 二級索引查詢: 開啟 idx_name
P 2 test user idx_name name,id,email
2 = 1 Alice 1 0
# 回應: 0 3 1001 Alice alice@example.com
# 範圍掃描: >=
1 >= 1 1000 10 0 # id >= 1000, 取 10 筆
支援的操作類型
操作碼 說明 支援索引類型
=精確匹配 (單筆) PK / Unique / Non-Unique
>=範圍掃描 (>= 值) PK / Secondary
>範圍掃描 (> 值) PK / Secondary
<=範圍掃描 (<= 值) PK / Secondary
<範圍掃描 (< 值) PK / Secondary
+插入 PK (需包含所有 NOT NULL 欄位)
-刪除 PK / Unique
U更新 PK / Unique
客戶端庫推薦
- Python:
pyhandlersocket、handlersocket-py
- Java:
handlersocket-java
- PHP:
php-handlersocket
- Go:
go-handlersocket
避坑指南與限制
限制 影響 對策
無事務支援 單操作原子,跨操作無 ACID 業務層保證一致性、或關鍵路徑仍用 SQL
無外鍵/約束檢查 繞過 SQL 層約束 應用層驗證、或配合觸發器
不支援複雜查詢 無 JOIN、GROUP BY、子查詢 僅用於簡單 KV/範圍存取
Binlog 記錄為 ROW 格式 複製到從庫正常,但無 SQL 可審計 配合 binlog_format=ROW
連線數佔用 MySQL max_connections 需調大 max_connections 設定 open_files_limit、max_connections
適用場景判斷
- ✅ 高頻簡單 KV 存取 (用戶 Session、配置、計數器)
- ✅ 熱點資料讀取 (商品詳情、用戶資料)
- ✅ 寫入密集型日誌/指標資料
- ❌ 複雜報表、多表關聯、需事務一致性的核心交易
現代替代方案
MySQL 8.0+ 可考慮:
- MySQL Document Store (X Plugin):原生 NoSQL 介面 (CRUD API)
- InnoDB Memcached Plugin:官方 Memcached 介面,支援事務
- ProxySQL + Query Rewrite:將簡單 SQL 重寫為高效執行計劃
Copyright © 程式碼之家 All Rights Reserved