<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[MySQL内存表、MyISAM表、MemCache实现Session效率比较]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Wed, 16 Feb 2011 13:48:41 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	<br/>早先问过BleakWind，他认为，给别人做的话MySQL内存表做会话比较好一些，因为MySQL内存表做Session更容易维护（可以制作安装脚本）。这个周末，我进行了一些测试，测试MySQL MyISAM表做会话（对时间给不给索引）、内存表做会话、MemCache做会话的效率比较。<br/><br/>定义会话Session类：<br/><br/><br/>定义会话处理器接口（Session_Handler_Interface)：<br/><br/><br/>实现MySQL内存表Session处理器：<br/><br/><br/>实现MemCache会话处理器：<br/><br/><br/>MySQL内存表测试程序：<br/><br/><br/>MemCache会话测试代码：<br/><br/><br/>MySQL会话表如下：<br/><br/>CREATE TABLE `session` (<br/>`id` char(32) COLLATE utf8_unicode_ci NOT NULL,<br/>`name` varchar(20) COLLATE utf8_unicode_ci NOT NULL,<br/>`ip` varchar(15) COLLATE utf8_unicode_ci NOT NULL,<br/>`time` int(10) unsigned NOT NULL,<br/>PRIMARY KEY (`id`)<br/>) ENGINE=MEMORY DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;<br/><br/>测试结果：<br/><br/>MemCache：<br/><br/>======================================================================================<br/><br/>Concurrency Level:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;30<br/>Time taken for tests:&nbsp;&nbsp; 18.234375 seconds<br/>Complete requests:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10000<br/>Failed requests:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br/>Write errors:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br/>Total transferred:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2774781 bytes<br/>HTML transferred:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 280000 bytes<br/>Requests per second:&nbsp;&nbsp;&nbsp;&nbsp;548.41 [#/sec] (mean)<br/>Time per request:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 54.703 [ms] (mean)<br/>Time per request:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.823 [ms] (mean, across all concurrent requests)<br/>Transfer rate:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;148.57 [Kbytes/sec] received<br/><br/>Connection Times (ms)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min mean[+/-sd] median&nbsp;&nbsp; max<br/>Connect:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp; 1.9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;31<br/>Processing:&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp; 53 12.1&nbsp;&nbsp;&nbsp;&nbsp; 46&nbsp;&nbsp;&nbsp;&nbsp; 328<br/>Waiting:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp; 52 11.9&nbsp;&nbsp;&nbsp;&nbsp; 46&nbsp;&nbsp;&nbsp;&nbsp; 328<br/>Total:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp; 53 12.1&nbsp;&nbsp;&nbsp;&nbsp; 46&nbsp;&nbsp;&nbsp;&nbsp; 328<br/><br/>Percentage of the requests served within a certain time (ms)<br/>50%&nbsp;&nbsp;&nbsp;&nbsp; 46<br/>66%&nbsp;&nbsp;&nbsp;&nbsp; 62<br/>75%&nbsp;&nbsp;&nbsp;&nbsp; 62<br/>80%&nbsp;&nbsp;&nbsp;&nbsp; 62<br/>90%&nbsp;&nbsp;&nbsp;&nbsp; 62<br/>95%&nbsp;&nbsp;&nbsp;&nbsp; 62<br/>98%&nbsp;&nbsp;&nbsp;&nbsp; 62<br/>99%&nbsp;&nbsp;&nbsp;&nbsp; 78<br/>100%&nbsp;&nbsp;&nbsp;&nbsp;328 (longest request)<br/><br/>MySQL内存表：<br/><br/>=================================================================================<br/><br/>Concurrency Level:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;30<br/>Time taken for tests:&nbsp;&nbsp; 20.375000 seconds<br/>Complete requests:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10000<br/>Failed requests:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4694<br/>&nbsp;&nbsp; (Connect: 0, Length: 4694, Exceptions: 0)<br/>Write errors:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br/>Total transferred:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3118440 bytes<br/>HTML transferred:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 623048 bytes<br/>Requests per second:&nbsp;&nbsp;&nbsp;&nbsp;490.80 [#/sec] (mean)<br/>Time per request:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 61.125 [ms] (mean)<br/>Time per request:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.038 [ms] (mean, across all concurrent requests)<br/>Transfer rate:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;149.45 [Kbytes/sec] received<br/><br/>Connection Times (ms)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min mean[+/-sd] median&nbsp;&nbsp; max<br/>Connect:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp; 1.9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;31<br/>Processing:&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp; 60&nbsp;&nbsp; 7.6&nbsp;&nbsp;&nbsp;&nbsp; 62&nbsp;&nbsp;&nbsp;&nbsp; 125<br/>Waiting:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp; 59&nbsp;&nbsp; 7.6&nbsp;&nbsp;&nbsp;&nbsp; 62&nbsp;&nbsp;&nbsp;&nbsp; 125<br/>Total:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp; 60&nbsp;&nbsp; 7.5&nbsp;&nbsp;&nbsp;&nbsp; 62&nbsp;&nbsp;&nbsp;&nbsp; 125<br/><br/>Percentage of the requests served within a certain time (ms)<br/>50%&nbsp;&nbsp;&nbsp;&nbsp; 62<br/>66%&nbsp;&nbsp;&nbsp;&nbsp; 62<br/>75%&nbsp;&nbsp;&nbsp;&nbsp; 62<br/>80%&nbsp;&nbsp;&nbsp;&nbsp; 62<br/>90%&nbsp;&nbsp;&nbsp;&nbsp; 62<br/>95%&nbsp;&nbsp;&nbsp;&nbsp; 62<br/>98%&nbsp;&nbsp;&nbsp;&nbsp; 78<br/>99%&nbsp;&nbsp;&nbsp;&nbsp; 78<br/>100%&nbsp;&nbsp;&nbsp;&nbsp;125 (longest request)<br/><br/>其他测试：<br/><br/>将MySQL实现的数据库引擎改为 MyISAM（依然为 并发 30 测试 10000 次） 结果为：<br/><br/>Requests per second:&nbsp;&nbsp;&nbsp;&nbsp;440.17 [#/sec] (mean)<br/>Percentage of the requests served within a certain time (ms)<br/>50%&nbsp;&nbsp;&nbsp;&nbsp; 62<br/>66%&nbsp;&nbsp;&nbsp;&nbsp; 62<br/>75%&nbsp;&nbsp;&nbsp;&nbsp; 78<br/>80%&nbsp;&nbsp;&nbsp;&nbsp; 78<br/>90%&nbsp;&nbsp;&nbsp;&nbsp; 78<br/>95%&nbsp;&nbsp;&nbsp;&nbsp; 78<br/>98%&nbsp;&nbsp;&nbsp;&nbsp; 78<br/>99%&nbsp;&nbsp;&nbsp;&nbsp; 78<br/>100%&nbsp;&nbsp;&nbsp;&nbsp;640 (longest request)<br/><br/>为MyISAM表的 time 列增加索引（因为 会话表 读写次数几乎相等，因此应该效果不明显），结果为：<br/><br/>Requests per second:&nbsp;&nbsp;&nbsp;&nbsp;441.08 [#/sec] (mean)<br/>Percentage of the requests served within a certain time (ms)<br/>50%&nbsp;&nbsp;&nbsp;&nbsp; 62<br/>66%&nbsp;&nbsp;&nbsp;&nbsp; 62<br/>75%&nbsp;&nbsp;&nbsp;&nbsp; 78<br/>80%&nbsp;&nbsp;&nbsp;&nbsp; 78<br/>90%&nbsp;&nbsp;&nbsp;&nbsp; 78<br/>95%&nbsp;&nbsp;&nbsp;&nbsp; 78<br/>98%&nbsp;&nbsp;&nbsp;&nbsp;109<br/>99%&nbsp;&nbsp;&nbsp;&nbsp;109<br/>100%&nbsp;&nbsp;&nbsp;&nbsp;156 (longest request)<br/><br/>=================================================================================<br/><br/>结论：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; MemCache做会话效率最高，也最灵活，但目前尝不支持查看谁在线等功能，附加的，只能自己增加一个数组记录在线用户、以及最后活跃时间并实现gc等。<br/>&nbsp;&nbsp;&nbsp;&nbsp; MySQL内存表做会话效率也相当的高，另外一个有点是，MySQL内存表似乎更稳定，longest request （125ms）明显的短于 MemCache的（328ms）。不过缺点是，存储的字段数以及字段长度受限。<br/>&nbsp;&nbsp;&nbsp;&nbsp; MySQL MyISAM表做会话在这里居然也达到了440的rps，真不简单。不过您要是等半个小时在测试一次，您就会明白MyISAM表的缺点了，页面几乎崩溃。MyISAM表的缺点是，一旦其中有较多的碎片，这个数据库几乎都不可用了，您注释掉 gc 的代码在这里貌似可以获得更好的效率表现(^_^、当然也可以定时的Optimizer，概率触发或者Cron定时启动也不错）<br/>&nbsp;&nbsp;&nbsp;&nbsp; MyISAM表对time列增加索引对每秒完成的请求数没什么影响，不过有一点需要注意的是，增加索引后，每次完成 request的时间更均匀了,longest request从640ms跌到了156ms。为time列增加索引有助于让完成请求的时间变均匀。<br/><br/>测试平台：<br/><br/>Acer Aspire 4520G：<br/>CPU：AMD Athlon 64 * 2 TK-55<br/>RAM: IG<br/>OS: Windows XP sp2<br/>Web Server: Apache 2.26<br/>PHP: PHP5.25<br/>来源：http://hi.baidu.com/xydream/blog/item/42c7a47e17e0ca300dd7da5a.html
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] MySQL内存表、MyISAM表、MemCache实现Session效率比较]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>