找回密码
 注册
查看: 4719|回复: 0

mysql memcached UDF 安装详解

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2016-8-22 10:51:11 | 显示全部楼层 |阅读模式
1:mysql memcached UDF 其实就是通过libmemcached来使用memcache的一系列函数,通过这些函数,你能 对memcache进行get, set, cas, append, prepend, delete, increment, decrement objects操作,如果我们通过mysql trigger来使用这些函数,那么就能通过mysql更好的,更自动的管理memcache!
2:安装方法:
1)安装memcache
2)安装libmemcached
shell> cd libmemcached-0.35+ _  r' n" N& R; \9 m" s
shell> ./configure --with-memcached=/usr/local/bin/memcached
/ I( `3 a4 W4 z7 P. _1 ~shell> make && make install
3 S# z, [; O' L: a' ashell> echo "/usr/local/lib" >> /etc/ld.so.conf6 V% d- V. _7 k9 C' V
shell> ldconfig
3)安装memcached_functions_mysql
+ t3 H* L2 |7 r7 b  Gshell> tar zxvf memcached_functions_mysql-0.9.tar.gz7 F5 L; D1 `+ S# T! c3 `8 R
shell> cd memcached_functions_mysql-0.9
, Q; J9 }$ ~3 N- v" ~% D% gshell> ./configure --with-mysql=/usr/local/mysql51/bin/mysql_config --with-libmemcached =/usr/local/$ t% k) b$ I, f- |
shell> make && make install
4)拷贝lib文件到mysql的plugin下面
: S' w/ F5 C. R4 v8 G+ x/ {shell> cp -R /usr/local/lib/libmemcached_functions_mysql.* /usr/local/mysql51/lib/mysql/plugin/
5)添加memcache UDF 函数
在mysql里执行 source install_functions.sql
这样我们就可以使用mysql memcached UDF 了,我们可以通过下面语句查看是否已经正常安装
1)查看mysql.func,有很多函数
mysql> select * from mysql.func;
8 w4 f( ~# D+ w1 L- ?" H$ a. U+------------------------------+-----+---------------------------------+----------+
* \4 W( D& T5 _8 y* f7 I| name                         | ret | dl                              | type     |( W' f8 B3 U4 A* q, }
+------------------------------+-----+---------------------------------+----------+
0 U$ q2 T' C% |6 ?| memc_add                     |   2 | libmemcached_functions_mysql.so | function |
0 Y" H) d6 N- @1 }| memc_add_by_key              |   2 | libmemcached_functions_mysql.so | function |# |- y+ O8 f5 `  A
| memc_servers_set             |   2 | libmemcached_functions_mysql.so | function |
2)添加trigger,看是否向memcache里insert、update等
具体的语句,我们可以参照:
1)memcached_functions_mysql-0.9/sql 目录下的trigger_fun.sql

3 s% d) \/ y2 c) Z我们还必须注意以下几点:
1)mysql 编译时一定不要带'--with-mysqld-ldflags=-all-static' 这个参数,因为这样就限制了mysql 的动态安装功能了
2)使用时,要观察mysql.err日志,不知道是有意还是无意,udf更新memcache都会记录在err日志里,注意清理该日志,否则一下就爆满了
3)mysql 官网有这样一句话:
The list of servers used by the memcached UDFs is not persistent over restarts of the MySQL server. If the MySQL server fails, then you must re-set the list of memcached servers.
所以,当我们重启mysql,我们必须通过select  memc_servers_set('192.168.0.1:11211,192.168.0.2:11211');语句重新注册memcache服务器!
2、创建mysql的insert,update,delete触发器更新memcache,参考http://blog.csdn.net/jiedushi/article/details/6176940
测试环境在Linux下进行,版本系统为CentOS5.
# Y+ g, m1 ]1 q以下为相关软件,包括其版本和下载地址:

& k! r0 W$ c) R* p( j: c! V
mysql-5.1.30 下载
) r+ l* w3 u1 ^) a, q: z* v% ]memcached-1.2.6 下载
$ u: H  ]9 _: h2 Y- w9 ?5 C: ^libevent-1.4.7-stable 下载
0 }# |- ]% v; b+ k7 R- p4 x& imemcached_functions_mysql-1.1 下载
! ^1 o) C5 |# D* }libmemcached-0.26 下载

! r. H; M$ j6 Y- X- x2 x# Y
4 e# W1 V+ G6 B  v) u: q7 D
编译安装MySQL,安装因个人细好而定,省略许多与测试无关的编译细节及参数。
  • <span>[</span>root@localhost ~<span>]</span><span>#tar xzf mysql-5.1.30.tar_001.gz</span>  
  • <span>[</span>root@localhost ~<span>]</span><span>#cd mysql-5.1.30</span>  
  • <span>[</span>root@localhost ~<span>]</span><span>#./configure --prefix=/usr/local/mysql51</span>  
  • <span>[</span>root@localhost ~<span>]</span><span>#make</span>  
  • <span>[</span>root@localhost ~<span>]</span><span>#make install</span>  
  • <span>[</span>root@localhost ~<span>]</span><span>#./scripts/mysql_install_db --user=mysql --skip-name-resolve</span>  
  • <span>[</span>root@localhost ~<span>]</span><span>#/usr/local/mysql51/bin/mysqld_safe</span>  
    : J) _  \' @* B3 e9 x' o
2 [+ _1 b. I  c* ]2 ~

; @- ]! z2 n: n! t8 `" K

  C/ C6 v; z7 @8 Q  y! ?
省略列出安装memcached和libevent的相关命令,具体可按照实际情况安装,测试时我将libevent默认安装,memcached安装于/usr/local/memcached目录下。
: @1 R& \6 y" P4 q: v& v) i6 Q; n/ v. z启动memcached.
  • <span>/</span>usr<span>/</span>local<span>/</span>memcached<span>/</span>bin<span>/</span>memcached <span>-</span>d <span>-</span>m <span>50</span> <span>-</span>u root <span>-</span>p <span>11211</span>  4 _5 ^! S' N, B5 R; k

, z; ^0 q3 m8 Y/ O  W3 S! A! M8 a! o

6 z7 d2 O7 q* u: g( a1 _" u/ t" X% V
编译安装libmemcache.
  • <span>[</span>root@localhost ~<span>]</span><span>#tar xzf libmemcached-0.26.tar.gz</span>  
  • <span>[</span>root@localhost ~<span>]</span><span>#cd libmemcached-0.26</span>  
  • <span>[</span>root@localhost ~<span>]</span><span>#./configure --with-memcached=/usr/local/memcached/bin/memcached</span>  
  • <span>[</span>root@localhost ~<span>]</span><span># make && make install</span>  + k+ `2 H7 n0 u; w! |/ K

2 Y( f0 f9 a: j& D( b& u
! H% ~) R! }' J+ a+ J
0 D: \" ~* q0 w8 S0 _
编译安装Memcache UDFs for MySQL.
  • <span>[</span>root@localhost ~<span>]</span><span># tar xzf memcached_functions_mysql-1.1.tar.gz</span>  
  • <span>[</span>root@localhost ~<span>]</span><span># cd memcached_functions_mysql-1.1</span>  
  • <span>[</span>root@localhost ~<span>]</span><span># ./configure --with-mysql-config=/usr/local/mysql51/bin/mysql_config</span>  
  • <span>[</span>root@localhost ~<span>]</span><span># make && make install</span>  7 j6 x# K" v% m7 _0 I- V: u

' ^& ]  m" h. Q& L1 g$ j2 U
3 J  m; Q5 y7 m' H
# U7 `* I0 Q+ l8 {& _
编译完成后将编译好的库文件复制到mysql的插件目录下,以便于加载使用。
  • cp <span>/</span>usr<span>/</span>local<span>/</span>lib<span>/</span>libmemcached_functions_mysql<span>*</span> <span>/</span>usr<span>/</span>local<span>/</span>mysql51<span>/</span>lib<span>/</span>mysql<span>/</span>plugin<span>/</span>  : w, H' X& n& w  e( R

: z8 w6 Y, T3 |9 Q( y0 `  K) L' V: ~6 E  u" s
/ W# F2 ~% Q; _* n/ A& |
进入memcached_functions_mysql的源码目录,在目录下有相关添加UDF的SQL文件用于初始化。
4 v* y2 X3 D9 G% I) U: ?% s! p
在mysql的shell中执行memcached_functions_mysql源码目录下的sql/install_functions.sql
- ?/ A: q: B. U$ L或者运行memcached_functions_mysql源码目录下utils/install.pl这个perl脚本,把memcache function作为UDF加入mysql。

* k( R2 P: o2 x6 P3 O5 A* y
[root@localhost ~]# mysql <sql/install_functions.sql
检查安装是否成功

/ v1 |8 N+ G/ Imysql> select name,dl from mysql.func;
" K0 ?- d. a0 S2 e; D

; _+ W& C- |$ g+ L! c
二. 测试用例设计情况:
(1).新建两张表:urls和results,用来更新urls表里面的内容,让系统自动更新memcached的内容。results用来记录更新memcached失败的记录。; I" y% Z) _, \* A: N
sql语句如下:
; {* h$ V: w+ i% v: r; @7 guse tests;- u. D6 w$ h# m7 n6 h1 c7 D
drop table if exists urls;7 X; J! ~' a# g; d5 x4 m
CREATE TABLE `urls` (. r6 D* o  p% d7 }" W1 z
  `id` int(10) NOT NULL,
9 F! g4 Q% T% I! n9 i, n  `url` varchar(255) NOT NULL DEFAULT '',
6 N3 h& F' J3 M, ?* L  PRIMARY KEY (`id`)
, U* Q0 F# L8 _; f2 w, {);
drop table if exists results;7 b1 D! {( n9 m$ L
CREATE TABLE `results` (' M) ?5 M/ k# t. R3 ]
  `id` int(10) NOT NULL,: t1 L8 r* h8 ]. I
  `result` varchar(255) NOT NULL DEFAULT 'error',$ x; c% T7 p1 r4 p
  `time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
8 d. |) }$ b" m: W  PRIMARY KEY (`id`)
& i+ c9 K) }9 h$ p);

7 b) F8 A5 w( m! @( w7 I- r3 }) N# s(2). 建立三个trigger.
当向urls表里面插入数据时,对memcached执行set操作,trigger如下:/ m+ G$ E' c- |0 k5 p, n
DELIMITER //8 N# p2 C, k. Q5 u( s9 P2 @
DROP TRIGGER IF EXISTS url_mem_insert;
. J, e+ T9 Z/ w4 L" s  z( eCREATE TRIGGER url_mem_insert
/ f! b( ~0 O; T6 v4 N/ GBEFORE INSERT ON urls
4 n: m. G! e8 A  E+ E# XFOR EACH ROW BEGIN
0 h( m* w' c6 ]' p! }) U0 T# {    set @mm = memc_set(NEW.id, NEW.url);
9 Z0 W# w: ~8 b  U' `0 R    if @mm <> 0 then
! d- D$ ^0 U2 t. W+ |4 U# c    insert into results(id) values(NEW.id);
* C& d$ b8 k5 N    end if;
END //+ w; @8 t6 ?% T
DELIMITER ;

8 W% O! J* p# k4 d4 h4 M* x当对urls表里面的数据进行更新时,对memcached执行replace操作,trigger如下:
DELIMITER //
5 E3 z2 t" @) g3 ~DROP TRIGGER IF EXISTS url_mem_update;# G$ {( V" _' H% O) z7 t3 W: F9 Y
CREATE TRIGGER url_mem_update( R2 f7 C+ f4 |1 m6 C  M- G
BEFORE UPDATE ON urls
7 x" C- e+ u+ K: K& J0 |FOR EACH ROW BEGIN. D3 j3 b% e& B5 d: P: S
    set @mm = memc_replace(OLD.id,NEW.url);
: i& d, n! i- Z+ c+ J1 {    if @mm <> 0 then3 }! Y9 \5 E/ F+ ?0 [; r
    insert into results(id) values(OLD.id);
4 d; ?) `: w8 G& r0 O/ }; u1 S    end if;
END //
! a5 b* n0 D* \' x! y5 a7 U$ JDELIMITER ;
) Y3 q% X. D' l! q# P
当对urls表里面的数据进行删除操作时,对memcached执行delete操作,trigger如下:
DELIMITER //6 K' S) R2 P$ W
DROP TRIGGER IF EXISTS url_mem_delete;& R+ Z. L& [% i' i" E
CREATE TRIGGER url_mem_delete! p: }6 Q3 D: ?7 b- f7 |
BEFORE DELETE ON urls+ y1 U, n1 S: E0 u; i2 `% ?6 a
FOR EACH ROW BEGIN
. H+ u7 L7 w, s    set @mm = memc_delete(OLD.ID);; q, u+ t0 z( Z! n9 Q- t
    if @mm <> 0 then3 C. H" a. I: K( U9 g; x/ Q/ L
    insert into results(id) values(OLD.id);
; [! W' ^' z) t  R4 W    end if;
END //+ _9 u9 ]& C# o* K/ K
DELIMITER ;

# P( ~6 ]4 t0 c/ k" `$ {(3). 设置memcached相关参数
设置同时UDF操作的memcaced的机器IP和端口:
mysql> SELECT memc_servers_set('192.168.3.184:11900');' h! ?4 Y) q( j; L8 t; Q1 B9 m) C9 J
+---------------------------------------+
7 Q: l9 K: L: R4 ]8 A# K$ ~| memc_servers_set('192.168.3.184:11900') |
% [* |; U# r6 T6 z& x6 S* Y- x+---------------------------------------+, k  _& ]* [. J
|                                     0 |2 x0 j$ C1 [; _! {
+---------------------------------------+( R1 P% e6 b& {' h1 j9 J
1 row in set (0.00 sec)

$ b3 O( Y; L5 Z* P1 F" Qmysql> select memc_server_count();
0 t) A3 `( \) i0 _0 M+---------------------+
+ @, _" _4 s! Y; N, E) m. [8 o+ X| memc_server_count() |
( t$ H, A0 T( E# A6 _+---------------------+6 ?. u5 D5 ]* C
|                   1 |
! ?. _$ ^% p1 f5 c1 n4 s, Q* k+---------------------+2 c1 b& u4 F# g  [5 D- L/ q7 x
1 row in set (0.00 sec)
' P4 F$ ?8 e0 P- b
在mysql命令行列出可以修改memcached参数的行为:
! N' k- L: \3 Rmysql> select memc_list_behaviors()/G: }4 A; O- P7 j9 B
*************************** 1. row ***************************& ~- ^& q+ ?2 J# M
memc_list_behaviors():6 L* J4 d  v* N! J/ _/ p5 w
MEMCACHED SERVER BEHAVIORS% v# q8 B- p3 |
MEMCACHED_BEHAVIOR_SUPPORT_CAS1 J9 q# t- \8 `8 t  o" w6 z
MEMCACHED_BEHAVIOR_NO_BLOCK  [% [& X! s" U) k
MEMCACHED_BEHAVIOR_TCP_NODELAY
- Y/ n6 H3 |! W  h' H" RMEMCACHED_BEHAVIOR_HASH  i5 T! u4 b0 {! P! ~
MEMCACHED_BEHAVIOR_CACHE_LOOKUPS
7 ?7 k* P2 a! e  O& c7 RMEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE: [2 N3 R4 l6 m# i9 p
MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE
- @. o& Y: h/ v* K$ OMEMCACHED_BEHAVIOR_BUFFER_REQUESTS. Z5 s" y: o: S* U' x5 n7 t( Y6 A
MEMCACHED_BEHAVIOR_KETAMA5 r+ P. X- Y) J
MEMCACHED_BEHAVIOR_POLL_TIMEOUT
8 i) R; N' w* M8 f3 ]+ \MEMCACHED_BEHAVIOR_RETRY_TIMEOUT- y8 p+ h( v% K
MEMCACHED_BEHAVIOR_DISTRIBUTION. p0 Y- Q' M# C' n
MEMCACHED_BEHAVIOR_BUFFER_REQUESTS3 p: K2 U0 [5 n* b  X
MEMCACHED_BEHAVIOR_USER_DATA
$ H. A3 q# R2 M' A& ZMEMCACHED_BEHAVIOR_SORT_HOSTS0 X; M7 S9 E: W- [2 Q" t4 a/ w
MEMCACHED_BEHAVIOR_VERIFY_KEY
8 Q5 R0 ~! s1 \MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT7 A, E, E) _% {$ F  ?1 R- E
MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED. n% G3 W. H. H. o" u
MEMCACHED_BEHAVIOR_KETAMA_HASH* I  k; h/ ?5 }. o5 K' `9 P
MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
+ r9 B% S* ~1 t; F  }7 {MEMCACHED_BEHAVIOR_SND_TIMEOUT- C- `* {) A4 Q# y6 A/ l% N
MEMCACHED_BEHAVIOR_RCV_TIMEOUT
3 y  K/ h2 `3 l; A+ Z0 j: qMEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT
" }' [, S) d' k8 L; AMEMCACHED_BEHAVIOR_IO_MSG_WATERMARK
1 p/ @6 s& K( J- W; a  N. eMEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK
1 row in set (0.00 sec)

% V* S( D7 `1 _; Q3 Z/ r0 Y设置MEMCACHED_BEHAVIOR_NO_BLOCK为打开状态,这样在memcached出现问题时(不能连接时)
- m' P% e/ v: p& v9 d9 M+ }7 \7 q5 [数据继续插入到mysql中,报错提示,如果不设置此值,如果memcached失败,mysql需要等到timeout
* f* a) `1 \+ v才可以插入到表中。
: ?; I. o* B" Z: s( N5 C/ @mysql> select memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1');) T: U% k% m0 j) w
+--------------------------------------------------------------+0 d5 b$ ?1 R* I+ y' O) g: X( s
| memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1') |9 o- x$ q7 d( Q
+--------------------------------------------------------------+$ y6 Q& O# p0 H2 ?  p. j* Z/ b, e
|                                                            0 |+ i1 Z: L) w! ]" L8 o
+--------------------------------------------------------------+% R( ^5 ~8 U$ g$ S, \
1 row in set (0.00 sec)

3 |+ u. x$ t% \! s
mysql> select memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1');2 X: K' N$ x8 `6 n8 O4 P; z
+-----------------------------------------------------------------++ m0 p: l% ~  g: `! d" K
| memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1') |
5 t" h! W* \% s+-----------------------------------------------------------------+6 }2 e3 K& b$ D: [% M! G
|                                                               0 |  T1 `/ K( ^7 y9 m% o% A
+-----------------------------------------------------------------+' w8 c& t9 I* }! N4 |3 ?$ a) A  m( T
1 row in set (0.00 sec)

4 v# g) q2 a/ I2 \5 @! S
1 W6 [! ~) F0 R/ b* p
三. 简单的功能测试:

* {# Z2 G2 S7 G+ E; p, `1. 向表urls里面插入数据,然后查memcached是否也set进数据:
mysql> insert into urls (id,url) values (1, 'http://www.sina.com.cn');
! E) f' \& ~- o2 TQuery OK, 1 row affected, 1 warning (0.00 sec)
mysql> select memc_get('1');  
0 m3 d: `/ j% A' j# n4 d$ f+------------------------+7 h; [9 J- ]+ t$ c
| memc_get('1')          |
0 W9 s9 ^- d. W7 n1 V+------------------------+( |3 `9 J. E% f1 \; {
| http://www.sina.com.cn |0 q, s3 t8 a7 t5 A' \. {5 ~
+------------------------+
. i2 }5 {" ?/ a& f1 row in set (0.00 sec)

* b. U, U3 e0 y6 w6 R1> telnet 192.168.3.184 119003 G/ \; |0 J, |0 r5 z
Trying 192.168.3.184...$ H% R; b4 H* p! \3 m" M  f; {
Connected to 192.168.3.184 (192.168.3.184).; M) R2 @% x2 K' I, O5 U4 `! ^
Escape character is '^]'.) ?: A6 ]8 d- y% b4 S- v: W
get 1' C5 B! b- b4 w
VALUE 1 0 22' K' i( k# S3 a
http://www.sina.com.cn$ Z5 m+ p0 }% r
END

+ L% Q7 ?! u  N$ D1 M9 h2.更新表urls里面的数据,然后查询memcached里面是否也更新:+ V: o6 w' s+ A4 q
mysql> update test.urls set url='http://blog.sina.com.cn' where id=1;
* u& X: s4 I- GQuery OK, 1 row affected, 1 warning (0.00 sec)# y1 A4 Z: N2 j3 u) [8 y
Rows matched: 1  Changed: 1  Warnings: 0
: G% y  b- \3 c  v
mysql> select memc_replace('1','http://blog.sina.com.cn'); 5 }) E6 k- m2 C9 Y. L: J
+---------------------------------------------++ i. d: G7 h: n+ V, P; T, q) R
| memc_replace('1','http://blog.sina.com.cn') |
& j% Q( F# [: g- h7 `+---------------------------------------------+
) w( i* |  ^( `|                                           0 |0 e" u: w( c4 v0 ^4 t
+---------------------------------------------+
& L; a. B& g, w' E! W$ ?9 S+ ]1 row in set (0.00 sec)
mysql> select memc_get('1');  9 w! Q/ L- }3 L' J2 h1 C
+-------------------------+
4 p* x; y& c+ ^( c| memc_get('1')           |; @) f# n) M! `/ K
+-------------------------+6 H, @- U# g# Q+ ~
| http://blog.sina.com.cn |4 a# D2 k) U/ L1 [, G
+-------------------------+
$ W$ f/ ~; S) f% p' J$ h( P1 row in set (0.00 sec)

: B5 u1 o. V- D0 K. l" ^! }1> telnet 192.168.3.184 11900
, _3 t: w' v6 Z, g1 D" p! FTrying 192.168.3.184...
6 ]2 G( k7 u6 R$ NConnected to 192.168.3.184 (192.168.3.184).* N, x  `) Z7 V
Escape character is '^]'.' K7 v0 J4 @% }7 C' P, W) f
get 12 Y6 b4 F1 S0 D" r
VALUE 1 0 23' B8 G. G1 w; n9 I$ x2 j# P
http://blog.sina.com.cn
0 v, k1 x. g  s& k6 s8 lEND

! L) O. S/ u' f" k3 u( ?3.删除表urls里面的数据,然后查memcached是否也删除:0 Q4 s- r% I6 |
mysql> delete from test.urls where id=1;
% G1 ]8 T' ~9 D$ y9 i  X4 S6 eQuery OK, 1 row affected, 1 warning (0.00 sec)6 q) H, K& C0 s* |2 n6 h7 ]
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select memc_get('1');  1 N/ E) _) ]8 R( ?
+---------------+5 U6 ~2 x& m3 S% |
| memc_get('1') |
( f2 p; G/ C5 |0 b; I1 x, e0 ?+---------------+- D+ A/ n6 I# _' y0 z. d) U
| NULL          |
% b% R8 I( u$ s# G' O( {" {$ ]4 F+---------------+4 ]6 }# N6 a& h: E) L; v" a; `
1 row in set (0.00 sec)

; R& T; F/ `9 [* ?1> telnet 192.168.3.184 119005 z  g( h% Z8 J! j) w
Trying 192.168.3.184.../ K3 A' M7 F7 z2 N+ |0 X
Connected to 192.168.3.184 (192.168.3.184).
: {9 ?2 d, O/ H2 a* \% eEscape character is '^]'.
/ Z6 @& I$ ]: Y  V3 wget 1
6 j; a8 L( `% v1 {2 y' ZEND
6 E3 ?* u8 D, o/ Z" _6 A, P' N/ F" \8 ]
1 }7 o( i* q/ S; C7 I) q0 x! j
四. 利用php脚本insert, update,delete表urls里面的数据,进行测试。
每条记录的平均长度是:17K
单独向表urls里面插入10万条记录需要的时间为:75秒- [1 s: E3 a/ v5 o: b, r" l
单独对表urls里面更新10万条记录需要的时间为:70秒
( s0 J" ]8 `6 Z( y8 Y5 t6 @0 @单独对表urls里面删除10万条记录需要的时间为:105秒
同时进行30万数据的insert,update, delete操作需要时间为:241秒
上面操作都没有memcached失败情况:0 J6 R% ~( v0 p" j# [4 m
mysql> select * from results;9 |" B3 M+ I/ }. U: f' B
Empty set (0.00 sec)
8 Q2 ~, @( ~# t& u
测试脚本如下:
插入脚本:2 K+ V$ S5 |3 G( H
0> more a.php
: ^, b$ j, g. Q<?php
$conn = mysql_connect("192.168.1.61","test","test") or die(mysql_error());
mysql_select_db("test",$conn) or die(mysql_error());
//$sql = "show tables";
echo date("Y-m-d H:i:s");% ?% H8 i8 D, {' O; [  e
//mysql_query($sql) or die(mysql_error());
for ($i=1; $i<=100000; $i++) {
3 ^2 r) x& w4 l% m* [7 T$sql="insert into urls (id,url) values ($i, 'http://$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i.com');";9 `1 _2 I: ]2 \3 }
mysql_query($sql) or die(mysql_error()); : w& J) ]1 P- C4 h  d. B
}
echo "/n";
( ?( D7 \! T. {0 b" z) W& decho date("Y-m-d H:i:s");
?>
更新脚本:+ b' W2 {& n3 O) Y. Z7 b8 U; c0 Y
0> more b.php2 }0 P" G( M  M( a0 d2 v$ |- _
<?php
$conn = mysql_connect("192.168.1.61","test","test") or die(mysql_error());
mysql_select_db("test",$conn) or die(mysql_error());
//$sql = "show tables";
echo date("Y-m-d H:i:s");( B4 b! z+ ]9 X. T- I4 @
//mysql_query($sql) or die(mysql_error());
for ($i=1; $i<=100000; $i++) {) L' }: k: L" T; w' x- f% f3 u" O9 K
$sql="update test.urls set url='http://xxxx.$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i.com' where id=$i;";8 ^+ s9 |) G6 f4 X1 k3 z. \! }- h7 i
mysql_query($sql) or die(mysql_error()); 8 I& u. O. \- t0 h
}
echo "/n";
0 J2 {+ r/ U, d. E. @, z! Xecho date("Y-m-d H:i:s");
?>
删除脚本:
# B3 ?, T- S2 f/ p6 ~; S/ ^0> more c.php
, j* s. g2 t$ ?% I  w: c<?php
$conn = mysql_connect("192.168.1.61","test","test") or die(mysql_error());
mysql_select_db("test",$conn) or die(mysql_error());
//$sql = "show tables";
echo date("Y-m-d H:i:s");
& R: I: L( `* e7 |" h//mysql_query($sql) or die(mysql_error());
for ($i=1; $i<=100000; $i++) {
& b) q, r6 M8 k1 E- ^. _0 E- g$sql="delete from test.urls where id=$i;";
( ^& m- G' \( V6 p5 p7 b7 t3 K( Omysql_query($sql) or die(mysql_error());
' D2 S: A/ y# C2 O! o9 I}
echo "/n";
* b% _* n% z( o/ |echo date("Y-m-d H:i:s");
?>

( z  ?6 i2 T: y! g# X- H
# N& @7 Q0 T( t2 r. a% a
五. 结论:
. p5 S: f, o* U4 q" o3 b测试依赖的环境比较多,可能数据会不准确。整体来看速度还不错。' L8 R) x, Y$ u1 H$ j6 R$ t3 F
适合项目应用相对比较小的场合。
优点:3 `: v6 \: v! \; d8 C- O
触发器中使用 UDFs 直接更新 Memcached 的内容,减轻了应用程序设计和编写的复杂性。
缺点:
0 q. t  N& o4 z6 F1. 如果出现mysql服务重启,需要重新设置连接memcached关系(SELECT memc_servers_set('192.168.3.184:11900'))
! u( ^! v& s# ]0 R/ [" P2. 有可能存在bug问题,导致mysql的crash(测试时没遇到:)).
+ Z# n; y' E' d7 F
真正的线上环境比这个复杂很多。我想到的需要考虑的问题:
- L4 a# k, N  w) H7 U- b# Z1. 网络因素,mysql和memcached是否放在同一IDC,他们之间的网络性能是否很好。网络性能越好,速度肯定越快,如果使用本机的memcached能适当的减少网络开销。, ~2 m. z/ t- [
2. 插入的数据量,向mysql插入每条记录的size,以及向memcached里面更新的数据size大小。更新mysql,memcached的数据size越大,更新的速度越慢。  M# }/ I: H5 h* H
所以前期规划好,在memcached里面存那两列(key-value)是关键。
* R& w% s! n& K3. 延时问题需要考虑,mysql所在机器如果资源使用比较狠,会导致更新memcached慢(出现类似m/s的延时问题)。
$ T, U- @( q3 @  l' w4. 考虑容灾问题,如果两者中有down出现时,需要考虑怎么恢复,当前的测试是这样考虑的:建一张错误表,如果在出现更新mc出现问题时,自动把更新错误的记录插到
) C* V# R2 p2 s5 V- g一张表里面,通过查这张表,可以知道哪些数据在什么时间更新错误,如果应用于生产环境,需要考虑监控和出现问题时恢复工作(写好脚本完善这个工作)。
: b( I' R+ T2 z" w/ C5. mysql自身因素,例如执行的mysql语句效率,以及连接mysql的client程序(php)的连接开销等等。

% f  N6 f, J' |1 t
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 00:12 , Processed in 0.036554 second(s), 26 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表