`

MySQL插件 HandlerSocket应用

 
阅读更多

        前段时间偶然的机会了解到Handlersocket,并在自己的一个demo中得以应用,在此做下总结。

 

一、HandlerSocket是什么?

        HandlerSocket是akira higuchi 写的一个MySql的插件。以MySQL Daemon Plugin的形式提供类似NoSQL的网络服务,通过这个插件,你可以直接跟MySQL后端的存储引擎做key-value式的交互,省去了MySQL上层的SQL解释、打开关闭表、创建查询计划等CPU开销。

 

二、安装配置

  1. 安装

        由于HandlerSocket是基于MySQL数据库的,因此在安装HanderSocket前需要先按照常规方式部署MySQL服务,同时需注意HandlerSocket时需要MySQL的源码,因此还需要MySQL源码编译方式安装。

 

# tar xvfz HandlerSocket-Plugin-for-MySQL-Master.tar.gz
# cd HandlerSocket-Plugin-for-MySQL-Master/
# ./autogen.sh
# ./configure --with-mysql-source=/data/software/mysql-5.5.12 \
--with-mysql-bindir=/usr/local/mysql55/bin \
--with-mysql-plugindir=/usr/local/mysql55/lib/plugin

 其中:

        --with-mysql-source:指定MySQL源码所在目录

        --with-mysql-bindir:指定mysql_config所在目录

        --with-mysql-plugindir:指定MySQL插件的存储路径

执行make编译安装:

#make && make install

 完成后,mysql-plugindir目录下应有handlersocket相关文件

 

  2. 配置

#*********** HandlerSocket setting ***********
loose_handlersocket_port = 9998
# the port number to bind to (for read requests)
loose_handlersocket_port_wr = 9999
# the port number to bind to (for write requests)
loose_handlersocket_threads = 16
# the number of worker threads (for read requests)
loose_handlersocket_threads_wr = 1
# the number of worker threads (for write requests)
open_files_limit = 65535
# to allow handlersocket accept many concurrent
# connections, make open_files_limit as large as
# possible.

 启动MySQL服务,在MySQL中安装HandlerSocket插件:

mysql> install plugin handlersocket soname ¨handlersocket.so¨;
Query OK, 0 rows affected (0.01 sec)

 至此,HandlerSocket插件安装完毕。

 

三、PHP应用

<?php
$host = 'localhost';
$port = 9998;
$port_wr = 9999;
$dbname = 'hstestdb';
$table = 'hstesttbl';

//GET
$hs = new HandlerSocket($host, $port);
if (!($hs->openIndex(1, $dbname, $table, HandlerSocket::PRIMARY, 'k,v')))
{
    echo $hs->getError(), PHP_EOL;
    die();
}
$retval = $hs->executeSingle(1, '=', array('k1'), 1, 0);
var_dump($retval);

$retval = $hs->executeMulti(
    array(array(1, '=', array('k1'), 1, 0),
          array(1, '=', array('k2'), 1, 0)));

var_dump($retval);
unset($hs);

//UPDATE
$hs = new HandlerSocket($host, $port_wr);
if (!($hs->openIndex(2, $dbname, $table, '', 'v')))
{
    echo $hs->getError(), PHP_EOL;
    die();
}
if ($hs->executeUpdate(2, '=', array('k1'), array('V1'), 1, 0) === false)
{
    echo $hs->getError(), PHP_EOL;
    die();
}
unset($hs);

//INSERT
$hs = new HandlerSocket($host, $port_wr);
if (!($hs->openIndex(3, $dbname, $table, '', 'k,v')))
{
    echo $hs->getError(), PHP_EOL;
    die();
}
if ($hs->executeInsert(3, array('k2', 'v2')) === false)
{
    echo $hs->getError(), PHP_EOL;
}
if ($hs->executeInsert(3, array('k3', 'v3')) === false)
{
    echo 'A', $hs->getError(), PHP_EOL;
}
if ($hs->executeInsert(3, array('k4', 'v4')) === false)
{
    echo 'B', $hs->getError(), PHP_EOL;
}
unset($hs);

//DELETE
$hs = new HandlerSocket($host, $port_wr);
if (!($hs->openIndex(4, $dbname, $table, '', '')))
{
    echo $hs->getError(), PHP_EOL;
    die();
}
if ($hs->executeDelete(4, '=', array('k2')) === false)
{
    echo $hs->getError(), PHP_EOL;
    die();
}

        HandlerSocket的缺陷:

   (1)写操作并没有淘汰查询缓存——如果执行了写操作通过HandlerSocket,由于没有失效查询缓存, 那么你可能从MySQL读到旧的数据; 

   (2)不支持自动递增——插入时无法从自增列上自动获得增量值。

 

        鉴于以上问题,扬长避短,使用其合并查询操作,发挥其NoSQL性能获取MySQL的InnoDB类型表数据,具体操作如下:

<?php
// 通过handlersocket获取数据
$hs = new HandlerSocket(HS_HOST, HS_PORT);
if (!($hs->openIndex(1, 'database', 'table', HandlerSocket::PRIMARY, 'id,content,create_uid,create_user,created,state'))){
	echo $hs->getError(), PHP_EOL;
	die();
}
$dataList = array();
foreach ($ids as $id) {
	$dataList[] = array(1, "=", array($id));
}
$data = $hs->executeMulti($dataList);

 

参考文档:

https://code.google.com/p/php-handlersocket/

http://www.5ienet.com/note/html/handlersocket/mysql_nosql_handlersocket_configure.shtml

 

 

分享到:
评论

相关推荐

    MySQL插件HandlerSocket.zip

    MySQL插件HandlerSocket是一个创新性的开源项目,设计目的是为了提高数据库的读写性能,特别是对于大规模数据处理场景。它允许应用程序直接与InnoDB存储引擎交互,绕过了SQL查询解析、优化和执行等传统步骤,从而...

    MySQL HandlerSocket插件安装配置教程

    MySQL HandlerSocket插件是一款由akira higuchi开发的MySQL扩展,它以Daemon Plugin的形式运行,为MySQL提供了类似NoSQL的访问方式。该插件允许用户直接与存储引擎进行键值对交互,绕过了SQL解析、打开关闭表、创建...

    HandlerSocket插件1

    HandlerSocket 是一个由日本开发者 akira higuchi 开发的 MySQL 插件,它的核心功能在于提供了一种直接与 MySQL 存储引擎进行键值对交互的方式,绕过了传统的 SQL 解析和执行过程,极大地提高了数据库的查询速度。...

    HandlerSocket

    HandlerSocket的应用场景:MySQL自身的局限性,很多站点都采用了MySQL+Memcached的经典架构,甚至一些网站放弃MySQL而采用NoSQL产品,比如Redis/MongoDB等。不可否认,在做一些简单查询(尤其是PK查询)的时候,很多...

    MySQL新技术在淘宝的使用

    HandlerSocket是一种基于MySQL实现的NoSQL插件,它提供了类似于NoSQL数据库的非结构化数据存储能力。通过直接与MySQL服务器通信,HandlerSocket可以绕过SQL解析器,直接读取和写入数据,从而实现更高的读写性能。 #...

    php-handlersocket

    总的来说,`php-handlersocket`提供了PHP与MySQL之间的一种高效通信机制,适用于需要高性能数据库访问的应用场景。开发人员在使用此扩展时,应该首先阅读README.md文件以获取安装和配置指导,然后可以通过测试目录...

    php-handelrsocket_lo9k7t_V2_php_

    结合以上信息,我们可以推测这个压缩包可能包含了一个使用PHP实现的HandlerSocket客户端,允许开发者在PHP应用程序中直接与MySQL的HandlerSocket插件通信,以提高数据库操作的性能。使用这个库的开发者需要了解PHP...

    php HandlerSocket的使用

    HandlerSocket是一个MySQL插件,它通过直接访问MySQL的数据存储层,跳过了SQL解析和查询计划等耗时步骤,从而极大地提高了读取速度。在内存足够大以容纳索引的情况下,使用HandlerSocket可以使MySQL的查询性能提升...

    php-handelrsocket_xwy9zm_V2_php_

    HandlerSocket是MySQL数据库的一个插件,它提供了直接访问存储引擎层的能力,允许PHP代码以类似NoSQL的方式快速读写数据库,跳过SQL解析和优化过程,从而提高性能。 描述中提到的"这是一个用php脚本语言写的其它...

    up_632667_php-handelrsocket_q248j.rar

    2. **安装与配置**:安装HandlerSocket需要在MySQL服务器端启用插件,并在PHP环境中正确配置和加载对应的扩展。 3. **API使用**:了解HandlerSocket提供的PHP API,如`new handler_socket()`,`connect()`,`read()...

    php并发对MYSQL造成压力的解决方法

    再者,可以考虑使用非SQL接口,如MySQL的HandlerSocket插件或者InnoDB NoSQL Plugin,它们可以直接操作存储引擎,绕过SQL解析,极大地提高了处理速度。特别是InnoDB NoSQL Plugin,它支持memcached协议,并共享...

    up_815823_php-handelrsocket_5ujsqq.rar

    HandlerSocket是由日本NTT DATA公司开发的一种用于MySQL的插件,它允许用户直接通过socket接口与MySQL存储引擎进行通信,绕过SQL解析和优化过程,从而显著提高数据读取速度。这对于大量读取操作的应用场景非常有用,...

    php-handelrsocket_vero24_V2_php_

    HandlerSocket是由Nobuhiro Iwamatsu开发的一个MySQL插件,它提供了一个NoSQL风格的接口,绕过MySQL的查询解析、优化和执行过程,直接操作InnoDB存储引擎的数据,极大地提高了读写性能,特别适合大数据量的实时应用...

    php-handelrsocket_6u7nvw.rar_WEB开发_PHP_

    HandlerSocket是MySQL的一个插件,它允许开发者直接通过套接字接口访问数据库的数据,跳过SQL解析层,从而达到提高性能的目的。在PHP中使用HandlerSocket,可以显著提升对MySQL数据库进行大量读取操作的速度,因为...

Global site tag (gtag.js) - Google Analytics