HandlerSocket 是 MySQL Daemon Plugin,繞過 SQL 解析、優化器、鎖層,直接讓客戶端以 **Key-Value 協議** 存取 InnoDB/MyISAM 資料。號稱「MySQL 變身 NoSQL」,查詢效能提升數倍,適合高併發簡單查詢場景。
/usr/local/webserver/mysql5520/usr/local/webserver/php5318/usr/local/webserver/handlersocketyum install -y gcc gcc-c++ libtool make openssl-devel \ perl-DBI perl-DBD-MySQL rpm-build gperf \ readline-devel ncurses-devel time perl-Time-HiRes
git clone https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL.git cd HandlerSocket-Plugin-for-MySQL ./autogen.sh ./configure --prefix=/usr/local/webserver/handlersocket \ --with-mysql-source=/opt/mysql-5.5.20 \ --with-mysql-bindir=/usr/local/webserver/mysql5520/bin \ --with-mysql-plugindir=/usr/local/webserver/mysql5520/lib/mysql/plugin make # 常見錯誤修復:libtool 相對路徑問題 # 編輯 handlersocket/Makefile 第 301 行,將 -rpath 後改為絕對路徑 make install
# /etc/my.cnf [mysqld] 區段 plugin-load = handlersocket.so loose_handlersocket_port = 9998 # 讀請求端口 loose_handlersocket_port_wr = 9999 # 寫請求端口 loose_handlersocket_threads = 16 # 讀執行緒數 loose_handlersocket_threads_wr = 1 # 寫執行緒數 open_files_limit = 65535 # 建議同步調大緩存 innodb_buffer_pool_size = 4G key_buffer_size = 512M
INSTALL PLUGIN handlersocket SONAME 'handlersocket.so'; SHOW PLUGINS; -- 確認 ACTIVE SHOW VARIABLES LIKE 'handlersocket%';
# 驗證端口監聽 lsof -i -P | grep mysqld # 應見 9998 (read), 9999 (write), 3306 (sql)
wget https://php-handlersocket.googlecode.com/files/php-handlersocket-0.3.1.tar.gz tar -zxvf php-handlersocket-0.3.1.tar.gz cd handlersocket /usr/local/webserver/php5318/bin/phpize ./configure --with-php-config=/usr/local/webserver/php5318/bin/php-config make && make install # 編輯 php.ini echo "extension=handlersocket.so" >> /usr/local/webserver/php5318/etc/php.ini # 重啟 PHP-FPM/Apache service php-fpm restart
openIndex(1, $db, $table, HandlerSocket::PRIMARY, 'id,k,v');
// 單鍵查詢
$ret = $hs_r->executeSingle(1, '=', ['k1'], 1, 0);
var_dump($ret);
// 批次查詢
$ret = $hs_r->executeMulti([
[1, '=', ['k1'], 1, 0],
[1, '=', ['k2'], 1, 0],
]);
var_dump($ret);
// 寫入需用寫端口
$hs_w = new HandlerSocket($host, $port_w);
$hs_w->openIndex(2, $db, $table, '', 'k,v');
$hs_w->executeInsert(2, ['k99', 'v99']);
$hs_w->executeUpdate(2, '=', ['k99'], ['v99_new'], 1, 0);
$hs_w->executeDelete(2, '=', ['k99'], 1, 0);
CREATE TABLE `hstesttbl` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `k` CHAR(6) DEFAULT NULL, `v` CHAR(6) DEFAULT NULL, KEY `idx_k` (`k`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
| 限制 | 說明 |
|---|---|
| 寫操作不清除 Query Cache | 讀到舊資料,建議關閉 QC 或應用層自行失效 |
| 不支援 AUTO_INCREMENT 回傳 | 插入需自行生成主鍵(UUID/雪花算法) |
| 無事務支援 | 單操作原子,多操作無原子性 |
| 僅支援單索引查詢 | 複雜 JOIN/子查詢仍需 SQL |
HandlerSocket 讓 MySQL 擁有 NoSQL 級讀寫效能,適合「高併發、簡單模式、可容忍最終一致」的場景(計數器、Session、Feed、配置)。生產使用需權衡功能限制、運維複雜度、MySQL 8.0 原生 X Plugin/Document Store 替代方案。