视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
mysql下mysql-udf-http效率测试小记
2020-11-09 09:28:23 责编:小采
文档


看到张宴的博客上关于http/rest客户端的文章,怎样安装啥的直接都跳过,下面直接进入测试阶段。

看到张宴的博客上关于"",怎样安装啥的直接都跳过,下面直接进入测试阶段,测试环境:虚拟机
代码如下:

[root@localhost ~]# uname -a
Linux sunss 2.6.18-128.el5 #1 SMP Wed Jan 21 10:44:23 EST 2009 i686 i686 i386 GNU/Linux

内存和交换分区:
代码如下:

[root@localhost ~]# free -m
total used free shared buffers cached
Mem: 376 363 13 0 23 105
-/+ buffers/cache: 233 142
Swap: 1023 133 0
mysql:
[root@localhost ~]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 57
Server version: 5.1.26-rc-log Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>

使用的表结构:
代码如下:

DROP TABLE IF EXISTS `mytable`;
CREATE TABLE `mytable` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`addtime` int(10) NOT NULL,
`title` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

php操作MySQL的程序:
代码如下:

$type = $_GET['type'];
print_r($_GET);
include_once("gettime.php");
$btime = getmicrotime();
$loop_cnt= 1000; //循环次数
$db_host = '127.0.0.1'; //
$db_user = 'sunss'; //
$db_pass = '123456'; //
$db_name = 'test'; //
$db_link = mysql_connect($db_host, $db_user, $db_pass) or die("Connected failed: ".mysql_error()."\n");
mysql_query('set names utf8');
mysql_db_query($db_name, $db_link);
if ("put" == $type) {//修改
$i = 1;
while ($i <= $loop_cnt) {
$title = "jkjkjkjkjkjkjkjkjkjkjkjkjk";
$tt = time();
$sql = "update mytable set addtime=".$tt.",title='".$title."' where id='".$i."'";
$res = mysql_query($sql);
if (FALSE == $res) {
echo "update failed!\n";
}
$i++;
}
} else if ("delete" == $type) { //删除
$i = 1;
while ($i <= $loop_cnt) {
$sql = "delete from mytable where id='".$i."'";
echo "delete sql: ".$sql."
";
$res = mysql_query($sql);
if (FALSE == $res) {
echo "delete failed!\n";
}
$i++;
}

} else if ("post" == $type) { //添加
$i = 0;
while ($i < $loop_cnt) {
$title = "hahahahahahahahahahahahahahahahahaha";
$tt = time();
$sql = "insert into mytable(addtime, title) values($tt, '".$title."')";
//print "SQL: ".$sql."
";
$res = mysql_query($sql);
if (FALSE == $res) {
echo "insert failed!\n";
}
$i++;
}
}
mysql_close();
$etime = getmicrotime();
$runTime = round($etime - $btime, 4);
echo "runTime: ".$runTime."\r\n
";
?>

单独执行php连接MySQL,单条连接添加1000条记录需要:0.9s左右
php操作memcache的程序:
代码如下:


include_once("gettime.php");
$btime = getmicrotime();
//杩炴帴
$mem_host = "192.168.0.134";
$mem_port = "11311";
$timeout = 3600;
$i = 0;
$cnt = 1000;
while ($i < $cnt) {
$mem = new Memcache;
$mem->connect($mem_host, $mem_port) or die("Could not connect!");
$ret = $mem->set($i, "11111111111", 0, $timeout);
if (false == $ret) {
file_put_contents("insert_failed.log", "post failed!\n", FILE_APPEND);
}
$mem->close();
$i++;
}

//鍏抽棴杩炴帴
$etime = getmicrotime();
$runTime = round($etime - $btime, 4);
echo "runTime: ".$runTime."\r\n
";
?>

单条连接添加1000条记录,需要0.8s左右,
创建触发器:
代码如下:


DELIMITER $$
DROP TRIGGER /*!50032 IF EXISTS */ `test`.`mytable_insert`$$
CREATE
/*!50017 DEFINER = 'root'@'localhost' */
TRIGGER `mytable_insert` AFTER INSERT ON `mytable`
FOR EACH ROW BEGIN
SET @tt_resu = (SELECT http_put(CONCAT('http://192.168.0.134/mem_ss.php?type=post&id=', NEW.id, "&data=", NEW.addtime), 11));
END;
$$

为触发器写个php更新memcache,代码如下:
代码如下:

$id = $_GET['id'];
$type = $_GET['type'];
$json_data = $_GET['data'];
var_dump($_GET);
//杩炴帴
$mem_host = "192.168.0.134";
$mem_port = "11211";
$timeout = 3600;
$mem = new Memcache;
$mem->connect($mem_host, $mem_port) or die("Could not connect!");
if ("get" == $type ) {
$val = $mem->get($id);
echo $val;
//$arr = jsonDecode($val,'utf-8');
//print_r($arr);
} else if ("put" == $type) {
$ret = $mem->replace($id, $json_data, 0, $timeout);
if (false == $ret) {
file_put_contents("replace_failed.log", "replace failed!\n", FILE_APPEND);
}
} else if ("delete" == $type) {
$ret = $mem->delete($id);
if (false == $ret) {
file_put_contents("delete_failed.log", "delete failed!\n", FILE_APPEND);
}
} else if ("post" == $type) {
$ret = $mem->set($id, $json_data, 0, $timeout);
if (false == $ret) {
file_put_contents("post_failed.log", "post failed!\n", FILE_APPEND);
}
}
$mem->close();
?>

使用php触发MySQL添加1000条记录,同时触发器触动php更新memcache,使用时间9s左右,
因为每次都关闭链接memcache,看是不是关闭链接导致慢,又写了一个程序:
代码如下:

include_once("gettime.php");
$btime = getmicrotime();
//连接
$mem_host = "192.168.0.134";
$mem_port = "11311";
$timeout = 3600;
$i = 0;
$cnt = 1000;
while ($i < $cnt) {
$mem = new Memcache;
$mem->connect($mem_host, $mem_port) or die("Could not connect!");
$ret = $mem->set($i, "11111111111", 0, 3600);
if (false == $ret) {
file_put_contents("insert_failed.log", "post failed!\n", FILE_APPEND);
}
$mem->close();
$i++;
}
//关闭连接
$etime = getmicrotime();
$runTime = round($etime - $btime, 4);
echo "runTime: ".$runTime."\r\n
";
?>

耗时0.9s左右,比一个连接慢不了多少。
为了定位是触发器慢还是http_put慢,创建一个临时表
tmp_mytable,表结构如下:
代码如下:

CREATE TABLE `mytable` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`addtime` int(10) NOT NULL,
`title` varchar(255) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

再次修改触发器,如下:
代码如下:

DELIMITER $$
DROP TRIGGER /*!50032 IF EXISTS */ `test`.`mytable_insert`$$
CREATE
/*!50017 DEFINER = 'root'@'localhost' */
TRIGGER `mytable_insert` AFTER INSERT ON `mytable`
FOR EACH ROW BEGIN
insert into tmp_mytable values(NEW.id,NEW.addtime,NEW.title);
END;
$$

再次用php向MySQL中添加1000条记录,消耗时间0.7s左右,证明效率消耗在http_put,也就是mysql-udf-http慢。
不知道我的测试有错没?还请正在使用mysql-udf-http的高手,或者对mysql-udf-http有研究的高手指教。

下载本文
显示全文
专题