<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>无影的博客 &#187; 数据库</title>
	<atom:link href="http://www.d5s.cn/archives/category/develop/database/feed" rel="self" type="application/rss+xml" />
	<link>http://www.d5s.cn</link>
	<description>我喜欢忽悠，她喜欢被忽悠。</description>
	<lastBuildDate>Mon, 14 Jun 2010 07:30:09 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>MySQL主从服务器的一些技巧</title>
		<link>http://www.d5s.cn/archives/106</link>
		<comments>http://www.d5s.cn/archives/106#comments</comments>
		<pubDate>Fri, 14 Nov 2008 02:55:21 +0000</pubDate>
		<dc:creator>owen</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.d5s.cn/archives/106</guid>
		<description><![CDATA[作者：老王
问题：主从服务器表类型的选择
一般的共识是主服务器使用innodb，从服务器使用myisam，以便各尽其能。
问题：主从服务器字段类型的选择
字段类型对于分页等操作有很大影响。主... ]]></description>
			<content:encoded><![CDATA[<p>作者：老王</p>
<p><strong>问题：主从服务器表类型的选择</strong></p>
<p>一般的共识是主服务器使用innodb，从服务器使用myisam，以便各尽其能。</p>
<p><strong>问题：主从服务器字段类型的选择</strong></p>
<p>字段类型对于分页等操作有很大影响。主服务器一般是innodb，因为不涉及查询，所以可以使用varchar等来存储字符串来节省空间，从服务器一般是 myisam，因为涉及查询，所以必须在char和varchar之间仔细权衡，没有varchar, text, blob字段的表是静态表，反之是动态表，静态表的检索效率要比动态表好若干倍，一般来说，所有涉及大结果集的查询都应该尽可能保证在静态表上完成，这里 说一个例子：比如说常见的articles表有title(varchar), body(text)等字段，在做文章列表的时候，因为不是静态表，所以查询不会很快，下面开始重构解决方案：把原来的articles表拆分成 subjects表和contents表，title字段设置为一个足够的char类型放在subjects表里，body字段还保持是text类型放到 contents表里，subjects和contents表之间的关系是一对多，这样，顺带着也方便的实现了多页文章的功能，而且更重要的是在查询文章 列表的时候，操作都是在subjects静态表里完成，效率肯定会比前一种方案提升很多。</p>
<p><strong>问题：</strong><strong>主从服务器</strong><strong>NOW()函数造成数据不一致</strong></p>
<p>假设在主服务器上执行一条INSERT &#8230;. VALUES ( &#8230;, NOW())，那么在从服务器上也会同样执行一条的SQL语句，但是一来主从服务器各自的时间设置可能就不一致，二来主从服务器间的SQL同步也可能存在 时间上的的延迟，这样，NOW()在两台服务器上的结果就可能不一致。解决方法是显而易见的，就是不要使用NOW()，时间的计算在应用程序里完成。这里 介绍一个额外的小技巧：在PHP里如果想获得当前时间的时间戳，不要用time()，而应该使用$_SERVER[‘REQUEST_TIME’] （PHP版本大于5.1有效），这样少做了一次系统调用，更有效率。</p>
<p><strong>问题：主从服务器读写分离时读操作失败</strong></p>
<p>先重现一下问题：比如说添加一条新数据，添加成功后根据last_insert_id跳转到新添加数据的浏览页面。在此过程中添加新数据的操作是在主服务 器上完成的，浏览新数据的操作实在从服务器上完成的，不过由于主从服务器间SQL同步存在延迟，所以当使用last_insert_id在从服务器上查询 的时候，从服务器很可能还没有还没来得及同步到此记录，所以读操作失败。解决思路也不复杂，在代码里加入一个缓存层（可以使用memcached），新添 加的数据都顺手放到缓存层里一份，新数据的读操作也先查询缓存层，这样就不会再有读操作失败的问题了，当然删除或者更新数据的时候也要顺带着处理好缓存数 据，可以使用观察者模式来搞定。不过这样缓存方案只限于读取单一的记录，对于读取列表的记录的情况，则是无效的。</p>
<p><strong>问题：主从服务器索引是否有必要保持一致</strong></p>
<p>一般都是利用主从服务器完成读写分离，从服务器上进行读操作，主服务器进行写操作，这样的话，主服务器上仅保留主键，外键，唯一索引等必要的索引即可，以 便保持数据合法性，而对于那些原本用于优化SELECT操作的索引，可以全部删除，如此的话主服务器的写操作效率会提升很多。</p>
<p>转自：<a href="http://hi.baidu.com/thinkinginlamp/blog/item/5d72dd5469b1885fd0090633.html " target="_blank">http://hi.baidu.com/thinkinginlamp/blog/item/5d72dd5469b1885fd0090633.html </a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.d5s.cn/archives/106/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql 分组 排序 取时间最大的一条记录</title>
		<link>http://www.d5s.cn/archives/102</link>
		<comments>http://www.d5s.cn/archives/102#comments</comments>
		<pubDate>Tue, 14 Oct 2008 07:35:40 +0000</pubDate>
		<dc:creator>owen</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.d5s.cn/archives/102</guid>
		<description><![CDATA[mysql 分组 group by, 排序 取每条记录中，时间最大的一条记录

SELECT A.* FROM test A,
(SELECT aid, MAX(day) max_day FROM test GROUP BY aid) B
WHERE A.aid = B.aid AND A.day = B.max_day
ORDER BY a.install DESC

以下是 test 表，测试... ]]></description>
			<content:encoded><![CDATA[<p>mysql 分组 group by, 排序 取每条记录中，时间最大的一条记录</p>
<p><span class="code"><br />
SELECT A.* FROM test A,<br />
(SELECT aid, MAX(day) max_day FROM test GROUP BY aid) B<br />
WHERE A.aid = B.aid AND A.day = B.max_day<br />
ORDER BY a.install DESC<br />
</span></p>
<p>以下是 test 表，测试sql</p>
<p><span class="code"><br />
CREATE TABLE IF NOT EXISTS `test` (<br />
`id` int(10) unsigned NOT NULL auto_increment,<br />
`install` int(10) unsigned NOT NULL,<br />
`day` int(10) unsigned NOT NULL,<br />
`aid` int(10) unsigned NOT NULL,<br />
PRIMARY KEY  (`id`)<br />
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=12 ;</span></p>
<p><span class="code"><br />
INSERT INTO `test` (`id`, `install`, `day`, `aid`) VALUES<br />
(1, 1232, 20080808, 1),<br />
(2, 2321, 20080809, 2),<br />
(3, 1236, 20080810, 3),<br />
(5, 4212, 20080809, 1),<br />
(6, 2312, 20080810, 1),<br />
(7, 1432, 20080811, 1),<br />
(8, 2421, 20080808, 2),<br />
(9, 4245, 20080811, 2),<br />
(10, 5654, 20080810, 2),<br />
(11, 412, 20080808, 3);<br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.d5s.cn/archives/102/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DBA 数据库 db4 写入、查询测试</title>
		<link>http://www.d5s.cn/archives/100</link>
		<comments>http://www.d5s.cn/archives/100#comments</comments>
		<pubDate>Sat, 27 Sep 2008 10:32:35 +0000</pubDate>
		<dc:creator>owen</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.d5s.cn/archives/100</guid>
		<description><![CDATA[可以先看看这里的简介 DBA数据库 （这里没有提到db4，现在应该使用db4）
安装：
打开php.ini 确定 php_dba.dll 已经载入。
之后就可以使用dba函数库了。
这个数据，就是简单的 key=&#62;value模式，和m... ]]></description>
			<content:encoded><![CDATA[<p>可以先看看这里的简介 <a target="_blank" href="http://www.itlearner.com/code/php/group.php-9.php">DBA数据库</a> （这里没有提到db4，现在应该使用db4）</p>
<p>安装：</p>
<p>打开php.ini 确定 php_dba.dll 已经载入。</p>
<p>之后就可以使用dba函数库了。</p>
<p>这个数据，就是简单的 key=&gt;value模式，和memcache差不多。</p>
<p>写入和查询速度都是非常快的。</p>
<p>如果是本机简单测试，可以使用 inifile 模式。</p>
<p>不过正式服务器上，一定要使用db4模式读写，因为其他模式比较慢，inifile就更慢了，还没有fopen快，所以inifile只能测试。</p>
<p>现在测试一下dba数据库的写入速度</p>
<p>每条数据是1k，写入速度分别是： <br />
10000条       1.71057009697<br />
100000条      21.7869038582<br />
1000000条    765.130697012</p>
<p>每条数据是2k，写入速度分别是： <br />
10000条       1.13584280014<br />
100000条      25.066011906<br />
1000000条     704.676019907</p>
<p>每条数据是3k，写入速度分别是： <br />
10000条       0.865121126175<br />
100000条      24.7635490894<br />
1000000条     745.992260933</p>
<p>每条数据是6k，写入速度分别是： <br />
10000条       4.17641997337<br />
100000条      102.979793072<br />
1000000条     1891.55883002</p>
<p> 可以看出，如果每条数据不超过3k的情况下，写入速度还是非常快的，而且大致都在一个范围内。（当然，这个速度还和服务器性能有关系）</p>
<p> 这是对测试结果做出的压力测试：</p>
<p>读取1000000数据的bdb库（3.9G左右），每次读取10-100条数据，每条数据的键，分别是1-1000000之间</p>
<p>This is ApacheBench, Version 2.3 &lt;$Revision: 655654 $&gt;<br />
Copyright 1996 Adam Twiss, Zeus Technology Ltd, <a href="http://www.zeustech.net/">http://www.zeustech.net/</a><br />
Licensed to The Apache Software Foundation, <a href="http://www.apache.org/">http://www.apache.org/</a></p>
<p>Benchmarking si.adtest.com (be patient)<br />
Server Software:        Apache/2.2.9<br />
Server Hostname:        si.adtest.com<br />
Server Port:            80</p>
<p>Document Path:          /test_bdb/r.php<br />
Document Length:        37 bytes</p>
<p>Concurrency Level:      700<br />
Time taken for tests:   2.558 seconds<br />
Complete requests:      700<br />
Failed requests:        555<br />
   (Connect: 0, Receive: 0, Length: 555, Exceptions: 0)<br />
Write errors:           0<br />
Total transferred:      193705 bytes<br />
HTML transferred:       26405 bytes<br />
Requests per second:    273.62 [#/sec] (mean)<br />
Time per request:       2558.262 [ms] (mean)<br />
Time per request:       3.655 [ms] (mean, across all concurrent requests)<br />
Transfer rate:          73.94 [Kbytes/sec] received</p>
<p>Connection Times (ms)<br />
              min  mean[+/-sd] median   max<br />
Connect:        0    2   1.4      2       7<br />
Processing:    82  471 118.6    517     559<br />
Waiting:       26  443 118.9    484     544<br />
Total:         82  473 119.2    519     559</p>
<p>Percentage of the requests served within a certain time (ms)<br />
  50%    519<br />
  66%    524<br />
  75%    528<br />
  80%    533<br />
  90%    539<br />
  95%    542<br />
  98%    547<br />
  99%    552<br />
 100%    559 (longest request)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.d5s.cn/archives/100/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>利用Tokyo Tyrant构建兼容Memcached协议、支持故障转移、高并发的分布式key-value持久存储系统</title>
		<link>http://www.d5s.cn/archives/97</link>
		<comments>http://www.d5s.cn/archives/97#comments</comments>
		<pubDate>Sat, 09 Aug 2008 13:09:40 +0000</pubDate>
		<dc:creator>owen</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.d5s.cn/archives/97</guid>
		<description><![CDATA[转自：http://blog.s135.com/read.php/362.htm 
这么牛X的数据库，为什么没人广泛采用呢？
估计
1、大部分人 不了解这东西；
2、项目管理层的人也许了解，但不敢尝试。
希望能有机会用到这样的好东西... ]]></description>
			<content:encoded><![CDATA[<p>转自：<a href="http://blog.s135.com/read.php/362.htm " target="_blank">http://blog.s135.com/read.php/362.htm </a></p>
<p>这么牛X的数据库，为什么没人广泛采用呢？</p>
<p>估计</p>
<p>1、大部分人 不了解这东西；</p>
<p>2、项目管理层的人也许了解，但不敢尝试。</p>
<p>希望能有机会用到这样的好东西。</p>
<p><a href="http://tokyocabinet.sourceforge.net/" target="_blank">Tokyo Cabinet</a> 是日本人 平林幹雄 开发的一款 DBM 数据库，该数据库读写非常快，哈希模式写入100万条数据只需0.643秒，读取100万条数据只需0.773秒，是 Berkeley DB 等 DBM 的几倍。</p>
<p><a href="http://blog.s135.com/attachment/200808/tokyocabinet.gif" target="_blank"><img src="http://blog.s135.com/attachment/200808/tokyocabinet.gif" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0" /></a></p>
<hr />
<a href="http://tokyocabinet.sourceforge.net/tyrantdoc/" target="_blank">Tokyo Tyrant</a> 是由同一作者开发的 Tokyo Cabinet 数据库网络接口。它拥有Memcached兼容协议，也可以通过HTTP协议进行数据交换。</p>
<p>Tokyo Tyrant 加上 Tokyo Cabinet，构成了一款支持高并发的分布式持久存储系统，对任何原有Memcached客户端来讲，可以将Tokyo Tyrant看成是一个Memcached，但是，它的数据是可以持久存储的。这一点，跟新浪的<a href="http://memcachedb.org/" target="_blank">Memcachedb</a>性质一样。</p>
<p><strong>相比Memcachedb而言，Tokyo Tyrant具有以下优势：</strong></p>
<p>1、故障转移：Tokyo Tyrant支持双机互为主辅模式，主辅库均可读写，而Memcachedb目前支持类似MySQL主辅库同步的方式实现读写分离，支持“主服务器可读写、辅助服务器只读”模式。</p>
<p><a href="http://blog.s135.com/attachment/200808/addserver.gif" target="_blank"><img src="http://blog.s135.com/attachment/200808/addserver.gif" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0" /></a></p>
<p>这里使用 $memcache-&gt;addServer 而不是 $memcache-&gt;connect 去连接 Tokyo Tyrant 服务器，是因为当 Memcache 客户端使用 addServer 服务器池时，是根据“crc32(key) % current_server_num”哈希算法将 key 哈希到不同的服务器的，PHP、C 和 python 的客户端都是如此的算法。Memcache 客户端的 addserver 具有故障转移机制，当 addserver 了2台 Memcached 服务器，而其中1台宕机了，那么 current_server_num 会由原先的2变成1。</p>
<p>引用 memcached 官方网站和 PHP 手册中的两段话：</p>
<p class="quote">
<p class="quote-title">引用</p>
<p class="quote-content">http://www.danga.com/memcached/<br />
If a host goes down, the API re-maps that dead host&#8217;s requests onto the servers that are available.</p>
<p><a href="http://cn.php.net/manual/zh/function.Memcache-addServer.php" target="_blank">http://cn.php.net/manual/zh/function.Memcache-addServer.php</a><br />
Failover may occur at any stage in any of the methods, as long as other servers are available the request the user won&#8217;t notice. Any kind of socket or Memcached server level errors (except out-of-memory) may trigger the failover. Normal client errors such as adding an existing key will not trigger a failover.</p>
<hr />
2、日志文件体积小：Tokyo Tyrant用于主辅同步的日志文件比较小，大约是数据库文件的1.3倍，而Memcachedb的同步日志文件非常大，如果不定期清理，很容易将磁盘写满。</p>
<hr />
3、超大数据量下表现出色：</p>
<p><a href="http://blog.s135.com/attachment/200808/tokyotyrant.gif" target="_blank"><img src="http://blog.s135.com/attachment/200808/tokyotyrant.gif" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0" /></a></p>
<p>但是，Tokyo Tyrant 也有缺点：<span style="color: #ff0000">在32位操作系统下，作为 Tokyo Tyrant 后端存储的 Tokyo Cabinet 数据库单个文件不能超过2G，而64位操作系统则不受这一限制。</span>所以，如果使用 Tokyo Tyrant，推荐在64位CPU、操作系统上安装运行。</p>
<hr />
<strong>一、安装</strong><br />
1、首先编译安装tokyocabinet数据库</p>
<p style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff">wget <a href="http://blog.s135.com/soft/linux/memcached/tokyocabinet-1.3.1.tar.gz" target="_blank">http://blog.s135.com/soft/linux/memcached/tokyocabinet-1.3.1.tar.gz</a><br />
tar zxvf tokyocabinet-1.3.1.tar.gz<br />
cd tokyocabinet-1.3.1/<br />
./configure<br />
make<br />
make install<br />
cd ../</p>
<p>2、然后编译安装tokyotyrant</p>
<p style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff">wget <a href="http://blog.s135.com/soft/linux/memcached/tokyotyrant-1.0.0.tar.gz" target="_blank">http://blog.s135.com/soft/linux/memcached/tokyotyrant-1.0.0.tar.gz</a><br />
tar zxvf tokyotyrant-1.0.0.tar.gz<br />
cd tokyotyrant-1.0.0/<br />
./configure<br />
make<br />
make install<br />
cd ../</p>
<hr />
<strong>二、配置</strong><br />
<strong>1、创建tokyotyrant数据文件存放目录</strong></p>
<p style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff">mkdir -p /ttserver/</p>
<p><strong>2、启动tokyotyrant的主进程（ttserver）</strong><br />
<strong>(1)、单机模式</strong></p>
<p style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff">ulimit -SHn 51200<br />
ttserver -host 127.0.0.1 -port 11211 -thnum 8 -dmn -pid /ttserver/ttserver.pid -log /ttserver/ttserver.log -le -ulog /ttserver/ -ulim 128m -sid 1 -rts /ttserver/ttserver.rts /ttserver/database.tch</p>
<p><strong>(2)、双机互为主辅模式</strong><br />
服务器192.168.1.91：</p>
<p style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff">ulimit -SHn 51200<br />
ttserver -host 192.168.1.91 -port 11211 -thnum 8 -dmn -pid /ttserver/ttserver.pid -log /ttserver/ttserver.log -le -ulog /ttserver/ -ulim 128m -sid 91 -mhost 192.168.1.92 -mport 11211 -rts /ttserver/ttserver.rts /ttserver/database.tch</p>
<p>服务器192.168.1.92：</p>
<p style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff">ulimit -SHn 51200<br />
ttserver -host 192.168.1.92 -port 11211 -thnum 8 -dmn -pid /ttserver/ttserver.pid -log /ttserver/ttserver.log -le -ulog /ttserver/ -ulim 128m -sid 92 -mhost 192.168.1.91 -mport 11211 -rts /ttserver/ttserver.rts /ttserver/database.tch</p>
<p><strong>(3)、参数说明</strong><br />
ttserver [-host name] [-port num] [-thnum num] [-tout num] [-dmn] [-pid path] [-log path] [-ld|-le] [-ulog path] [-ulim num] [-uas] [-sid num] [-mhost name] [-mport num] [-rts path] [dbname]</p>
<p>-host name : 指定需要绑定的服务器域名或IP地址。默认绑定这台服务器上的所有IP地址。<br />
-port num : 指定需要绑定的端口号。默认端口号为1978<br />
-thnum num : 指定线程数。默认为8个线程。<br />
-tout num : 指定每个会话的超时时间（单位为秒）。默认永不超时。<br />
-dmn : 以守护进程方式运行。<br />
-pid path : 输出进程ID到指定文件（这里指定文件名）。<br />
-log path : 输出日志信息到指定文件（这里指定文件名）。<br />
-ld : 在日志文件中还记录DEBUG调试信息。<br />
-le : 在日志文件中仅记录错误信息。<br />
-ulog path : 指定同步日志文件存放路径（这里指定目录名）。<br />
-ulim num : 指定每个同步日志文件的大小（例如128m）。<br />
-uas : 使用异步IO记录更新日志（使用此项会减少磁盘IO消耗，但是数据会先放在内存中，不会立即写入磁盘，如果重启服务器或ttserver进程被kill掉，将导致部分数据丢失。一般情况下不建议使用）。<br />
-sid num : 指定服务器ID号（当使用主辅模式时，每台ttserver需要不同的ID号）<br />
-mhost name : 指定主辅同步模式下，主服务器的域名或IP地址。<br />
-mport num : 指定主辅同步模式下，主服务器的端口号。<br />
-rts path : 指定用来存放同步时间戳的文件名。</p>
<p>如果使用的是哈希数据库，可以指定参数“#bnum=xxx”来提高性能。它可以指定bucket存储桶的数量。例如指定“#bnum=1000000”，就可以将最新最热的100万条记录缓存在内存中：</p>
<p style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff">ttserver -host 127.0.0.1 -port 11211 -thnum 8 -dmn -pid /ttserver/ttserver.pid -log /ttserver/ttserver.log -le -ulog /ttserver/ -ulim 128m -sid 1 -rts /ttserver/ttserver.rts /ttserver/database.tch#bnum=1000000</p>
<p>如果大量的客户端访问ttserver，请确保文件描述符够用。许多服务器的默认文件描述符为1024，可以在启动ttserver前使用ulimit命令提高这项值。例如：</p>
<p style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff">ulimit -SHn 51200</p>
<p><strong>3、停止tokyotyrant（ttserver）</strong></p>
<p style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff">ps -ef | grep ttserver</p>
<p>找到ttserver的进程号并kill，例如：</p>
<p style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff">kill -TERM 2159</p>
<hr />
<strong>三、调用</strong><br />
<strong>1、任何Memcached客户端均可直接调用tokyotyrant。</strong></p>
<p><strong>2、还可以通过HTTP方式调用，下面以Linux的curl命令为例，介绍如何操作tokyotyrant：</strong><br />
(1)、写数据，将数据“value”写入到“key”中：</p>
<p style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff">curl -X PUT <a href="http://127.0.0.1:11211/key" target="_blank">http://127.0.0.1:11211/key</a> -d &#8220;value&#8221;</p>
<p>(2)、读数据，读取“key”中数据：</p>
<p style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff">curl <a href="http://127.0.0.1:11211/key" target="_blank">http://127.0.0.1:11211/key</a></p>
<p>(3)、删数据，删除“key”：</p>
<p style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff">curl -X DELETE <a href="http://127.0.0.1:11211/key" target="_blank">http://127.0.0.1:11211/key</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.d5s.cn/archives/97/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MYSQL 主从服务器配置</title>
		<link>http://www.d5s.cn/archives/95</link>
		<comments>http://www.d5s.cn/archives/95#comments</comments>
		<pubDate>Thu, 10 Jul 2008 05:12:59 +0000</pubDate>
		<dc:creator>owen</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.d5s.cn/archives/95</guid>
		<description><![CDATA[mysql服务器的主从配置，本来是一件很简单的事情，无奈不是从零开始，总是在别人已经安装好的mysql服务器之上 ，这就会牵扯到，mysql的版本，启动文件，等一些问题。
不过没关系，先问清楚... ]]></description>
			<content:encoded><![CDATA[<p>mysql服务器的主从配置，本来是一件很简单的事情，无奈不是从零开始，总是在别人已经安装好的mysql服务器之上 ，这就会牵扯到，mysql的版本，启动文件，等一些问题。</p>
<p>不过没关系，先问清楚两点</p>
<p>1、mysql配置文件my.cnf的位置</p>
<p>2、如何启动、停止mysql，找好启动文件</p>
<p>假设有两台机器，已经安装好了mysql（尽量同版本，且两台机器同一网络，可以ping通）</p>
<p>有朋友说：“从服务器，不能低于主服务器的版本”，不过我是低于的，没有出现问题。</p>
<p>主机A: 192.168.1.100</p>
<p>从机B:192.168.1.101</p>
<p>可以有多台从机</p>
<p>1、先登录主机 A</p>
<p>mysql&gt;<span style="font-size: 12pt; line-height: 150%">GRANT </span>REPLICATION SLAVE<span style="font-size: 12pt; line-height: 150%"> ON *.* TO ‘backup’@&#8217;</span>192.168.1.101<span style="font-size: 12pt; line-height: 150%">&#8216; IDENTIFIED BY ‘123456’;</span></p>
<p>赋予从机权限，有多台丛机，就执行多次</p>
<p>2、 打开主机A的my.cnf，输入</p>
<p>server-id               = 1    #主机标示，整数<br />
log_bin                 = /var/log/mysql/mysql-bin.log   #确保此文件可写<br />
read-only       =0  #主机，读写都可以<br />
binlog-do-db    =test   #需要备份数据，多个写多行<br />
binlog-ignore-db=mysql #不需要备份的数据库，多个写多行</p>
<p>3、打开从机B的my.cnf，输入</p>
<p>server-id               = 2<br />
log_bin                 = /var/log/mysql/mysql-bin.log<br />
master-host     =192.168.1.100<br />
master-user     =<span style="font-size: 12pt; line-height: 150%">backup</span><br />
master-pass     =<span style="font-size: 12pt; line-height: 150%">123456</span><br />
master-port     =3306<br />
master-connect-retry=60 #如果从服务器发现主服务器断掉，重新连接的时间差(秒)<br />
replicate-do-db =test #只复制某个库<br />
replicate-ignore-db=mysql #不复制某个库</p>
<p>4、同步数据库</p>
<p>有多种方法，我说最笨的一种，先mysqldump导出主机A的数据test为 test.sql</p>
<p>然后在，从机B上建立数据库test，mysql导入 test.sql到test库中</p>
<p>5、先重启主机A的mysql，再重启从机B的mysql</p>
<p>6、验证</p>
<p>在主机A中，mysql&gt;show master status\G;</p>
<p>在从机B中，mysql&gt;show slave status\G;</p>
<p>能看到大致这些内容</p>
<p>File: mysql-bin.000001<br />
Position: 1374<br />
Binlog_Do_DB: test<br />
Binlog_Ignore_DB: mysql</p>
<p>可以在主机A中，做一些INSERT, UPDATE, DELETE 操作，看看主机B中，是否已经被修改<br />
以下是一些其他朋友写的，我也做了参考</p>
<p>http://www.ningoo.net/html/2007/mysql_replication_configuration.html</p>
<p>http://leftleg.hzpub.com/post/645/</p>
<p>http://blog.zhangjianfeng.com/article/705</p>
]]></content:encoded>
			<wfw:commentRss>http://www.d5s.cn/archives/95/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>MYSQL 事务 笔记</title>
		<link>http://www.d5s.cn/archives/93</link>
		<comments>http://www.d5s.cn/archives/93#comments</comments>
		<pubDate>Fri, 27 Jun 2008 16:29:41 +0000</pubDate>
		<dc:creator>owen</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.d5s.cn/archives/93</guid>
		<description><![CDATA[ 由于项目设计里面，牵扯到了金钱的转移，于是就要用到MYSQL的事务处理，来保证一组处理结果的正确性
用了事务，就不可避免的要牺牲一部分速度，来保证数据的正确性。
只有InnoDB支持事... ]]></description>
			<content:encoded><![CDATA[<p><strong> </strong>由于项目设计里面，牵扯到了金钱的转移，于是就要用到MYSQL的事务处理，来保证一组处理结果的正确性</p>
<p>用了事务，就不可避免的要牺牲一部分速度，来保证数据的正确性。</p>
<p><strong>只有InnoDB支持事务</strong></p>
<p>事务 ACID Atomicity（原子性）、Consistency（稳定性）、Isolation（隔离性）、Durability（可靠性）</p>
<p>1、事务的原子性<br />
一组事务，要么成功；要么撤回。</p>
<p>2、稳定性<br />
有非法数据（外键约束之类），事务撤回。</p>
<p>3、隔离性<br />
事务独立运行。<br />
一个事务处理后的结果，影响了其他事务，那么其他事务会撤回。<br />
事务的100%隔离，需要牺牲速度。</p>
<p>4、可靠性<br />
软、硬件崩溃后，InnoDB数据表驱动会利用日志文件重构修改。<br />
可靠性和高速度不可兼得， innodb_flush_log_at_trx_commit选项 决定什么时候吧事务保存到日志里。<br />
<strong>开启事务<br />
</strong> START TRANSACTION 或 BEGIN</p>
<p><strong>提交事务</strong>（关闭事务）<br />
 COMMIT</p>
<p><strong>放弃事务</strong>（关闭事务）<br />
 ROLLBACK</p>
<p><strong>折返点<br />
</strong> SAVEPOINT adqoo_1<br />
 ROLLBACK TO SAVEPOINT adqoo_1<br />
 发生在折返点 adqoo_1 之前的事务被提交，之后的被忽略</p>
<p><strong>事务的终止</strong></p>
<p>设置“自动提交”模式<br />
 SET AUTOCOMMIT = 0<br />
 每条SQL都是同一个事务的不同命令，之间由 COMMIT 或 ROLLBACK隔开<br />
 掉线后，没有 COMMIT 的事务都被放弃</p>
<p><strong>事务锁定模式</strong></p>
<p>系统默认： 不需要等待某事务结束，可直接查询到结果，但不能再进行修改、删除。<br />
缺点：查询到的结果，可能是已经过期的。<br />
优点：不需要等待某事务结束，可直接查询到结果。</p>
<p>需要用以下模式来设定锁定模式</p>
<p>1、SELECT …… LOCK IN SHARE MODE（共享锁）<br />
查询到的数据，就是数据库在这一时刻的数据（其他已commit事务的结果，已经反应到这里了）<br />
SELECT 必须等待，某个事务结束后才能执行</p>
<p>2、SELECT …… FOR UPDATE（排它锁）<br />
例如 SELECT * FROM tablename WHERE id&lt;200<br />
那么id&lt;200的数据，被查询到的数据，都将不能再进行修改、删除、SELECT …… LOCK IN SHARE MODE操作<br />
一直到此事务结束</p>
<p>共享锁 和 排它锁 的区别：在于是否阻断其他客户发出的 SELECT …… LOCK IN SHARE MODE命令</p>
<p>3、INSERT / UPDATE / DELETE<br />
所有关联数据都会被锁定，加上排它锁</p>
<p>4、防插入锁<br />
例如 SELECT * FROM tablename WHERE id&gt;200<br />
那么id&gt;200的记录无法被插入</p>
<p>5、死锁<br />
自动识别死锁<br />
先进来的进程被执行，后来的进程收到出错消息，并按ROLLBACK方式回滚<br />
innodb_lock_wait_timeout = n 来设置最长等待时间，默认是50秒</p>
<p><strong>事务隔离模式</strong></p>
<p>SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL<br />
READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE<br />
1、不带SESSION、GLOBAL的SET命令<br />
 只对下一个事务有效<br />
2、SET SESSION<br />
 为当前会话设置隔离模式<br />
3、SET GLOBAL<br />
 为以后新建的所有MYSQL连接设置隔离模式（当前连接不包括在内）</p>
<p><strong>隔离模式</strong></p>
<p>   READ UNCOMMITTED<br />
 不隔离SELECT<br />
 其他事务未完成的修改（未COMMIT），其结果也考虑在内</p>
<p>   READ COMMITTED<br />
 把其他事务的 COMMIT 修改考虑在内<br />
 同一个事务中，同一 SELECT 可能返回不同结果</p>
<p>   REPEATABLE READ（默认）<br />
 不把其他事务的修改考虑在内，无论其他事务是否用COMMIT命令提交过<br />
 同一个事务中，同一 SELECT 返回同一结果（前提是本事务，不修改）</p>
<p>   SERIALIZABLE<br />
 和REPEATABLE READ类似，给所有的SELECT都加上了 共享锁</p>
<p>出错处理<br />
 根据出错信息，执行相应的处理</p>
]]></content:encoded>
			<wfw:commentRss>http://www.d5s.cn/archives/93/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>MySQL DBA 管理 常用 命令</title>
		<link>http://www.d5s.cn/archives/92</link>
		<comments>http://www.d5s.cn/archives/92#comments</comments>
		<pubDate>Wed, 25 Jun 2008 06:33:47 +0000</pubDate>
		<dc:creator>owen</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.d5s.cn/archives/92</guid>
		<description><![CDATA[虽然自己不是DBA，但是作为一个程序员，多多少少，应该了解一些数据库方面的东西，并不能只关心程序，不考虑数据库，看到一篇文章，就先转过来，也许以后自己哪天会用到。
查看mysql的... ]]></description>
			<content:encoded><![CDATA[<p>虽然自己不是DBA，但是作为一个程序员，多多少少，应该了解一些数据库方面的东西，并不能只关心程序，不考虑数据库，看到一篇文章，就先转过来，也许以后自己哪天会用到。</p>
<p>查看mysql的某个选项<br />
<span class="code">show variables like &#8216;%VAR_NAME%&#8217;;<br />
select @@VAR_NAME;<br />
</span></p>
<p>    在Linux下管理MySQL数据库的时候总有一些很紧急的情况，发现数据库突然变得压力很大了，那么作为一个DBA，也许需要一些常用的手段或者说命令去分析问题出现在哪里，然后解决：</p>
<p>数据库突然产生压力时查看正在查询的SQL:(如果这里内容太多表示并发执行的SQL过多，或许数据库堵塞了，会越来越慢，正常情况下这里应该很少有东西的，也就是连接都在Sleep状态）<br />
/usr/local/mysql/bin/mysql -uroot -ppassword databaseName  -e &#8220;show full processlist&#8221; | grep -v Sleep</p>
<p>正在运行的SQL太多了，看不过来，那需要排序了，看持续执行时间最长的那些SQL：<br />
/usr/local/mysql/bin/mysql -uroot -ppassword databaseName  -e &#8220;show full processlist&#8221; | grep -v Sleep | sort -k6rn &gt;sort.tmp</p>
<p>如果发现IOWait很高，请查看临时表的生成情况，特别是disk tmp table:<br />
/usr/local/mysql/bin/mysql -uroot -ppassword databaseName  -e &#8220;show global status like &#8216;%tmp%&#8217;&#8221;</p>
<p>通过这样一些办法可以查看数据库都在忙什么，那些忙的SQL又具体在哪一个步骤上卡住了，是在创建磁盘临时文件、Sending Data、statistics？依照不同的原因来解决问题</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
关于Mysql Replication日常管理，重做，问题分析时常用的办法：</p>
<p>重做Slave，或者Master变化等等，需要将Slave与新的Master同步：<br />
change master to master_host=IP,master_user=&#8217;replication userName&#8217;,master<br />
_password=&#8217;replication Passwrod&#8217;,master_log_file=&#8217;log-bin.000001&#8242;,master_log_pos=0;</p>
<p>导出数据成SQL文本，慎用，根据你的DB大小会锁表，导致堵塞其他访问：<br />
nohup /usr/local/mysql/bin/mysqldump &#8211;database DATABASEName -uUserName -pPassWord &#8211;lock-all-tables -F &gt;DATA20070519.sql &amp;<br />
-F后会刷新Master Log这样配合上面的Change Master可以让Slave进行同步</p>
<p>只导出数据库的结构（没有任何内容）<br />
/usr/local/mysql/bin/mysqldump -d DATABASEName -uUserName -pPassWord &gt;DATA20070519.structure</p>
<p>只导出数据库的数据（没有创建表结构的语句等等）<br />
/usr/local/mysql/bin/mysqldump -t DATABASEName -uUserName -pPassWord &gt;DATA20070519.data</p>
<p>同步的时候出现问题（或者其他问题）了，根据同步出现问题的位置（偏移量），查看Binlog的具体内容<br />
/usr/local/mysql/bin/mysqlbinlog binlogFileName &#8211;start-position=偏移量<br />
呵呵，我们碰到过Master执行的SQL到了Slave会报语法错误，够诡异吧！不过就是这样查到了原因：如果通过存储过程将bit的内容改为1就会出现这样的问题，后来将bit改为tinyint(1)就好了</p>
<p>授权给某一台Slave拥有复制的权限：<br />
grant replication slave on *.* to 用户名@IP identified by &#8216;密码&#8217;;</p>
<p>查看Slave状态：<br />
Show slave status \G<br />
查看Master状态：<br />
Show master status;<br />
重置Slave（慎用）<br />
reset slave;<br />
Slave出现问题了，先跳过这一条语句（请确认所要跳过的具体内容不会影响后面的同步，确认方法查看Binlog文件）：<br />
set global sql_slave_skip_counter=1; (记得先暂停Slave：stop slave; 然后重启Slave：start slave;)</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
纯粹Linux相关的：<br />
tcpdump -A &#8220;dst port 3306&#8243; 查看3306端口的通信具体内容 <img src='http://www.d5s.cn/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
<p>转自：<a target="_blank" href="http://mrtips.blog.hexun.com/5904126_d.html">http://mrtips.blog.hexun.com/5904126_d.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.d5s.cn/archives/92/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysqldump 导出单个表</title>
		<link>http://www.d5s.cn/archives/47</link>
		<comments>http://www.d5s.cn/archives/47#comments</comments>
		<pubDate>Thu, 03 Jan 2008 06:29:27 +0000</pubDate>
		<dc:creator>owen</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.d5s.cn/archives/47</guid>
		<description><![CDATA[导出整个数据库database
mysqldump &#8211;opt -uroot -ppassword database &#62; dump.sql
导出单个数据表table
mysqldump &#8211;opt &#8211;add-drop-table -uroot -ppassword database table &#62; dump.sql... ]]></description>
			<content:encoded><![CDATA[<p>导出整个数据库database<br />
mysqldump &#8211;opt -uroot -ppassword database &gt; dump.sql</p>
<p>导出单个数据表table<br />
mysqldump &#8211;opt <strong><font color="#ff0000">&#8211;add-drop-table</font></strong> -uroot -ppassword database table &gt; dump.sql</p>
]]></content:encoded>
			<wfw:commentRss>http://www.d5s.cn/archives/47/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>超级诡异的MySQL server has gone away解决办法</title>
		<link>http://www.d5s.cn/archives/45</link>
		<comments>http://www.d5s.cn/archives/45#comments</comments>
		<pubDate>Tue, 25 Dec 2007 10:07:49 +0000</pubDate>
		<dc:creator>owen</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.d5s.cn/archives/45</guid>
		<description><![CDATA[遇到了一个非常变态的mysql错误，可能和他遇到的一样变态，点击查看。
无论怎么优化都一直出现这样的mysql错误：MySQL server has gone away
我程序中出现的错误原因可能是，mysql连接超时被关闭了... ]]></description>
			<content:encoded><![CDATA[<p>遇到了一个非常变态的mysql错误，可能和他遇到的一样变态，<a href="http://www.jimmydong.com/blog/post/1/123">点击查看</a>。</p>
<p>无论怎么优化都一直出现这样的mysql错误：MySQL server has gone away<br />
我程序中出现的错误原因可能是，mysql连接超时被关闭了，这可以通过修改my.ini，修改wait_timeout的值，来延长等待时间。（此方法未尝试）<br />
我在程序中加入了如下判断，程序可以执行了。</p>
<div class="hl-title">&#19979;&#36733;: <a href="http://www.d5s.cn/wp-content/plugins/coolcode/coolcode.php?p=45&amp;download=connect.php">connect.php</a></div><div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">&lt;?php</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: #00008b;">$link</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">mysql_close</span><span style="color: Olive;">(</span><span style="color: #00008b;">$link</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span><span style="color: #ffa500;">//这里最好先再关闭一次，否则可能会出错</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$link</span><span style="color: Gray;"> = </span><span style="color: Blue;">content</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span><span style="color: Green;">elseif</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Blue;">mysql_ping</span><span style="color: Olive;">(</span><span style="color: #00008b;">$link</span><span style="color: Olive;">)){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">mysql_close</span><span style="color: Olive;">(</span><span style="color: #00008b;">$link</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$link</span><span style="color: Gray;"> = </span><span style="color: Blue;">content</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Blue;">?&gt;</span></li></ol></div>
<p> <span id="more-45"></span></p>
<div class="hl-title">&#19979;&#36733;: <a href="http://www.d5s.cn/wp-content/plugins/coolcode/coolcode.php?p=45&amp;download=mysql_connect.php">mysql_connect.php</a></div><div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">&lt;?php</span></li>
<li><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">content</span><span style="color: Olive;">(){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">mysql_pconnect</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">localhost</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">root</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">password</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span><span style="color: Blue;">mysql_select_db</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">d5s</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Blue;">set_time_limit</span><span style="color: Olive;">(</span><span style="color: Maroon;">0</span><span style="color: Olive;">)</span><span style="color: Gray;">;&nbsp; &nbsp; </span><span style="color: #ffa500;">//避免apache执行脚本超时</span></li>
<li><span style="color: #00008b;">$link</span><span style="color: Gray;"> = </span><span style="color: Blue;">content</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: #00008b;">$num</span><span style="color: Gray;"> = </span><span style="color: Maroon;">10</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">//每次查出XX条</span></li>
<li><span style="color: #00008b;">$sum</span><span style="color: Gray;"> = </span><span style="color: Maroon;">1000</span><span style="color: Gray;">;&nbsp; &nbsp; </span><span style="color: #ffa500;">//多少条记录</span></li>
<li><span style="color: Green;">for</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: #00008b;">$i</span><span style="color: Gray;">=</span><span style="color: Maroon;">0</span><span style="color: Gray;">; </span><span style="color: #00008b;">$i</span><span style="color: Gray;">&lt;=</span><span style="color: #00008b;">$sum</span><span style="color: Gray;">; </span><span style="color: #00008b;">$i</span><span style="color: Gray;">=</span><span style="color: #00008b;">$i</span><span style="color: Gray;">+</span><span style="color: #00008b;">$num</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #00008b;">$sql</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">SELECT * FROM `tables` WHERE is_get=0 LIMIT </span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">.</span><span style="color: #00008b;">$num</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #00008b;">$result</span><span style="color: Gray;"> = </span><span style="color: Blue;">mysql_query</span><span style="color: Olive;">(</span><span style="color: #00008b;">$sql</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #00008b;">$arr_row</span><span style="color: Gray;"> = </span><span style="color: Green;">array</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">while</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: #00008b;">$row</span><span style="color: Gray;"> = </span><span style="color: Blue;">mysql_fetch_array</span><span style="color: Olive;">(</span><span style="color: #00008b;">$result</span><span style="color: Gray;">, </span><span style="color: Blue;">MYSQL_ASSOC</span><span style="color: Olive;">))</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$arr_row</span><span style="color: Olive;">[]</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$row</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">mysql_free_result</span><span style="color: Olive;">(</span><span style="color: #00008b;">$result</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">foreach</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: #00008b;">$arr_row</span><span style="color: Gray;"> </span><span style="color: Green;">as</span><span style="color: Gray;"> </span><span style="color: #00008b;">$row</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">//超耗时代码开始</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">/*</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ……</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; */</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">//超耗时代码结束</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: #00008b;">$link</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">mysql_close</span><span style="color: Olive;">(</span><span style="color: #00008b;">$link</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$link</span><span style="color: Gray;"> = </span><span style="color: Blue;">content</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span><span style="color: Green;">elseif</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Blue;">mysql_ping</span><span style="color: Olive;">(</span><span style="color: #00008b;">$link</span><span style="color: Olive;">)){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">mysql_close</span><span style="color: Olive;">(</span><span style="color: #00008b;">$link</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$link</span><span style="color: Gray;"> = </span><span style="color: Blue;">content</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">mysql_query</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">UPDATE `tables` SET is_get = 1 WHERE id = </span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">.</span><span style="color: #00008b;">$row</span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">id</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">])</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Blue;">mysql_close</span><span style="color: Olive;">(</span><span style="color: #00008b;">$link</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Blue;">?&gt;</span></li></ol></div>
]]></content:encoded>
			<wfw:commentRss>http://www.d5s.cn/archives/45/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何减少网页的内存与CPU占用</title>
		<link>http://www.d5s.cn/archives/39</link>
		<comments>http://www.d5s.cn/archives/39#comments</comments>
		<pubDate>Wed, 21 Nov 2007 02:51:19 +0000</pubDate>
		<dc:creator>owen</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.d5s.cn/archives/39</guid>
		<description><![CDATA[看到一篇很不错的js方面的文章，转了过来。
转自：http://www.aoao.org.cn/blog/2007/11/memory-cpu/ 
有的网页看起来并不大但打开会很卡，有的网页虽然很长但使用流畅，占用用户电脑的内存与CPU就影响... ]]></description>
			<content:encoded><![CDATA[<p>看到一篇很不错的js方面的文章，转了过来。</p>
<p>转自：<a href="http://www.aoao.org.cn/blog/2007/11/memory-cpu/">http://www.aoao.org.cn/blog/2007/11/memory-cpu/</a> </p>
<p>有的网页看起来并不大但打开会很卡，有的网页虽然很长但使用流畅，占用用户电脑的内存与CPU就影响这些。</p>
<p>浏览器问题，有各自的浏览器处理内存问题会影响到，但几乎没办法控制得了，Windows上的：</p>
<ul>
<li>IE系列，刷新回收的量不大，但最小化会释放内存，。</li>
<li>Firefox2据说也会在最小化回收，可我从没见过最垃圾，用多少是多少，基本不回收。据说prototype的ajax还会引起内存一直增加。</li>
<li>Opera最好。一直控制得很好。不存在什么问题。。</li>
</ul>
<p>Linux的内存分配机制与Win的不一样，有多少用多少，如果浏览器占光时说不定会干掉系统。</p>
<p>页面问题，浏览器渲染页面会消耗内存和CPU，能减少一点就减少点。</p>
<p><span id="more-39"></span></p>
<h4>结构上</h4>
<ul>
<li>使用DocType，告诉浏览器你在用什么，html4也有DTD。也许Transitional更适合你</li>
<li>如果使用的是XHTML并能保持良好结构的话，记得输出相应的MIME跟XML头<sup><a href="http://www.aoao.org.cn/blog/2007/11/memory-cpu/#f1">1</a></sup>，可以减少浏览器的代码检查，</li>
<li>保持结构的完整，不要让浏览器帮你补全代码。</li>
<li>控制页面的文件大小，可以通过程序把为了看代码比如舒服的缩进去掉。2~3K也是大小。</li>
<li>iframe会产生新的页面，其实有很多方式可以代替iframe</li>
<li>引入的JS与CSS可以适当合并，同样背景图片也可以合并，甚至有人连Flash都合并</li>
<li>给已知宽高的内容图片/Object加上宽度的属性可以减少页面的局部重渲染</li>
</ul>
<h4>表现上</h4>
<ul>
<li>质量99跟70的jpg在大多数情况下只有文件有大小不一样。gif的也一样，特别是小图标，256色跟128色的差别是文件大小．</li>
<li>flash动得太快吃CPU很大，控制每秒的帧数及动画的效果可以减少一些，如果把品质用中低显示会省很多资源，但这样却牺牲了效果。。quality属性 有时选择Autolow<sup><a href="http://www.aoao.org.cn/blog/2007/11/memory-cpu/#f2">2</a></sup> 或者Autohigh会更适合，没必要一直low 或者best，</li>
<li>flash使用矢量图会节省文件大小，但计算复杂的图形跟动画时花的是CPU。复杂的太多滤镜，则会占用大量内存，模糊滤镜有减少些<sup><a href="http://www.aoao.org.cn/blog/2007/11/memory-cpu/#f3">3</a></sup>。</li>
<li>IE的滤镜也是比较占用内存，同时也有兼容性问题。全屏的半透明很吃资源的。</li>
<li>2*2的图片跟8*8的图片大小差不多，但是平铺背景2*2却占用大很多。</li>
<li>gif动画同样有帧的概念，别把gif当成flash来玩就行。</li>
</ul>
<h4>行为上</h4>
<ul>
<li>别为了使用一个$()引入整个pretotype或jQuery，它们有更多的作用。</li>
<li>AJAX很帅。但是用xml会用上XML解析器，有人推荐用JSON，可是这样要eval数据，其实可以直接import已经是对象的script来用。只是要多传个对象名，或者把对象名写死，或者像flickr那样<code><font face="Courier New">jsonFlickrApi({"xxx":"xxx"})</font></code>，直接当函数用，挖哈哈。</li>
<li>实现某些效果时能用<code><font face="Courier New">visibility:hidden</font></code>解决时就别用<code><font face="Courier New">display:none</font></code>来玩。</li>
<li>在这里强调js变量要注全局跟局部等等的意义并不大，JS复杂的地方也不是一两句能说得清的，关注大家关注月影的正在出版的新书吧。^^</li>
</ul>
<p>其实这里有的内容有不少跟<a href="http://www.aoao.org.cn/blog/2007/06/how-to-show-our-pages-quickly/">如何快速的呈现我们的网页</a>相近，不过那篇是以处理服务端为主，但在很多时候，节省服务端资源消耗的同时也会节省客户端的资源消耗。</p>
<ol>
<li><a name="f1" title="f1"></a>产生问题：虽然会引起<a href="http://www.aoao.org.cn/blog/2007/01/browser-mode/" title="浏览器的模式问题 Quirks Mode vs Standards Mode">浏览器的模式问题</a>，但问题是可以解决滴。参考<a href="http://keystonewebsites.com/articles/mime_type.php">Serving up XHTML with the correct MIME type</a>，派送XML头浏览器不会容错显示，出现错误结构会导致整个页面无法显法。</li>
<li><a name="f2" title="f2"></a>Autolow: 优先考虑速度，但是也会尽可能改善外观。 回放开始时，消除锯齿功能处于关闭状态。 如果 Flash Player 检测到处理器可以处理消除锯齿功能，就会打开该功能。<br />
Autohigh:开始时回放速度和外观两者并重，必要时会牺牲外观来保证回放速度。 回放开始时，消除锯齿功能处于打开状态。如果实际帧频降到指定帧频之下，就会关闭消除锯齿功能以提高回放速度。使用此设置可模拟“消除锯齿”命令（“视图”&gt;“预览模式”&gt;“消除锯齿”）。</li>
<li><a name="f3" title="f3"></a>模糊滤镜:使用模糊滤镜时，如果用于 blurX 和 blurY 的值是 2 的整数次幂（例如 2、4、8、16 和 32），则可以加快计算速度，并且可以使性能提高 20% 到 30%（flash的帮助是介样说滴）。</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.d5s.cn/archives/39/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
