﻿
<?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.helloyi.cn/index.php/category/database/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.helloyi.cn</link>
	<description>春色三分,二分尘土,一分流水</description>
	<lastBuildDate>Fri, 30 Sep 2011 08:46:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>linux下mysql5.5.11编译安装笔记</title>
		<link>http://www.helloyi.cn/index.php/2011/04/08/mysql5-5-11-install-log/</link>
		<comments>http://www.helloyi.cn/index.php/2011/04/08/mysql5-5-11-install-log/#comments</comments>
		<pubDate>Fri, 08 Apr 2011 08:59:01 +0000</pubDate>
		<dc:creator>好易阁</dc:creator>
				<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[mysql5.5]]></category>
		<category><![CDATA[mysql5.5.11]]></category>

		<guid isPermaLink="false">http://www.helloyi.cn/?p=3347</guid>
		<description><![CDATA[mysql 最新的版本5.5.11需要cmake编译安装，估计以后的版本也会采用这种方式，网上找了一些安装方法有些地方是错的，自己整理一份 所以特地记录一下安装步骤及过程，以供参考！ 1,安装所需要系统库相关库文件 yum –y install gcc gcc-c++ gcc-g77 autoconf automake zlib* fiex* libxml* ncurses-devel libmcrypt* libtool-ltdl-devel* 2,创建mysql安装目录 # mkdir -p /usr/local/webserver/mysql/ 3,创建数据存放目录 # mkdir -p /data/mysql/ 4,创建用户和用户组与赋予数据存放目录权限 # groupadd mysql # useradd -g mysql mysql # chown mysql.mysql -R /data/mysql/ 5,安装cmake（mysql5.5以后是通过cmake来编译的） # wget http://www.cmake.org/files/v2.8/cmake-2.8.4.tar.gz # tar zxvf cmake-2.8.4.tar.gz # cd cmake-2.8.4 #.configure # [...]]]></description>
			<content:encoded><![CDATA[<p>mysql 最新的版本5.5.11需要cmake编译安装，估计以后的版本也会采用这种方式，网上找了一些安装方法有些地方是错的，自己整理一份 所以特地记录一下安装步骤及过程，以供参考！<br />
<span id="more-3347"></span></p>
<div class="codecolorer-container c mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span>安装所需要系统库相关库文件<br />
yum –y install gcc gcc<span style="color: #339933;">-</span>c<span style="color: #339933;">++</span> gcc<span style="color: #339933;">-</span>g77 autoconf automake zlib<span style="color: #339933;">*</span> fiex<span style="color: #339933;">*</span> libxml<span style="color: #339933;">*</span><br />
ncurses<span style="color: #339933;">-</span>devel libmcrypt<span style="color: #339933;">*</span> libtool<span style="color: #339933;">-</span>ltdl<span style="color: #339933;">-</span>devel<span style="color: #339933;">*</span><br />
<span style="color: #0000dd;">2</span><span style="color: #339933;">,</span>创建mysql安装目录<br />
<span style="color: #339933;"># mkdir -p /usr/local/webserver/mysql/</span><br />
<span style="color: #0000dd;">3</span><span style="color: #339933;">,</span>创建数据存放目录<br />
<span style="color: #339933;"># mkdir -p /data/mysql/</span><br />
<span style="color: #0000dd;">4</span><span style="color: #339933;">,</span>创建用户和用户组与赋予数据存放目录权限<br />
<span style="color: #339933;"># groupadd mysql</span><br />
<span style="color: #339933;"># useradd -g mysql mysql</span><br />
<span style="color: #339933;"># chown mysql.mysql -R /data/mysql/</span><br />
<span style="color: #0000dd;">5</span><span style="color: #339933;">,</span>安装cmake（mysql5.5以后是通过cmake来编译的）<br />
<span style="color: #339933;"># wget http://www.cmake.org/files/v2.8/cmake-2.8.4.tar.gz</span><br />
<span style="color: #339933;"># tar zxvf cmake-2.8.4.tar.gz</span><br />
<span style="color: #339933;"># cd cmake-2.8.4</span><br />
<span style="color: #339933;">#.configure</span><br />
<span style="color: #339933;"># make &amp;amp;&amp;amp; make install</span><br />
<span style="color: #0000dd;">6</span><span style="color: #339933;">,</span>下载解压mysql 5.5.11<br />
wget http<span style="color: #339933;">:</span><span style="color: #666666; font-style: italic;">//mirrors.sohu.com/mysql/MySQL-5.5/mysql-5.5.11.tar.gz</span><br />
<span style="color: #009900;">&#91;</span>root@localhost down<span style="color: #009900;">&#93;</span><span style="color: #339933;"># tar zxvf mysql-5.5.11.tar.gz</span><br />
<span style="color: #009900;">&#91;</span>root@localhost down<span style="color: #009900;">&#93;</span><span style="color: #339933;"># cd mysql-5.5.11</span><br />
<span style="color: #0000dd;">7</span><span style="color: #339933;">,</span>编译mysql<span style="color: #339933;">-</span>5.5.11<br />
cmake . <span style="color: #339933;">-</span>DCMAKE_INSTALL_PREFIX<span style="color: #339933;">=/</span>usr<span style="color: #339933;">/</span>local<span style="color: #339933;">/</span>webserver<span style="color: #339933;">/</span>mysql<span style="color: #339933;">/</span><br />
\<span style="color: #339933;">-</span>DMYSQL_DATADIR<span style="color: #339933;">=/</span>data<span style="color: #339933;">/</span>mysql<br />
\<span style="color: #339933;">-</span>DMYSQL_UNIX_ADDR<span style="color: #339933;">=/</span>data<span style="color: #339933;">/</span>mysql<span style="color: #339933;">/</span>mysqld.<span style="color: #202020;">sock</span><br />
\<span style="color: #339933;">-</span>DWITH_INNOBASE_STORAGE_ENGINE<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><br />
\<span style="color: #339933;">-</span>DENABLED_LOCAL_INFILE<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span> \<span style="color: #339933;">-</span>DMYSQL_TCP_PORT<span style="color: #339933;">=</span><span style="color: #0000dd;">3306</span><br />
\<span style="color: #339933;">-</span>DEXTRA_CHARSETS<span style="color: #339933;">=</span>all \<span style="color: #339933;">-</span>DDEFAULT_CHARSET<span style="color: #339933;">=</span>utf8<br />
\<span style="color: #339933;">-</span>DDEFAULT_COLLATION<span style="color: #339933;">=</span>utf8<span style="color: #339933;">-</span>general_ci<br />
\<span style="color: #339933;">-</span>DMYSQL_UNIX_ADDR<span style="color: #339933;">=/</span>data<span style="color: #339933;">/</span>mysql<span style="color: #339933;">/</span>mysql.<span style="color: #202020;">sock</span><br />
\<span style="color: #339933;">-</span>DMYSQL_USER<span style="color: #339933;">=</span>mysql \<span style="color: #339933;">-</span>DWITH_DEBUG<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><br />
<span style="color: #009900;">&#91;</span>root@host mysql<span style="color: #339933;">-</span>5.5.11<span style="color: #009900;">&#93;</span><span style="color: #339933;"># make</span><br />
<span style="color: #009900;">&#91;</span>root@host mysql<span style="color: #339933;">-</span>5.5.11<span style="color: #009900;">&#93;</span><span style="color: #339933;"># make install</span><br />
<span style="color: #0000dd;">8</span><span style="color: #339933;">,</span>复制配置文件<br />
<span style="color: #009900;">&#91;</span>root@mysql<span style="color: #339933;">-</span>5.5.11<span style="color: #009900;">&#93;</span><span style="color: #339933;"># cp support-files/my-medium.cnf /etc/my.cnf</span><br />
<span style="color: #009900;">&#91;</span>root@mysql<span style="color: #339933;">-</span>5.5.11<span style="color: #009900;">&#93;</span><span style="color: #339933;"># cp support-files/mysql.server /etc/init.d/mysqld</span><br />
<span style="color: #009900;">&#91;</span>root@mysql<span style="color: #339933;">-</span>5.5.11<span style="color: #009900;">&#93;</span><span style="color: #339933;"># chmod 755 /etc/init.d/mysqld</span><br />
<span style="color: #0000dd;">9</span><span style="color: #339933;">,</span>初始化数据库<br />
bash scripts<span style="color: #339933;">/</span>mysql_install_db <span style="color: #339933;">--</span>user<span style="color: #339933;">=</span>mysql <span style="color: #339933;">--</span>basedir<span style="color: #339933;">=</span><br />
<span style="color: #339933;">/</span>usr<span style="color: #339933;">/</span>local<span style="color: #339933;">/</span>webserver<span style="color: #339933;">/</span>mysql <span style="color: #339933;">--</span>datadir<span style="color: #339933;">=/</span>data<span style="color: #339933;">/</span>mysql<span style="color: #339933;">/</span><br />
<span style="color: #0000dd;">10</span><span style="color: #339933;">,</span>启动mysql服务<br />
<span style="color: #009900;">&#91;</span>root@localhost mysql<span style="color: #339933;">-</span>5.5.11<span style="color: #009900;">&#93;</span><span style="color: #339933;"># /etc/init.d/mysqld start</span><br />
<span style="color: #0000dd;">11</span><span style="color: #339933;">,</span>启动完成之后用ps <span style="color: #339933;">-</span>ef <span style="color: #339933;">|</span>grep mysql 命令查看是否启动<br />
<span style="color: #0000dd;">12</span><span style="color: #339933;">,</span> <span style="color: #339933;">/</span>usr<span style="color: #339933;">/</span>local<span style="color: #339933;">/</span>webserver<span style="color: #339933;">/</span>mysql<span style="color: #339933;">/</span>bin<span style="color: #339933;">/</span>mysql <span style="color: #339933;">-</span>u root <span style="color: #339933;">-</span>p<br />
通过命令行登录管理MySQL服务器 初始密码为空<br />
<span style="color: #0000dd;">13</span><span style="color: #339933;">,</span>修改root密码<br />
mysql<span style="color: #339933;">&gt;;</span>use mysql <span style="color: #339933;">;</span><br />
mysql<span style="color: #339933;">&gt;;</span> update user set password<span style="color: #339933;">=</span>PASSWORD<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;123456&quot;</span><span style="color: #009900;">&#41;</span> where user<span style="color: #339933;">=</span><span style="color: #ff0000;">'root'</span><span style="color: #339933;">;</span><br />
mysql<span style="color: #339933;">&gt;;</span> FLUSH PRIVILEGES<span style="color: #339933;">;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://www.helloyi.cn/index.php/2011/04/08/mysql5-5-11-install-log/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>键值数据库redis安装和使用</title>
		<link>http://www.helloyi.cn/index.php/2010/10/08/redis-make/</link>
		<comments>http://www.helloyi.cn/index.php/2010/10/08/redis-make/#comments</comments>
		<pubDate>Fri, 08 Oct 2010 08:10:50 +0000</pubDate>
		<dc:creator>好易阁</dc:creator>
				<category><![CDATA[数据库应用]]></category>

		<guid isPermaLink="false">http://www.helloyi.cn/?p=3298</guid>
		<description><![CDATA[redis是一个带存储功能的键值数据库,其代表主要有MemcacheDB，Tokyo Cabinet,mongodb等等.2.0中一些主要的新功能： MULTI/EXEC: 支持原子性的支持多条语句，但注意，这和我们传统意义上的事物操作还是有差别的。 Publish/Subscribe: Pub相当于发布消息，Sub相当于订阅消息，在微博客如此盛行的今天，相信这一功能不会太难理解。 Hashes (or dicts): Redis又支持了一种新的数据类型，其内存使用效率更高。 Virtual Memory: 虚拟内存。在Redis2.0之前，所有数据都是存在内存中的，而按时间条件进行的定时dump到磁盘的操作，也仅仅是个备份作用。而2.0中的虚拟内存，使得你可以自由分配Redis可耗用的内存，当数据超出指定内存限制时，不常用数据会被交换到磁盘。 下载地址：http://redis.googlecode.com/files/redis-2.0.0.tar.gz这里有篇国外的人对redis,memcached,tokyo tyrant等做的对测试：http://www.ruturaj.net/redis-memcached-tokyo-tyrant-mysql-comparison可以看出redis的性测非常出色。另外redis的数据类似也非常出色，比memcached丰富很多。官方站点为：http://redis.googlecode.com/ 下面安装是以1.2版本为例进行： 安装：wget http://redis.googlecode.com/files/redis-1.2.1.tar.gztar -xvzf redis-1.2.1.tar.gzcd redis-1.2.1make不要想make install，他们还没做，呵呵。cp redis-cli redis-benchmark redis-server /usr/bincp redis.conf /etc/数据库文件保存在 /var/lib/redis：mkdir /var/lib/redisvi /etc/redis.confdaemonize yespidfile /var/run/redis.pidport 6379timeout 300loglevel debuglogfile /var/log/redis.logdatabases 16save 900 1save 300 10save 60 10000rdbcompression yesdbfilename dump.rdbdir /var/lib/redisappendonly yesappendfsync alwaysglueoutputbuf yesshareobjects noshareobjectspoolsize 1024save 900 1save 300 10save 60 [...]]]></description>
			<content:encoded><![CDATA[<p>redis是一个带存储功能的键值数据库,其代表主要有<a style="color: #000000; line-height: normal;" href="http://memcachedb.org/" target="_blank">MemcacheDB</a>，<a style="color: #000000; line-height: normal;" href="http://tokyocabinet.sourceforge.net/" target="_blank">Tokyo Cabinet</a>,mongodb等等.2.0中一些主要的新功能： MULTI/EXEC: 支持原子性的支持多条语句，但注意，这和我们传统意义上的事物操作还是有差别的。 Publish/Subscribe: Pub相当于发布消息，Sub相当于订阅消息，在微博客如此盛行的今天，相信这一功能不会太难理解。</p>
<p><span id="more-3298"></span>Hashes (or dicts): Redis又支持了一种新的数据类型，其内存使用效率更高。</p>
<p>Virtual Memory: 虚拟内存。在Redis2.0之前，所有数据都是存在内存中的，而按时间条件进行的定时dump到磁盘的操作，也仅仅是个备份作用。而2.0中的虚拟内存，使得你可以自由分配Redis可耗用的内存，当数据超出指定内存限制时，不常用数据会被交换到磁盘。</p>
<p>下载地址：http://redis.googlecode.com/files/redis-2.0.0.tar.gz<br style="line-height: normal;" /><br style="line-height: normal;" />这里有篇国外的人对redis,memcached,tokyo tyrant等做的对测试：<br style="line-height: normal;" /><a style="color: #99d100; text-decoration: underline; line-height: normal;" href="http://www.ruturaj.net/redis-memcached-tokyo-tyrant-mysql-comparison" target="_blank">http://www.ruturaj.net/redis-memcached-tokyo-tyrant-mysql-comparison</a><br style="line-height: normal;" /><br style="line-height: normal;" />可以看出redis的性测非常出色。<br style="line-height: normal;" /><br style="line-height: normal;" />另外redis的数据类似也非常出色，比memcached丰富很多。<br style="line-height: normal;" /><br style="line-height: normal;" />官方站点为：http://redis.googlecode.com/</p>
<p>下面安装是以1.2版本为例进行：</p>
<p>安装：wget http://redis.googlecode.com/files/redis-1.2.1.tar.gz<br style="line-height: normal;" /><br style="line-height: normal;" />tar -xvzf redis-1.2.1.tar.gz<br style="line-height: normal;" /><br style="line-height: normal;" />cd redis-1.2.1<br style="line-height: normal;" /><br style="line-height: normal;" />make<br style="line-height: normal;" /><br style="line-height: normal;" />不要想make install，他们还没做，呵呵。<br style="line-height: normal;" /><br style="line-height: normal;" />cp redis-cli redis-benchmark redis-server /usr/bin<br style="line-height: normal;" />cp redis.conf /etc/<br style="line-height: normal;" /><br style="line-height: normal;" />数据库文件保存在 /var/lib/redis：<br style="line-height: normal;" />mkdir /var/lib/redis<br style="line-height: normal;" /><br style="line-height: normal;" />vi /etc/redis.conf<br style="line-height: normal;" />daemonize yes<br style="line-height: normal;" />pidfile /var/run/redis.pid<br style="line-height: normal;" />port 6379<br style="line-height: normal;" />timeout 300<br style="line-height: normal;" />loglevel debug<br style="line-height: normal;" />logfile /var/log/redis.log<br style="line-height: normal;" />databases 16<br style="line-height: normal;" />save 900 1<br style="line-height: normal;" />save 300 10<br style="line-height: normal;" />save 60 10000<br style="line-height: normal;" />rdbcompression yes<br style="line-height: normal;" />dbfilename dump.rdb<br style="line-height: normal;" />dir /var/lib/redis<br style="line-height: normal;" />appendonly yes<br style="line-height: normal;" />appendfsync always<br style="line-height: normal;" />glueoutputbuf yes<br style="line-height: normal;" />shareobjects no<br style="line-height: normal;" />shareobjectspoolsize 1024<br style="line-height: normal;" /><br style="line-height: normal;" /><br style="line-height: normal;" />save 900 1<br style="line-height: normal;" />save 300 10<br style="line-height: normal;" />save 60 10000<br style="line-height: normal;" /><br style="line-height: normal;" />这里的意思是900秒内有1个改变，300秒内有10个改变，60秒内有10000个改变，redis就会内存中的key保存到数据库文件中去。<br style="line-height: normal;" /><br style="line-height: normal;" />开机启动：<br style="line-height: normal;" />vi /etc/rc.local <br style="line-height: normal;" /><br style="line-height: normal;" />/usr/bin/redis-server /etc/redis.conf<br style="line-height: normal;" /><br style="line-height: normal;" />测试：<br style="line-height: normal;" /><br style="line-height: normal;" />新建一个key<br style="line-height: normal;" />[root@mysqltest ~]# redis-cli set testkey keyv<br style="line-height: normal;" />OK<br style="line-height: normal;" /><br style="line-height: normal;" />取一个key<br style="line-height: normal;" />[root@mysqltest ~]# redis-cli get testkey<br style="line-height: normal;" />keyv<br style="line-height: normal;" />查看redis内的所有key<br style="line-height: normal;" />[root@mysqltest ~]# redis-cli keys \*         <br style="line-height: normal;" />testkey<br style="line-height: normal;" />查看redis状态<br style="line-height: normal;" />[root@mysqltest ~]# redis-cli info<br style="line-height: normal;" />redis_version:1.2.1<br style="line-height: normal;" />arch_bits:64<br style="line-height: normal;" />multiplexing_api:epoll<br style="line-height: normal;" />uptime_in_seconds:144<br style="line-height: normal;" />uptime_in_days:0<br style="line-height: normal;" />connected_clients:1<br style="line-height: normal;" />connected_slaves:0<br style="line-height: normal;" />used_memory:619250<br style="line-height: normal;" />changes_since_last_save:1<br style="line-height: normal;" />bgsave_in_progress:0<br style="line-height: normal;" />last_save_time:1265165103<br style="line-height: normal;" />bgrewriteaof_in_progress:0<br style="line-height: normal;" />total_connections_received:5<br style="line-height: normal;" />total_commands_processed:4<br style="line-height: normal;" />role:master<br style="line-height: normal;" />db0:keys=1,expires=0</p>
<p>redis命令中文手册</p>
<p>DEL :删除某个key,或是一系列key;DEL key1 key2 key3 key4</p>
<p>TYPE : 返回某个key元素的数据类型 ( none:不存在,string:字符,list,set,zset,hash)</p>
<p>KEYS : 返回匹配的key列表 (KEYS foo*:查找foo开头的keys)</p>
<p>RANDOMKEY : 随机获得已经存在的key</p>
<p>RENAME : 更改key的名字，如果名字存在则更改失败</p>
<p>DBSIZE : 返回当前数据库的key的总数</p>
<p>EXPIRE : 设置某个key的过期时间（秒）,(EXPIRE bruce 1000：设置bruce这个key1000秒后系统自动删除)</p>
<p>TTL : 查找某个key还有多长时间过期,返回时间秒</p>
<p>SELECT : 选择数据库</p>
<p>MOVE : 把key从一个数据库转移到另外一个库</p>
<p>FLUSHDB : 清空当前数据库数据</p>
<p>FLUSHALL :清空所有数据库数据</p>
<p>SET 存一个数据到数据库 SET keyname datalength data (SET bruce 10 paitoubing:保存key为burce,字符串长度为10的一个字符串paitoubing到数据库)</p>
<p>GET :获取某个key 的value值</p>
<p>GETSET GETSET可以理解成获得的key的值然后SET这个值，更加方便的操作 (SET bruce 10 paitoubing,这个时候需要修改bruce变成1234567890并获取这个</p>
<p>以前的数据paitoubing,GETSET bruce 10 1234567890)</p>
<p>MGET 一次性获得多个key的数据 (MGET uid:1:name uid:1:email uid:1:ciy)</p>
<p>SETNX SETNX与SET的区别是SET可以创建与更新key的value，而SETNX是如果key不存在，则创建key与value数据</p>
<p>SETEX SETEX = SET + EXPIRE,貌似我的这个版本没有办法测试</p>
<p>MSET 一次性设置多个参数的值(MSET uid:1:name shjuto uid:1:email shjuto@gmail.com uid:1:city 8 回车 nanchang)最后一个值需要回车输入，和SET一样，不知为啥。</p>
<p>MSETNX 如果设置的key不存在的话,或是叫做新key的话；一次性设置多个参数的值(MSET uid:1:name shjuto uid:1:email shjuto@gmail.com uid:1:city 8</p>
<p>回车 nanchang)最后一个值需要回车输入，和SET一样，不知为啥。</p>
<p>INCR 自增，有点类是mysql incr.(INCR global:uid)</p>
<p>INCRBY 自增 +length ,(INCRBY uid 5)原来的基础+5=result</p>
<p>DECR 自减</p>
<p>* DECRBY 自减 -lenght</p>
<p>LISTS （无索引序列,head位置是0,……）</p>
<p># RPUSH 追加数据到系列的尾部 (RPUSH listtest 10 \n 1111111122)</p>
<p># LPUSH 追加数据到序列的头部 (LPUSH listtest 10 \n 2222222222)</p>
<p># LLEN 一个序列的长度；（LLEN listtest）</p>
<p># LRANGE 从自定的范围内返回序列的元素 (LRANGE testlist 0 2;返回序列testlist前0 1 2元素)</p>
<p># LTRIM 修剪某个范围之外的数据 (LTRIM testlist 0 2;保留0 1 2元素，其余的删除)</p>
<p># LINDEX 返回某个位置的序列值(LINDEX testlist 0;返回序列testlist位置为零的元素)</p>
<p># LSET 更新某个位置元素的值 (LSET testlist 0 5 \n 55555;)</p>
<p># LPOP key Return and remove (atomically) the first element of the List at key</p>
<p># RPOP key Return and remove (atomically) the last element of the List at key</p>
<p># LREM 根据值删除序列元素 (LREM testlist 0 5 \n 33333;删除序列中所有的等于33333的元素,为何不是REMOVE BY KEY?不知道何故，可能对删除重复数</p>
<p>据有用吧)</p>
<p># BLPOP key1 key2 … keyN timeout Blocking LPOP &gt;1.31，后续更新</p>
<p># BRPOP key1 key2 … keyN timeout Blocking RPOP &gt;1.31</p>
<p># RPOPLPUSH srckey dstkey Return and remove (atomically) the last element of the source List stored at _srckey_ and push the same element</p>
<p>to the destination List stored at _dstkey_</p>
<p>SETS （有索引无序序列）</p>
<p># SADD 增加元素到SETS序列,如果元素不存在则添加成功 1，否则失败 0;(SADD testlist 3 \n one)</p>
<p># SREM 删除SETS序列的某个元素，如果元素不存则失败0，否则成功 1(SREM testlist 3 \N one)</p>
<p># SPOP 随机删除某个元素 （SPOP testlist）</p>
<p># SMOVE 把一个SETS序列的某个元素 移动到 另外一个SETS序列 (SMOVE testlist test 3\n two;从序列testlist移动元素two到 test中，—testlist中将</p>
<p>不存在two元素)</p>
<p># SCARD 统计某个SETS的序列的元素数量 (SCARD testlist)</p>
<p># SISMEMBER 产看某个数据是否在序列中,(SISMEMBER testlist 3 \n two)</p>
<p># SINTER 几个SETS序列的交集 SINTER key1 key2 … keyN (SINTER test testlist),牛B呀</p>
<p># SINTERSTORE 把计算出来的交集 记录到一个新的序列 SINTERSTORE dstkey key1 key2 … keyN (SINTERSTORE resultlist testlist test;把testlist</p>
<p>test的交集记录到resultlist)</p>
<p># SUNION 几个SETS序列的并集 SUNION key1 key2 … keyN (SUNION test testlist)</p>
<p># SUNIONSTORE 把计算出来的并集 记录到一个新的序列 SUNIONSTORE dstkey key1 key2 … keyN (SUNIONSTORE resultlist testlist test;把testlist</p>
<p>test的交集记录到resultlist)</p>
<p># SDIFF key1 key2 … keyN,求出某几个序列的并集 与 某个序列 求出差集 ，请看官方例子：</p>
<p>key1 = x,a,b,c</p>
<p>key2 = c</p>
<p>key3 = a,d</p>
<p>SDIFF key1,key2,key3 =&gt; x,b</p>
<p># SDIFFSTORE dstkey key1 key2 … keyN ,和前面的SINTERSTORE SUNIONSTORE差不多，对比</p>
<p># SMEMBERS KEY 返回某个序列的所有元素</p>
<p># SRANDMEMBER KEY 随机返回某个序列的元素</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">DEL :删除某个key,或是一系列key;DEL key1 key2 key3 key4</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">TYPE : 返回某个key元素的数据类型 ( none:不存在,string:字符,list,set,zset,hash)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">KEYS : 返回匹配的key列表 (KEYS foo*:查找foo开头的keys)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">RANDOMKEY : 随机获得已经存在的key</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">RENAME : 更改key的名字，如果名字存在则更改失败</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">DBSIZE : 返回当前数据库的key的总数</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">EXPIRE : 设置某个key的过期时间（秒）,(EXPIRE bruce 1000：设置bruce这个key1000秒后系统自动删除)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">TTL : 查找某个key还有多长时间过期,返回时间秒</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">SELECT : 选择数据库</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">MOVE : 把key从一个数据库转移到另外一个库</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">FLUSHDB : 清空当前数据库数据</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">FLUSHALL :清空所有数据库数据</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">SET 存一个数据到数据库 SET keyname datalength data (SET bruce 10 paitoubing:保存key为burce,字符串长度为10的一个字符串paitoubing到数据库)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">GET :获取某个key 的value值</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">GETSET GETSET可以理解成获得的key的值然后SET这个值，更加方便的操作 (SET bruce 10 paitoubing,这个时候需要修改bruce变成1234567890并获取这个</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">以前的数据paitoubing,GETSET bruce 10 1234567890)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">MGET 一次性获得多个key的数据 (MGET uid:1:name uid:1:email uid:1:ciy)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">SETNX SETNX与SET的区别是SET可以创建与更新key的value，而SETNX是如果key不存在，则创建key与value数据</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">SETEX SETEX = SET + EXPIRE,貌似我的这个版本没有办法测试</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">MSET 一次性设置多个参数的值(MSET uid:1:name shjuto uid:1:email shjuto@gmail.com uid:1:city 8 回车 nanchang)最后一个值需要回车输入，和SET</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">一样，不知为啥。</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">MSETNX 如果设置的key不存在的话,或是叫做新key的话；一次性设置多个参数的值(MSET uid:1:name shjuto uid:1:email shjuto@gmail.com uid:1:city 8</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">回车 nanchang)最后一个值需要回车输入，和SET一样，不知为啥。</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">INCR 自增，有点类是mysql incr.(INCR global:uid)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">INCRBY 自增 +length ,(INCRBY uid 5)原来的基础+5=result</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">DECR 自减</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">* DECRBY 自减 -lenght</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">LISTS （无索引序列,head位置是0,……）</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># RPUSH 追加数据到系列的尾部 (RPUSH listtest 10 \n 1111111122)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># LPUSH 追加数据到序列的头部 (LPUSH listtest 10 \n 2222222222)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># LLEN 一个序列的长度；（LLEN listtest）</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># LRANGE 从自定的范围内返回序列的元素 (LRANGE testlist 0 2;返回序列testlist前0 1 2元素)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># LTRIM 修剪某个范围之外的数据 (LTRIM testlist 0 2;保留0 1 2元素，其余的删除)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># LINDEX 返回某个位置的序列值(LINDEX testlist 0;返回序列testlist位置为零的元素)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># LSET 更新某个位置元素的值 (LSET testlist 0 5 \n 55555;)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># LPOP key Return and remove (atomically) the first element of the List at key</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># RPOP key Return and remove (atomically) the last element of the List at key</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># LREM 根据值删除序列元素 (LREM testlist 0 5 \n 33333;删除序列中所有的等于33333的元素,为何不是REMOVE BY KEY?不知道何故，可能对删除重复数</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">据有用吧)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># BLPOP key1 key2 … keyN timeout Blocking LPOP &gt;1.31，后续更新</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># BRPOP key1 key2 … keyN timeout Blocking RPOP &gt;1.31</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># RPOPLPUSH srckey dstkey Return and remove (atomically) the last element of the source List stored at _srckey_ and push the same element</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">to the destination List stored at _dstkey_</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">SETS （有索引无序序列）</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># SADD 增加元素到SETS序列,如果元素不存在则添加成功 1，否则失败 0;(SADD testlist 3 \n one)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># SREM 删除SETS序列的某个元素，如果元素不存则失败0，否则成功 1(SREM testlist 3 \N one)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># SPOP 随机删除某个元素 （SPOP testlist）</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># SMOVE 把一个SETS序列的某个元素 移动到 另外一个SETS序列 (SMOVE testlist test 3\n two;从序列testlist移动元素two到 test中，—testlist中将</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">不存在two元素)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># SCARD 统计某个SETS的序列的元素数量 (SCARD testlist)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># SISMEMBER 产看某个数据是否在序列中,(SISMEMBER testlist 3 \n two)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># SINTER 几个SETS序列的交集 SINTER key1 key2 … keyN (SINTER test testlist),牛B呀</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># SINTERSTORE 把计算出来的交集 记录到一个新的序列 SINTERSTORE dstkey key1 key2 … keyN (SINTERSTORE resultlist testlist test;把testlist</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">test的交集记录到resultlist)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># SUNION 几个SETS序列的并集 SUNION key1 key2 … keyN (SUNION test testlist)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># SUNIONSTORE 把计算出来的并集 记录到一个新的序列 SUNIONSTORE dstkey key1 key2 … keyN (SUNIONSTORE resultlist testlist test;把testlist</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">test的交集记录到resultlist)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># SDIFF key1 key2 … keyN,求出某几个序列的并集 与 某个序列 求出差集 ，请看官方例子：</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">key1 = x,a,b,c</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">key2 = c</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">key3 = a,d</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">SDIFF key1,key2,key3 =&gt; x,b</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># SDIFFSTORE dstkey key1 key2 … keyN ,和前面的SINTERSTORE SUNIONSTORE差不多，对比</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># SMEMBERS KEY 返回某个序列的所有元素</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 928px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># SRANDMEMBER KEY 随机返回某个序列的元素</div>
]]></content:encoded>
			<wfw:commentRss>http://www.helloyi.cn/index.php/2010/10/08/redis-make/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NoSQL数据库探讨之一为什么要用非关系数据库？</title>
		<link>http://www.helloyi.cn/index.php/2010/07/23/nosql-exploration/</link>
		<comments>http://www.helloyi.cn/index.php/2010/07/23/nosql-exploration/#comments</comments>
		<pubDate>Fri, 23 Jul 2010 08:26:11 +0000</pubDate>
		<dc:creator>好易阁</dc:creator>
				<category><![CDATA[数据库应用]]></category>

		<guid isPermaLink="false">http://www.helloyi.cn/?p=3275</guid>
		<description><![CDATA[随着互联网web2.0网站的兴起，非关系型的数据库现在成了一个极其热门的新领域，非关系数据库产品的发展非常迅速。而传统的关系数据库在应付web2.0网站，特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心，暴露了很多难以克服的问题，例如：   1、High performance -对数据库高并发读写的需求      web2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息，所以基本上无法使用动态页面静态化技术，因此数据库并发负载非常高，往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住，但是应付上万次SQL写数据请求，硬盘IO就已经无法承受了。其实对于普通的 BBS网站，往往也存在对高并发写请求的需求，例如像JavaEye网站的实时统计在线用户状态，记录热门帖子的点击次数，投票计数等，因此这是一个相当普遍的需求。      2、Huge Storage -对海量数据的高效率存储和访问的需求      类似Facebook，twitter，Friendfeed这样的SNS网站，每天用户产生海量的用户动态，以Friendfeed为例，一个月就达到了2.5亿条用户动态，对于关系数据库来说，在一张2.5亿条记录的表里面进行SQL查询，效率是极其低下乃至不可忍受的。再例如大型web网站的用户登录系统，例如腾讯，盛大，动辄数以亿计的帐号，关系数据库也很难应付。      3、High Scalability&#38;&#38; High Availability-对数据库的高可扩展性和高可用性的需求      在基于web的架构当中，数据库是最难进行横向扩展的，当一个应用系统的用户量和访问量与日俱增的时候，你的数据库却没有办法像web server和app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说，对数据库系统进行升级和扩展是非常痛苦的事情，往往需要停机维护和数据迁移，为什么数据库不能通过不断的添加服务器节点来实现扩展呢？      在上面提到的“三高”需求面前，关系数据库遇到了难以克服的障碍，而对于web2.0网站来说，关系数据库的很多主要特性却往往无用武之地，例如：      1、数据库事务一致性需求      很多web实时系统并不要求严格的数据库事务，对读一致性的要求很低，有些场合对写一致性要求也不高。因此数据库事务管理成了数据库高负载下一个沉重的负担。      2、数据库的写实时性和读实时性需求      对关系数据库来说，插入一条数据之后立刻查询，是肯定可以读出来这条数据的，但是对于很多web应用来说，并不要求这么高的实时性，比方说我（JavaEye的robbin）发一条消息之后，过几秒乃至十几秒之后，我的订阅者才看到这条动态是完全可以接受的。      3、对复杂的SQL查询，特别是多表关联查询的需求      任何大数据量的web系统，都非常忌讳多个大表的关联查询，以及复杂的数据分析类型的复杂SQL报表查询，特别是SNS类型的网站，从需求以及产品设计角度，就避免了这种情况的产生。往往更多的只是单表的主键查询，以及单表的简单条件分页查询，SQL的功能被极大的弱化了。      因此，关系数据库在这些越来越多的应用场景下显得不那么合适了，为了解决这类问题的非关系数据库应运而生，现在这两年，各种各样非关系数据库，特别是键值数据库(Key-Value Store DB)风起云涌，多得让人眼花缭乱。前不久国外刚刚举办了NoSQL Conference，各路NoSQL数据库纷纷亮相，加上未亮相但是名声在外的，起码有超过10个开源的NoSQLDB，例如：Redis，Tokyo Cabinet，Cassandra，Voldemort，MongoDB，Dynomite，HBase，CouchDB，Hypertable， Riak，Tin， Flare， Lightcloud， KiokuDB，Scalaris， Kai， ThruDB，  &#8230;&#8230;     这些NoSQL数据库，有的是用C/C++编写的，有的是用Java编写的，还有的是用Erlang编写的，每个都有自己的独到之处，看都看不过来了，我(robbin)也只能从中挑选一些比较有特色，看起来更有前景的产品学习和了解一下。这些NoSQL数据库大致可以分为以下的三类：      一、满足极高读写性能需求的Kye-Value数据库：Redis，Tokyo Cabinet， Flare [...]]]></description>
			<content:encoded><![CDATA[<p>随着互联网web2.0网站的兴起，非关系型的数据库现在成了一个极其热门的新领域，非关系数据库产品的发展非常迅速。而传统的关系数据库在应付web2.0网站，特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心，暴露了很多难以克服的问题，例如：</p>
<p><span id="more-3275"></span>  <span style="font-weight: bold;">1、High performance -对数据库高并发读写的需求</span><br />
     web2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息，所以基本上无法使用动态页面静态化技术，因此数据库并发负载非常高，往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住，但是应付上万次SQL写数据请求，硬盘IO就已经无法承受了。其实对于普通的 BBS网站，往往也存在对高并发写请求的需求，例如像JavaEye网站的实时统计在线用户状态，记录热门帖子的点击次数，投票计数等，因此这是一个相当普遍的需求。</p>
<p>     <span style="font-weight: bold;">2、Huge Storage -对海量数据的高效率存储和访问的需求</span><br />
     类似Facebook，twitter，Friendfeed这样的SNS网站，每天用户产生海量的用户动态，以Friendfeed为例，一个月就达到了2.5亿条用户动态，对于关系数据库来说，在一张2.5亿条记录的表里面进行SQL查询，效率是极其低下乃至不可忍受的。再例如大型web网站的用户登录系统，例如腾讯，盛大，动辄数以亿计的帐号，关系数据库也很难应付。</p>
<p>     <span style="font-weight: bold;">3、High Scalability&amp;&amp; High Availability-对数据库的高可扩展性和高可用性的需求</span><br />
     在基于web的架构当中，数据库是最难进行横向扩展的，当一个应用系统的用户量和访问量与日俱增的时候，你的数据库却没有办法像web server和app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说，对数据库系统进行升级和扩展是非常痛苦的事情，往往需要停机维护和数据迁移，为什么数据库不能通过不断的添加服务器节点来实现扩展呢？</p>
<p>     在上面提到的“三高”需求面前，关系数据库遇到了难以克服的障碍，而对于web2.0网站来说，关系数据库的很多主要特性却往往无用武之地，例如：</p>
<p>     <span style="font-size: medium;">1、数据库事务一致性需求</span><br />
     很多web实时系统并不要求严格的数据库事务，对读一致性的要求很低，有些场合对写一致性要求也不高。因此数据库事务管理成了数据库高负载下一个沉重的负担。</p>
<p>     <span style="font-size: medium;">2、数据库的写实时性和读实时性需求</span><br />
     对关系数据库来说，插入一条数据之后立刻查询，是肯定可以读出来这条数据的，但是对于很多web应用来说，并不要求这么高的实时性，比方说我（JavaEye的robbin）发一条消息之后，过几秒乃至十几秒之后，我的订阅者才看到这条动态是完全可以接受的。</p>
<p>     <span style="font-size: medium;">3、对复杂的SQL查询，特别是多表关联查询的需求</span><br />
     任何大数据量的web系统，都非常忌讳多个大表的关联查询，以及复杂的数据分析类型的复杂SQL报表查询，特别是SNS类型的网站，从需求以及产品设计角度，就避免了这种情况的产生。往往更多的只是单表的主键查询，以及单表的简单条件分页查询，SQL的功能被极大的弱化了。</p>
<p>     因此，关系数据库在这些越来越多的应用场景下显得不那么合适了，为了解决这类问题的非关系数据库应运而生，现在这两年，各种各样非关系数据库，特别是键值数据库(Key-Value Store DB)风起云涌，多得让人眼花缭乱。前不久国外刚刚举办了<a href="http://journal.uggedal.com/nosql-east-2009---summary-of-day-1" target="_blank">NoSQL Conference</a>，各路NoSQL数据库纷纷亮相，加上未亮相但是名声在外的，起码有超过10个开源的NoSQLDB，例如：Redis，Tokyo Cabinet，Cassandra，Voldemort，MongoDB，Dynomite，HBase，CouchDB，Hypertable， Riak，Tin， Flare， Lightcloud， KiokuDB，Scalaris， Kai， ThruDB， </p>
<div id="sina_keyword_ad_area2">&#8230;&#8230;     这些NoSQL数据库，有的是用C/C++编写的，有的是用Java编写的，还有的是用Erlang编写的，每个都有自己的独到之处，看都看不过来了，<a href="http://robbin.javaeye.com/" target="_blank">我(robbin)</a>也只能从中挑选一些比较有特色，看起来更有前景的产品学习和了解一下。这些NoSQL数据库大致可以分为以下的三类：</div>
<p>     <span style="font-size: medium; font-weight: bold;">一、满足极高读写性能需求的Kye-Value数据库：Redis，Tokyo Cabinet， Flare</span></p>
<p>     高性能Key-Value数据库的主要特点就是具有极高的并发读写性能，Redis，Tokyo Cabinet， Flare，这3个Key-Value DB都是用C编写的，他们的性能都相当出色，但出了出色的性能，他们还有自己独特的功能：</p>
<p>     1、<a href="http://code.google.com/p/redis/" target="_blank">Redis</a><br />
     Redis是一个很新的项目，刚刚发布了1.0版本。Redis本质上是一个Key-Value类型的内存数据库，很像memcached，整个数据库统统加载在内存当中进行操作，定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作，Redis的性能非常出色，每秒可以处理超过10万次读写操作，是我知道的性能最快的Key-Value DB。</p>
<p>     Redis的出色之处不仅仅是性能，Redis最大的魅力是支持保存List链表和Set集合的数据结构，而且还支持对List进行各种操作，例如从List两端push和pop数据，取List区间，排序等等，对Set支持各种集合的并集交集操作，此外单个value的最大限制是1GB，不像 memcached只能保存1MB的数据，因此Redis可以用来实现很多有用的功能，比方说用他的List来做FIFO双向链表，实现一个轻量级的高性能消息队列服务，用他的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间，因此也可以被当作一个功能加强版的memcached来用。</p>
<p>     Redis的主要缺点是数据库容量受到物理内存的限制，不能用作海量数据的高性能读写，并且它没有原生的可扩展机制，不具有scale（可扩展）能力，要依赖客户端来实现分布式读写，因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。目前使用Redis的网站有 github，Engine Yard。</p>
<p>     2、<a href="http://1978th.net/" target="_blank">Tokyo Cabinet和Tokoy Tyrant</a><br />
     TC和TT的开发者是日本人Mikio Hirabayashi，主要被用在日本最大的SNS网站mixi.jp上，TC发展的时间最早，现在已经是一个非常成熟的项目，也是Kye-Value 数据库领域最大的热点，现在被广泛的应用在很多很多网站上。TC是一个高性能的存储引擎，而TT提供了多线程高并发服务器，性能也非常出色，每秒可以处理 4-5万次读写操作。</p>
<p>     TC除了支持Key-Value存储之外，还支持保存Hashtable数据类型，因此很像一个简单的数据库表，并且还支持基于column的条件查询，分页查询和排序功能，基本上相当于支持单表的基础查询功能了，所以可以简单的替代关系数据库的很多操作，这也是TC受到大家欢迎的主要原因之一，有一个Ruby的项目<a href="http://github.com/tsukasaoishi/miyazakiresistance" target="_blank">miyazakiresistance</a>将TT的hashtable的操作封装成和ActiveRecord一样的操作，用起来非常爽。</p>
<p>     TC/TT在mixi的实际应用当中，存储了2000万条以上的数据，同时支撑了上万个并发连接，是一个久经考验的项目。TC在保证了极高的并发读写性能的同时，具有可靠的数据持久化机制，同时还支持类似关系数据库表结构的hashtable以及简单的条件，分页和排序操作，是一个很棒的 NoSQL数据库。</p>
<p>     TC的主要缺点是在数据量达到上亿级别以后，并发写数据性能会大幅度下降，<a href="http://bjclark.me/2009/08/04/nosql-if-only-it-was-that-easy/" target="_blank">NoSQL: If Only It Was That Easy</a>提到，他们发现在TC里面插入1.6亿条2-20KB数据的时候，写入性能开始急剧下降。看来是当数据量上亿条的时候，TC性能开始大幅度下降，从TC作者自己提供的mixi数据来看，至少上千万条数据量的时候还没有遇到这么明显的写入性能瓶颈。</p>
<p>     这个是Tim Yang做的一个<a href="http://timyang.net/data/mcdb-tt-redis/" target="_blank">Memcached，Redis和Tokyo Tyrant的简单的性能评测，仅供参考</a></p>
<p>     3、<a href="http://labs.gree.jp/Top/OpenSource/Flare-en.html" target="_blank">Flare</a><br />
     TC是日本第一大SNS网站mixi开发的，而Flare是日本第二大SNS网站green.jp开发的，有意思吧。Flare简单的说就是给 TC添加了scale功能。他替换掉了TT部分，自己另外给TC写了网络服务器，Flare的主要特点就是支持scale能力，他在网络服务端之前添加了一个node server，来管理后端的多个服务器节点，因此可以动态添加数据库服务节点，删除服务器节点，也支持failover。如果你的使用场景必须要让TC可以scale，那么可以考虑flare。</p>
<p>     flare唯一的缺点就是他只支持memcached协议，因此当你使用flare的时候，就不能使用TC的table数据结构了，只能使用TC的key-value数据结构存储。</p>
<p>     <span style="font-size: medium; font-weight: bold;">二、满足海量存储需求和访问的面向文档的数据库：MongoDB，CouchDB</span></p>
<p>     面向文档的非关系数据库主要解决的问题不是高性能的并发读写，而是保证海量数据存储的同时，具有良好的查询性能。MongoDB是用C++开发的，而CouchDB则是Erlang开发的：</p>
<p>     1、<a href="http://www.mongodb.org/display/DOCS/Home" target="_blank">MongoDB</a><br />
     MongoDB是一个介于关系数据库和非关系数据库之间的产品，是非关系数据库当中功能最丰富，最像关系数据库的。他支持的数据结构非常松散，是类似json的bjson格式，因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大，其语法有点类似于面向对象的查询语言，几乎可以实现类似关系数据库单表查询的绝大部分功能，而且还支持对数据建立索引。</p>
<p>     Mongo主要解决的是海量数据的访问效率问题，根据官方的文档，当数据量达到50GB以上的时候，Mongo的数据库访问速度是MySQL的 10倍以上。Mongo的并发读写效率不是特别出色，根据官方提供的性能测试表明，大约每秒可以处理0.5万－1.5次读写请求。对于Mongo的并发读写性能，我（robbin）也打算有空的时候好好测试一下。</p>
<p>     因为Mongo主要是支持海量数据存储的，所以Mongo还自带了一个出色的分布式文件系统GridFS，可以支持海量的数据存储，但我也看到有些评论认为GridFS性能不佳，这一点还是有待亲自做点测试来验证了。</p>
<p>     最后由于Mongo可以支持复杂的数据结构，而且带有强大的数据查询功能，因此非常受到欢迎，很多项目都考虑用MongoDB来替代MySQL来实现不是特别复杂的Web应用，比方说<a href="http://blog.boxedice.com/2009/07/25/choosing-a-non-relational-database-why-we-migrated-from-mysql-to-mongodb/" target="_blank">whywe migrated from MySQL to MongoDB</a>就是一个真实的从MySQL迁移到MongoDB的案例，由于数据量实在太大，所以迁移到了Mongo上面，数据查询的速度得到了非常显著的提升。</p>
<p>     MongoDB也有一个ruby的项目<a href="http://github.com/jnunemaker/mongomapper" target="_blank">MongoMapper</a>，是模仿Merb的DataMapper编写的MongoDB的接口，使用起来非常简单，几乎和DataMapper一模一样，功能非常强大易用。</p>
<p>     2、CouchDB<br />
     CouchDB现在是一个非常有名气的项目，似乎不用多介绍了。但是我却对CouchDB没有什么兴趣，主要是因为CouchDB仅仅提供了基于 HTTP REST的接口，因此CouchDB单纯从并发读写性能来说，是非常糟糕的，这让我立刻抛弃了对CouchDB的兴趣。</p>
<p>     <span style="font-size: medium; font-weight: bold;">三、满足高可扩展性和可用性的面向分布式计算的数据库：</span></p>
<p>     面向scale能力的数据库其实主要解决的问题领域和上述两类数据库还不太一样，它首先必须是一个分布式的数据库系统，由分布在不同节点上面的数据库共同构成一个数据库服务系统，并且根据这种分布式架构来提供online的，具有弹性的可扩展能力，例如可以不停机的添加更多数据节点，删除数据节点等等。因此像Cassandra常常被看成是一个开源版本的Google BigTable的替代品。Cassandra和Voldemort都是用Java开发的：</p>
<p>     1、<a href="http://incubator.apache.org/cassandra/" target="_blank">Cassandra</a><br />
     Cassandra项目是Facebook在2008年开源出来的，随后Facebook自己使用Cassandra的另外一个不开源的分支，而开源出来的Cassandra主要被Amazon的Dynamite团队来维护，并且Cassandra被认为是Dynamite2.0版本。目前除了 Facebook之外，twitter和digg.com都在使用Cassandra。</p>
<p>     Cassandra的主要特点就是它不是一个数据库，而是由一堆数据库节点共同构成的一个分布式网络服务，对Cassandra的一个写操作，会被复制到其他节点上去，对Cassandra的读操作，也会被路由到某个节点上面去读取。对于一个Cassandra群集来说，扩展性能是比较简单的事情，只管在群集里面添加节点就可以了。我看到有文章说Facebook的Cassandra群集有超过100台服务器构成的数据库群集。</p>
<p>     Cassandra也支持比较丰富的数据结构和功能强大的查询语言，和MongoDB比较类似，查询功能比MongoDB稍弱一些，twitter的平台架构部门领导Evan Weaver写了一篇文章介绍Cassandra：<a href="http://blog.evanweaver.com/articles/2009/07/06/up-and-running-with-cassandra/" target="_blank">http://blog.evanweaver.com/articles/2009/07/06/up-and-running-with-cassandra/</a>，有非常详细的介绍。</p>
<p>     Cassandra以单个节点来衡量，其节点的并发读写性能不是特别好，有文章说评测下来Cassandra每秒大约不到1万次读写请求，我也看到一些对这个问题进行质疑的评论，但是评价Cassandra单个节点的性能是没有意义的，真实的分布式数据库访问系统必然是n多个节点构成的系统，其并发性能取决于整个系统的节点数量，路由效率，而不仅仅是单节点的并发负载能力。</p>
<p>     2、<a href="http://project-voldemort.com/" target="_blank">Voldemort</a><br />
     Voldemort是个和Cassandra类似的面向解决scale问题的分布式数据库系统，Cassandra来自于Facebook这个 SNS网站，而Voldemort则来自于Linkedin这个SNS网站。说起来SNS网站为我们贡献了n多的NoSQL数据库，例如 Cassandar，Voldemort，Tokyo Cabinet，Flare等等。Voldemort的资料不是很多，因此我没有特别仔细去钻研，Voldemort官方给出Voldemort的并发读写性能也很不错，每秒超过了1.5万次读写。</p>
<p>     从Facebook开发Cassandra，Linkedin开发Voldemort，我们也可以大致看出国外大型SNS网站对于分布式数据库，特别是对数据库的scale能力方面的需求是多么殷切。前面我（robbin）提到，web应用的架构当中，web层和app层相对来说都很容易横向扩展，唯有数据库是单点的，极难scale，现在Facebook和Linkedin在非关系型数据库的分布式方面探索了一条很好的方向，这也是为什么现在 Cassandra这么热门的主要原因。</p>
<p>     如今，NoSQL数据库是个令人很兴奋的领域，总是不断有新的技术新的产品冒出来，改变我们已经形成的固有的技术观念，我自己（robbin）稍微了解了一些，就感觉自己深深的沉迷进去了，可以说NoSQL数据库领域也是博大精深的，我（robbin）也只能浅尝辄止，我（robbin）写这篇文章既是自己一点点钻研心得，也是抛砖引玉，希望吸引对这个领域有经验的朋友来讨论和交流。</p>
<p>     从我（robbin）个人的兴趣来说，分布式数据库系统不是我能实际用到的技术，因此不打算花时间深入，而其他两个数据领域（高性能 NoSQLDB和海量存储NoSQLDB）都是我很感兴趣的，特别是Redis，TT/TC和MongoDB这3个NoSQL数据库，因此我接下来将写三篇文章分别详细介绍这3个数据库。作者: <a href="http://robbin.javaeye.com/" target="_blank">robbin</a>  来源: <a href="http://robbin.javaeye.com/blog/524977" target="_blank">javaeye</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.helloyi.cn/index.php/2010/07/23/nosql-exploration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>windows下面安装mongodb数据库</title>
		<link>http://www.helloyi.cn/index.php/2010/04/13/windows-install-mongodb/</link>
		<comments>http://www.helloyi.cn/index.php/2010/04/13/windows-install-mongodb/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 07:21:46 +0000</pubDate>
		<dc:creator>好易阁</dc:creator>
				<category><![CDATA[数据库应用]]></category>

		<guid isPermaLink="false">http://www.helloyi.cn/?p=3212</guid>
		<description><![CDATA[首先到官方下载 win 版http://www.mongodb.org/display/DOCS/Downloads目前出到1.4.0版本了. 1,下载后解压到 你要存放的目录中以我的电脑 D:/web/mongodb为例. 2,然后建立一个存放mongodb数据的目录D:/data/mongodb.不建的话可以默认，因为默认目录为c:\data\db 3,启动mongodb服务mongod &#8211;&#62;进入CMD模式-&#62; D:web/mongodb&#62;bin\mongod.exe &#8211;dbpath=d:/mongodb. &#8211;dbpath 指定数据库的目录，默认是 /data/db，win 没有 /data/db 目录，所以直接双击 mongod 是启动不了。默认端口是 27017.如下图安装成功. 4，mongodb数据可以很好的和PHP结合使用通过安装一个PHP扩展即可,下载PHP-mongodb扩展http://cn.php.net/manual/en/mongo.installation.php#mongo.installation.nix. 5,解压后将php_mongo.dll存放到php\ext\文件夹下. 6,在php.ini配文件中加入extension=php_mongo.dll后开启mongodb,浏览一下phpinfo.php看到如下图即可 7,通过上面的安装我们就可以使用PHP来操作mongodb数据库了:附上网上一个测试例子 1 2 3 4 5 6 7 8 9 10 11 12 &#60; ?php $start_time = time&#40;&#41;; $m = new Mongo&#40;&#34;127.0.0.1:27017&#34;&#41;; //默认端口27017 $collection = $--&#38;gt;test; $c = $collection-&#38;amp;gt;user; $num = 100000; [...]]]></description>
			<content:encoded><![CDATA[<p>首先到官方下载 win 版http://www.mongodb.org/display/DOCS/Downloads目前出到1.4.0版本了.</p>
<p>1,下载后解压到 你要存放的目录中以我的电脑 D:/web/mongodb为例.</p>
<p>2,然后建立一个存放mongodb数据的目录D:/data/mongodb.不建的话可以默认，因为默认目录为c:\data\db</p>
<p><span id="more-3212"></span>3,启动mongodb服务mongod &#8211;&gt;进入CMD模式-&gt; D:web/mongodb&gt;bin\mongod.exe &#8211;dbpath=d:/mongodb.</p>
<p>&#8211;dbpath 指定数据库的目录，默认是 /data/db，win 没有 /data/db 目录，所以直接双击 mongod 是启动不了。默认端口是 27017.如下图安装成功.<img class="alignnone size-full wp-image-3214" title="mongodb" src="http://www.helloyi.cn/wp-content/uploads/2010/04/mongodb1.jpg" alt="mongodb" width="611" height="167" /></p>
<p>4，mongodb数据可以很好的和PHP结合使用通过安装一个PHP扩展即可,下载PHP-mongodb扩展http://cn.php.net/manual/en/mongo.installation.php#mongo.installation.nix.</p>
<p>5,解压后将php_mongo.dll存放到php\ext\文件夹下.</p>
<p>6,在php.ini配文件中加入extension=php_mongo.dll后开启mongodb,浏览一下phpinfo.php看到如下图即可</p>
<p><img class="alignnone size-full wp-image-3215" title="monogphp" src="http://www.helloyi.cn/wp-content/uploads/2010/04/monogphp.jpg" alt="monogphp" width="612" height="262" /></p>
<p>7,通过上面的安装我们就可以使用PHP来操作mongodb数据库了:附上网上一个测试例子</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ?php
<span style="color: #000088;">$start_time</span> <span style="color: #339933;">=</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000088;">$m</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Mongo<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;127.0.0.1:27017&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;">//默认端口27017 $collection = $--&amp;gt;test;</span>
<span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$collection</span><span style="color: #339933;">-&amp;</span>amp<span style="color: #339933;">;</span>gt<span style="color: #339933;">;</span>user<span style="color: #339933;">;</span>
<span style="color: #000088;">$num</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">100000</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span><span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>lt<span style="color: #339933;">;=</span><span style="color: #000088;">$num</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'uid'</span><span style="color: #339933;">=&amp;</span>amp<span style="color: #339933;">;</span>gt<span style="color: #339933;">;</span><span style="color: #000088;">$i</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'username'</span><span style="color: #339933;">=&amp;</span>amp<span style="color: #339933;">;</span>gt<span style="color: #339933;">;</span><span style="color: #0000ff;">'Falcon.C-'</span><span style="color: #339933;">.</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$c</span><span style="color: #339933;">-&amp;</span>amp<span style="color: #339933;">;</span>gt<span style="color: #339933;">;</span>insert<span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000088;">$m</span><span style="color: #339933;">-&amp;</span>amp<span style="color: #339933;">;</span>gt<span style="color: #339933;">;</span>close<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$end_time</span> <span style="color: #339933;">=</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;花费时间是：&quot;</span><span style="color: #339933;">.</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$end_time</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$start_time</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'秒'</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>mongodb插入10w条数据执行时间为2S到3S之间.</p>
<p>现推荐两个mongoDB管理平台给大家。<br />
1、<a href="http://www.icmfinland.fi/oss/opricot/" target="_blank">Opricot</a><br />
2、<a href="http://www.phpmoadmin.com/" target="_blank">phpMoAdmin</a><br />
两个工具都是采用php编写</p>
]]></content:encoded>
			<wfw:commentRss>http://www.helloyi.cn/index.php/2010/04/13/windows-install-mongodb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysqlreport详解</title>
		<link>http://www.helloyi.cn/index.php/2010/04/02/mysqlreport/</link>
		<comments>http://www.helloyi.cn/index.php/2010/04/02/mysqlreport/#comments</comments>
		<pubDate>Fri, 02 Apr 2010 09:24:44 +0000</pubDate>
		<dc:creator>好易阁</dc:creator>
				<category><![CDATA[数据库应用]]></category>

		<guid isPermaLink="false">http://www.helloyi.cn/?p=3205</guid>
		<description><![CDATA[mysqlreport 以很友好的方式显示 MySQL状态变。事实上，它几乎报告了所有的状态。不像 SHOW STATUS 只是在显示了100多个状态值，mysqlreport 则以人性化的方式阐释和格式化了这些状态值，大大增加了其可读性。可以 点击这里 查看mysqlreport的例子。 mysqlreport 的好处是可以快速的查看各种状态参数组，从而了解服务器的运行状态情况，而无需从 SHOW STATUS 的结果中人工计算。例如索引读取比率是个重要的参数，但是 SHOW STATUS 中并没有显示；它是一个推断值(key_reads 和 key_read_requests 的比值)。本文档描述了 mysqlreport 的所有命令行选项，大部分是用于控制如何显示结果的。本文并没有解释这些推断值是怎么计算得到的，可以点击 理解mysqlreport 查看具体的计算方法。 注意 命令行选项的格式是 &#8211;选项，不过 -选项 的格式也可以。所有的选项都有其缩写，只要是唯一的。例如，选项 &#8211;host 可以缩写成 &#8211;ho，不过不能写成 &#8211;h，因为 &#8211;h 有歧义，可能是 &#8211;host 或者 &#8211;help。 选项列表 &#8211;user USER &#8211;password &#8211;host ADDRESS &#8211;port PORT &#8211;socket SOCKET &#8211;no-mycnf &#8211;help 这些选项是模拟其他标准应用程序的。从 2.3 版本开始，&#8211;password 可以在后面加上参数，如 &#8220;&#8211;password [...]]]></description>
			<content:encoded><![CDATA[<div>mysqlreport 以很友好的方式显示 <a href="http://dev.mysql.com/doc/refman/5.0/en/server-status-variables.html" target="_blank">MySQL状态变</a>。事实上，它几乎报告了所有的状态。不像 SHOW STATUS 只是在显示了100多个状态值，mysqlreport 则以人性化的方式阐释和格式化了这些状态值，大大增加了其可读性。可以 <a href="http://hackmysql.com/mysqlreport" target="_blank">点击这里</a> 查看mysqlreport的例子。 mysqlreport 的好处是可以快速的查看各种状态参数组，从而了解服务器的运行状态情况，而无需从 SHOW STATUS 的结果中人工计算。例如索引读取比率是个重要的参数，但是 SHOW STATUS 中并没有显示；它是一个推断值(key_reads 和 key_read_requests 的比值)。<span id="more-3205"></span>本文档描述了 mysqlreport 的所有命令行选项，大部分是用于控制如何显示结果的。本文并没有解释这些推断值是怎么计算得到的，可以点击 <a href="http://hackmysql.com/mysqlreportguide" target="_blank">理解mysqlreport</a> 查看具体的计算方法。</div>
<h2>注意</h2>
<div>命令行选项的格式是 &#8211;选项，不过 -选项 的格式也可以。所有的选项都有其缩写，只要是唯一的。例如，选项 &#8211;host 可以缩写成 &#8211;ho，不过不能写成 &#8211;h，因为 &#8211;h 有歧义，可能是 &#8211;host 或者 &#8211;help。</div>
<h2>选项列表</h2>
<table border="0" cellspacing="0">
<tbody>
<tr>
<td>&#8211;user USER<br />
&#8211;password<br />
&#8211;host ADDRESS<br />
&#8211;port PORT<br />
&#8211;socket SOCKET<br />
&#8211;no-mycnf<br />
&#8211;help</td>
<td>这些选项是模拟其他标准应用程序的。从 2.3 版本开始，&#8211;password 可以在后面加上参数，如 &#8220;&#8211;password FOO&#8221;。如果命令行中只指定了选项 &#8211;password，则会提示输入密码。&#8211;no-mycnf 告诉 mysqlreport 不要读取 ~/.my.cnf，默认会去读取这个文件。&#8211;user 和 &#8211;password 总是覆盖从 ~/.my.cnf 中取得的结果。</td>
</tr>
<tr>
<td>&#8211;infile FILE</td>
<td>直接从文件中读取状态文件，而不是从MySQL的 SHOW STATUS 中读取。文件内容通常是从 SHOW STATUS 的结果中取得，并且包含格式化字符(|, +, -)。mysqlreport 认为这样的文件&#8221;状态名 数值&#8221;格式的，状态包含字符和下划线(A-Z 和 _)，数值则是非负整数。在状态名和数值之间的任何内容都会被忽略。mysqlreport 也需要以下<a href="http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html" target="_blank">MySQL服务器系统变量</a>：version, table_cache, max_connections, key_buffer_size, query_cache_size, thread_cache_size。INFILE 的格式也可以是 &#8220;名字 = 数值&#8221;这样的，名字可以使是上面提到的各种变量名，数值是非负整数，可能后面带有M或者其他单位(根据版本不同而定)。例如，想要指定 18M 的 key_buffer_size：key_buffer_size = 18M。或者，256 个 table_cache：table_cache = 256。M 指兆字节，而非百万。因此 18M 是 18,874,368，而非 18,000,000。如果这些服务器变量没有指定，则使用默认以下默认值：0.0.0, 64, 100, 8M, 0, 0，就可能会让报告结果看起来很奇怪。<strong>注意：</strong>MySQL 服务器版本在 5.1.3 或更新时，尽管系统变量 table_cache 改成了 table_open_cache，但是读取本地文件时仍采用 table_cache。</td>
</tr>
<tr>
<td>&#8211;outfile FILE</td>
<td>在屏幕显示完报告结果后，将结果写入文件中。mysqlreport 的内部机制总是先将结果写入临时文件中。然后将该临时文件里的内容打印到屏幕上。然后，如果指定了 &#8211;outfile 选项，则将临时文件拷贝成 OUTFILE。如果指定选项 &#8211;email，则会删除临时文件。</td>
</tr>
<tr>
<td>&#8211;email ADDRESS</td>
<td>在屏幕显示完结果后，将结果发送到邮件地址 ADDRESS 中去。欲该选项，需要在 /usr/sbin/ 目录下有 sendmail 程序，因此无法在 windows 平台下使用。/usr/sbin/sendmail 可以符号链接到 qmail，或者任何其他能模拟 sendmail -t 方式的 MTA 程序。邮件来源是：mysqlreport，主题是：MySQL status report on HOST，HOST 是 mysqlreport<br />
所在的主机名，可能是读取到的 &#8211;host 值，默认是 localhost。</td>
</tr>
<tr>
<td>&#8211;flush-status</td>
<td>显示完报告后，执行 &#8220;FLUSH STATUS;&#8221; 语句。如果没有权限，则 DBD::mysql 会显示返回值。</td>
</tr>
<tr>
<td>&#8211;relative (-r) X</td>
<td>mysqlreport 通常情况下报告的是自从 MySQL 服务器启动以来的状态信息。&#8211;relative 选项则是令 mysqlreport 产生一份自从上次报告以来的相关报告。如果 &#8211;relative X 的 X 值是一个整数，则 mysqlreport 会在隔 X 秒后再次产生一份 MySQL 服务器的状态报告。产生报告的次数是由 &#8211;report-count 选项来控制的。默认是产生 1 份相关的报告。例如，指定 &#8211;relative 的值为 60，则会产生 2 份报告：第一份会马上生成，第二份会在 60 秒后再次生成。第二份报告中的数值会和前面的那份相关。例如，前面那份中总共有 10.00k 次查询，在这 60 秒的间隔时间里接受了新的 1.00k 次查询，则第二份的报告中的总查询次数是 1.00k 而非 11.00k 次。</p>
<p>如果 &#8211;relative 选项的值也可以是本地文件(类似 &#8211;infile 选项的用法)，那么 mysqlreport 会按照参数值中文件的顺序来依次产生状态报告。因此，根据这些文件产生的时间来指定选项的值非常重要：较早产生的文件放在参数的前面。第一个文件中必须有手工添加的系统变量，例如：key_buffer_size、table_cache 等。每个文件中可以有多组 &#8220;SHOW STATUS&#8221; 的结果。注意：通过 &#8220;mysqladmin -r -i N extended&#8221; 产生的状态文件无法使用，因为 mysqladmin 的 -r 参数已经令其产生了具有相对性的状态值了。</p>
<p>由于 mysqlreport 首先会把状态报告写到临时文件中，如果 &#8211;relative 的值是 整数(而非 本地文件)时，mysqlreport 会显示它把文件写到哪了。那么就可以直接通过查看这些文件内容来观察服务器的状况了。</td>
</tr>
<tr>
<td>&#8211;report-count (-c) N</td>
<td>生成 N 份相关的报告。本选项只有在同时启用 &#8211;relative 选项后才有效。mysqlreport 会自动产生 N+1 份报告：第一份基本报告，以及后面的 N 份相关报告。</td>
</tr>
<tr>
<td>&#8211;detach</td>
<td>若指定本选项，则 mysqlreport 会派生出进程来，不只是在屏幕显示结果，还会转入后台继续运行。派生新进程后，mysqlreport 会报告它把结果写入哪个临时文件了。本选项还可以指定 &#8211;outfile 或 &#8211;email 的一个。如果没有指定 &#8211;outfile 或 &#8211;email 的值，则产生的临时文件会被删除，因为 mysqlreport 派生出新进程后，无法再将结果打印到终端屏幕上了。本选项如果和 &#8211;relative 一起使用的话就更有意义了，这样 mysqlreport 就能定时报告信息，而无需人工登录等方式在中断执行了。使用如下的命令，就能让 mysqlrepot 隔一个小时再次产生一次报告，并将结果发送到自己的信箱中去：<br />
mysqlreport -r 3600 -detach -email host@domain.com一个小时候后，mysqlreport 通过email发送报告，删除临时文件，并且干净地终止。</td>
</tr>
<tr>
<td>&#8211;debug</td>
<td>显示调试信息。</td>
</tr>
<tr>
<td>&#8211;dtq</td>
<td>(Questions 报告的 Total 部分中)显示所有的查询分布报告。这些查询主要包括以下四部分：DMS (见下面)、COM_ (见下面)、COM_QUIT(见 <a href="http://hackmysql.com/com_quit" target="_blank">COM_QUIT and Questions</a>)、以及其他未知。每部分根据其总数倒序显示。</td>
</tr>
<tr>
<td>&#8211;dms</td>
<td>(Questions 报告的 DMS 部分中)显示所有的数据维护语句(DMS)报告。DMS是下面文档 <a href="http://dev.mysql.com/doc/refman/5.0/en/data-manipulation.html" target="_blank">13.2. Data Manipulation Statements</a> 中提到的那些(当前主要有：SELECT, INSERT, REPLACE, UPDATE, and DELETE)。每个 DMS 根据其总数倒序显示。</td>
</tr>
<tr>
<td>&#8211;com N</td>
<td>(Questions 报告之后)以降序显示最多 N 个 非DMS Com_ 状态值。如果没有指定 N 的值，则默认是 3。所谓的非DMS Com_ 状态值，包括：Com_change_db、Com_show_tables、Com_rollback 等。</td>
</tr>
<tr>
<td>&#8211;sas</td>
<td>(Questions 报告之后)，显示所有的 Select_ 和 Sort_ 报告。详情请看 <a href="http://hackmysql.com/selectandsort" target="_blank">MySQL Select and Sort Status Variables</a>。</td>
</tr>
<tr>
<td>&#8211;qcache</td>
<td>如果打开查询缓存的话，则显示查询缓存状态报告。</td>
</tr>
<tr>
<td>&#8211;tab</td>
<td>(Create Temp 报告之后)显示 线程、放弃的、流量 等状态报告。从 mysqlreport v2.3 开始，线程状态是从 Threads_ 状态值读取。</td>
</tr>
<tr>
<td>&#8211;innodb</td>
<td>显示 <a href="http://dev.mysql.com/doc/refman/5.0/en/innodb.html" target="_blank">InnoDB</a> 状态报告，包括MySQL 5.0.2以后才支持的InnoDB 缓冲池，以及5.0.3以后才支持的InnoDB锁状态报告。</td>
</tr>
<tr>
<td>&#8211;innodb-only</td>
<td><em>只显示</em> InnoDB 报告；不显示其他报告。</td>
</tr>
<tr>
<td>&#8211;dpr</td>
<td>显示 InnoDB 数据，页，行报告。</td>
</tr>
<tr>
<td style="border-bottom: medium none;">&#8211;all</td>
<td style="border-bottom: medium none;">如果可能，则显示所有的状态报告。一些报告，比如查询缓存、InnoDB等需要特定版本的MySQL或者其他特性才能支持。例如，尽管服务器支持查询缓存，但是它被禁用了，则不管是否指定了 &#8211;qcache 或者 &#8211;all，都不会显示查询缓存的报告。</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.helloyi.cn/index.php/2010/04/02/mysqlreport/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql explain的使用详解</title>
		<link>http://www.helloyi.cn/index.php/2010/03/02/mysql-explain/</link>
		<comments>http://www.helloyi.cn/index.php/2010/03/02/mysql-explain/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 03:27:17 +0000</pubDate>
		<dc:creator>好易阁</dc:creator>
				<category><![CDATA[数据库应用]]></category>

		<guid isPermaLink="false">http://www.helloyi.cn/?p=3137</guid>
		<description><![CDATA[mysql explain的详解 ： explain显示了mysql如何使用索引来处理select语句以及连接表。 可以帮助选择更好的索引和写出更优化的查询语句。 使用方法，在select语句前加上explain就可以了： 如：explain select surname,first_name form a,b where a.id=b.id 分析结果形式如下： table    type   possible_keys   key                       key_len       ref   rows   extra a         range  id                  first_name  First_name 9           NULL 23112 Using where　Using temporary　Using filesort b        ref       id　              first_name                                 id    4    id    2     Using   where EXPLAIN列的解释： table：显示这一行的数据是关于哪张表的 type：这是重要的列，显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和 ALL possible_keys：显示可能应用在这张表中的索引。如果为空，没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句 key：实际使用的索引。如果为NULL，则没有使用索引。很少的情况下，MYSQL会 选择优化不足的索引。这种情况下，可以在SELECT语句中使用 USE INDEX（indexname）来强制使用一个索引或者用IGNORE INDEX（indexname）来强制MYSQL忽略索引 key_len：使用的索引的长度。在不损失精确性的情况下，长度越短越好 [...]]]></description>
			<content:encoded><![CDATA[<p><strong>mysql explain的详解 </strong>：<br />
explain显示了mysql如何使用索引来处理select语句以及连接表。 可以帮助选择更好的索引和写出更优化的查询语句。<br />
使用方法，在select语句前加上explain就可以了：<br />
如：explain select surname,first_name form a,b where a.id=b.id</p>
<p>分析结果形式如下：<br />
<span id="more-3137"></span><br />
<span style="color: #0000ff;">table    type   possible_keys   key                        key_len       ref   rows   extra<br />
a         range  id                  first_name  First_name  9           NULL 23112 Using where　Using temporary　Using filesort<br />
b        ref       id　               first_name                                 id    4    id    2      Using   where </span></p>
<p>EXPLAIN列的解释：</p>
<p>table：显示这一行的数据是关于哪张表的<br />
type：这是重要的列，显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和 ALL<br />
possible_keys：显示可能应用在这张表中的索引。如果为空，没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句<br />
key：实际使用的索引。如果为NULL，则没有使用索引。很少的情况下，MYSQL会 选择优化不足的索引。这种情况下，可以在SELECT语句中使用 USE INDEX（indexname）来强制使用一个索引或者用IGNORE  INDEX（indexname）来强制MYSQL忽略索引<br />
key_len：使用的索引的长度。在不损失精确性的情况下，长度越短越好<br />
ref：显示索引的哪一列被使用了，如果可能的话，是一个常数<br />
rows：MYSQL认为必须检查的用来返回请求数据的行数<br />
Extra：关于MYSQL如何解析查询的额外信息。将在表4.3中讨论，但这里可 以看到的坏的例子是Using temporary和Using filesort，意思MYSQL根 本不能使用索引，结果是检索会很慢<br />
extra列返回的描述的意义<br />
Distinct:一旦MYSQL找到了与行相联合匹配的行，就不再搜索了<br />
Not exists: MYSQL优化了LEFT  JOIN，一旦它找到了匹配LEFT JOIN标准的行，就不再搜索了<br />
Range checked for each Record（index  map:#）:没有找到理想的索引，因此对于从前面表中来的每一个行组合，MYSQL检查使 用哪个索引，并用它来从表中返回行。这是使用索引的最慢的连接之一<br />
Using filesort: 看到这个的时候，查询就需要优化了。MYSQL需 要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行<br />
Using index:  列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的，这发生在对表的全部的请求列都是同一个索引的部分的时候<br />
Using temporary 看到这个的时候，查询需要优化了。这里，MYSQL需 要创建一个临时表来存储结果，这通常发生在对不同的列集进行ORDER BY上，而不是GROUP BY上<br />
Where used  使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行，并且连接类型ALL或index，这就会发生，或者是查 询有问题不同连接类型的解释（按照效率高低的顺序排序）<br />
system 表只有一行：system表。这是const连接类型的特殊情况<br />
const:表中的一个记录的最大值能够匹配这个查询（索引可以是主键或惟一索引）。因为只有一行，这个值实际就是常数，因为MYSQL先读这个值然后把它当做常数来对待<br />
eq_ref:在连接中，MYSQL在查询时，从前面的表中，对每一个记录的联合都 从表中读取一个记录，它在查询使用了索引为主键或惟一键的全部时使用<br />
ref:这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分（比如，利用最左边前缀）时发生。对于之前的表的每一个行联合，全 部记录都将从表中读出。这个类型严重依赖于根据索引匹配的记录多少—越少越好<br />
range:这个连接类型使用索引返回一个范围中的行，比如使用&gt;或&lt;查找东西时发生的情况<br />
index: 这个连接类型对前面的表中的每一个记录联合进行完全扫描（比ALL更好，因为索引一般小于表数据）<br />
ALL:这个连接类型对于前面的每一个记录联合进行完全扫描，这一般比较糟糕，应该尽量避免</p>
]]></content:encoded>
			<wfw:commentRss>http://www.helloyi.cn/index.php/2010/03/02/mysql-explain/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>精妙MYSQL语句,基础,提升,技巧</title>
		<link>http://www.helloyi.cn/index.php/2010/02/28/mysql/</link>
		<comments>http://www.helloyi.cn/index.php/2010/02/28/mysql/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 14:43:30 +0000</pubDate>
		<dc:creator>好易阁</dc:creator>
				<category><![CDATA[数据库应用]]></category>

		<guid isPermaLink="false">http://www.helloyi.cn/?p=3097</guid>
		<description><![CDATA[一、基础 1、说明：创建数据库 Create DATABASE database-name 2、说明：删除数据库 drop database dbname 3、说明：备份sql server — 创建 备份数据的 device USE master EXEC sp_addumpdevice ‘disk’, ‘testBack’, ‘c:\mssql7backup\MyNwind_1.dat’ — 开始 备份 BACKUP DATABASE pubs TO testBack 4、说明：创建新表 create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) 根据已有的表创建新表： A：create table tab_new like tab_old (使用旧表创建新表) B：create table tab_new as select col1,col2… [...]]]></description>
			<content:encoded><![CDATA[<div id="read_tpc">一、<span id="rlt_3" style="border-bottom: #fa891b 1px solid; cursor: pointer;" onclick="sendmsg('pw_ajax.php','action=relatetag&amp;tagname=基础',this.id)">基础</span><br />
1、说明：创建数据库<br />
Create DATABASE database-name<br />
2、说明：删除数据库<br />
drop database dbname<br />
3、说明：备份sql server<br />
— 创建 备份数据的 device</div>
<p>USE master<br />
EXEC sp_addumpdevice ‘disk’, ‘testBack’, ‘c:\mssql7backup\MyNwind_1.dat’<br />
— 开始 备份<br />
BACKUP DATABASE pubs TO testBack<br />
4、说明：创建新表<br />
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)<br />
根据已有的表创建新表：<br />
A：create table tab_new like tab_old (使用旧表创建新表)<br />
B：create table tab_new as select col1,col2… from tab_old definition only<br />
5、说明：删除新表<br />
drop table tabname<br />
6、说明：增加一个列<br />
Alter table tabname add column col type<br />
注：列增加后将不能删除。DB2中列加上后<span id="rlt_6" style="border-bottom: #fa891b 1px solid; cursor: pointer;" onclick="sendmsg('pw_ajax.php','action=relatetag&amp;tagname=数据类型',this.id)">数据<span id="rlt_9" style="border-bottom: #fa891b 1px solid; cursor: pointer;" onclick="sendmsg('pw_ajax.php','action=relatetag&amp;tagname=类型',this.id)">类型</span></span>也不能改变，唯一能改变的是增加varchar类型的长度。<br />
7、说明：添加主键： Alter table tabname add primary key(col)<br />
说明：删除主键： Alter table tabname drop primary key(col)<br />
8、说明：创建索引：create [unique] index idxname on tabname(col….)<br />
删除索引：drop index idxname<br />
注：索引是不可更改的，想更改必须删除重新建。<br />
9、说明：创建视图：create view viewname as select statement<br />
删除视图：drop view viewname<br />
10、说明：几个简单的基本的sql语句<br />
选择：select * from table1 where 范围<br />
插入：insert into table1(field1,field2) values(value1,value2)<br />
删除：delete from table1 where 范围<br />
更新：update table1 set field1=value1 where 范围<br />
查找：select * from table1 where field1 like ’%value1%’ —like的语法很精妙，查资料!<br />
排序：select * from table1 order by field1,field2 [desc]<br />
总数：select count as totalcount from table1<br />
求和：select sum(field1) as sumvalue from table1<br />
平均：select avg(field1) as avgvalue from table1<br />
最大：select max(field1) as maxvalue from table1<br />
最小：select min(field1) as minvalue from table1<br />
11、说明：几个<span id="rlt_7" style="border-bottom: #fa891b 1px solid; cursor: pointer;" onclick="sendmsg('pw_ajax.php','action=relatetag&amp;tagname=高级',this.id)">高级</span>查询运算词<br />
A： UNION <span id="rlt_5" style="border-bottom: #fa891b 1px solid; cursor: pointer;" onclick="sendmsg('pw_ajax.php','action=relatetag&amp;tagname=运算符',this.id)">运算符</span><br />
UNION 运算符通过组合其他两个结果表（例如 TABLE1 和 TABLE2）并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时（即 UNION ALL），不消除重复行。两种情况下，派生表的每一行不是来自 TABLE1 就是来自 TABLE2。<br />
B： EXCEPT 运算符<br />
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL)，不消除重复行。<br />
C： INTERSECT 运算符<br />
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL)，不消除重复行。<br />
注：使用运算词的几个查询结果行必须是一致的。<br />
12、说明：使用外连接<br />
A、left outer join：<br />
左外连接（左连接）：结果集几包括连接表的匹配行，也包括左连接表的所有行。<br />
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c<br />
B：right outer join:<br />
右外连接(右连接)：结果集既包括连接表的匹配连接行，也包括右连接表的所有行。<br />
C：full outer join：<br />
全外连接：不仅包括符号连接表的匹配行，还包括两个连接表中的所有记录。<br />
二、提升<br />
1、说明：复制表(只复制结构,源表名：a 新表名：b) (Access可用)<br />
法一：select * into b from a where 1&lt;&gt;1<br />
法二：select top 0 * into b from a<br />
2、说明：拷贝表(拷贝数据,源表名：a 目标表名：b) (Access可用)<br />
insert into b(a, b, c) select d,e,f from b;<br />
3、说明：跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)<br />
insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where <span id="rlt_4" style="border-bottom: #fa891b 1px solid; cursor: pointer;" onclick="sendmsg('pw_ajax.php','action=relatetag&amp;tagname=条件',this.id)">条件</span><br />
例子：..from b in ‘”&amp;Server.MapPath(”.”)&amp;”\data.mdb” &amp;”‘ where..<br />
4、说明：子查询(表名1：a 表名2：b)<br />
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)<br />
5、说明：显示文章、提交人和最后回复时间<br />
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b<br />
6、说明：外连接查询(表名1：a 表名2：b)<br />
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c<br />
7、说明：在线视图查询(表名1：a )<br />
select * from (Select a,b,c FROM a) T where t.a &gt; 1;<br />
8、说明：between的用法,between限制查询数据范围时包括了边界值,not between不包括<br />
select * from table1 where time between time1 and time2<br />
select a,b,c, from table1 where a not between 数值1 and 数值2<br />
9、说明：in 的使用方法<br />
select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)<br />
10、说明：两张关联表，删除主表中已经在副表中没有的信息<br />
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )<br />
11、说明：四表联查问题：<br />
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where …..<br />
12、说明：日程安排提前五分钟提醒<br />
SQL: select * from 日程安排 where datediff(’minute’,f开始时间,getdate())&gt;5<br />
13、说明：一条sql 语句搞定数据库分页<br />
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段<br />
14、说明：前10条记录<br />
select top 10 * form table1 where 范围<br />
15、说明：选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)<br />
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)<br />
16、说明：包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表<br />
(select a from tableA ) except (select a from tableB) except (select a from tableC)<br />
17、说明：随机取出10条数据<br />
select top 10 * from tablename order by newid()<br />
18、说明：随机选择记录<br />
select newid()<br />
19、说明：删除重复记录<br />
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,…)<br />
20、说明：列出数据库里所有的表名<br />
select name from sysobjects where type=’U’<br />
21、说明：列出表里的所有的<br />
select name from syscolumns where id=object_id(’TableName’)<br />
22、说明：列示type、vender、pcs字段，以type字段排列，case可以方便地实现多重选择，类似select 中的case。<br />
select type,sum(case vender when ‘A’ then pcs else 0 end),sum(case vender when ‘C’ then pcs else 0 end),sum(case vender when ‘B’ then pcs else 0 end) FROM tablename group by type<br />
显示结果：<br />
type vender pcs<br />
电脑 A 1<br />
电脑 A 1<br />
光盘 B 2<br />
光盘 A 2<br />
手机 B 3<br />
手机 C 3<br />
23、说明：初始化表table1<br />
TRUNCATE TABLE table1<br />
24、说明：选择从10到15的记录<br />
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc<br />
三、<span id="rlt_8" style="border-bottom: #fa891b 1px solid; cursor: pointer;" onclick="sendmsg('pw_ajax.php','action=relatetag&amp;tagname=技巧',this.id)">技巧</span><br />
1、1=1，1=2的使用，在SQL语句组合时用的较多<br />
“where 1=1” 是表示选择全部 “where 1=2”全部不选，<br />
如：<br />
if @strWhere !=”<br />
begin<br />
set @strSQL = ’select count(*) as Total from [' + @tblName + '] where ‘ + @strWhere<br />
end<br />
else<br />
begin<br />
set @strSQL = ’select count(*) as Total from [' + @tblName + ']‘<br />
end<br />
我们可以直接写成<br />
set @strSQL = ’select count(*) as Total from [' + @tblName + '] where 1=1 安定 ‘+ @strWhere<br />
2、收缩数据库<br />
–重建索引<br />
DBCC REINDEX<br />
DBCC INDEXDEFRAG<br />
–收缩数据和日志<br />
DBCC SHRINKDB<br />
DBCC SHRINKFILE<br />
3、压缩数据库<br />
dbcc shrinkdatabase(dbname)<br />
4、转移数据库给新<span id="rlt_2" style="border-bottom: #fa891b 1px solid; cursor: pointer;" onclick="sendmsg('pw_ajax.php','action=relatetag&amp;tagname=用户',this.id)">用户</span>以已存在用户权限<br />
exec sp_change_users_login ‘update_one’,&#8217;newname’,&#8217;oldname’<br />
go<br />
5、检查备份集<br />
RESTORE VERIFYONLY from disk=’E:\dvbbs.bak’<br />
6、修复数据库</p>
<h6 style="margin: 0px; padding: 0px;">本部分设定了隐藏,您已回复过了,以下是隐藏的内容</h6>
<blockquote style="margin: 10px 0px;"><p>Alter DATABASE [dvbbs] SET SINGLE_USER<br />
GO<br />
DBCC CHECKDB(’dvbbs’,repair_allow_data_loss) WITH TABLOCK<br />
GO<br />
Alter DATABASE [dvbbs] SET MULTI_USER<br />
GO<br />
7、日志清除<br />
SET NOCOUNT ON<br />
DECLARE @LogicalFileName sysname,<br />
@MaxMinutes INT,<br />
@NewSize INT<br />
USE tablename — 要操作的数据库名<br />
Select @LogicalFileName = ‘tablename_log’, — 日志文件名<br />
@MaxMinutes = 10, — Limit on time allowed to wrap log.<br />
@NewSize = 1 — 你想设定的日志文件的大小(M)<br />
– Setup / initialize<br />
DECLARE @OriginalSize int<br />
Select @OriginalSize = size<br />
FROM sysfiles<br />
Where name = @LogicalFileName<br />
Select ‘Original Size of ‘ + db_name() + ‘ LOG is ‘ +<br />
CONVERT(VARCHAR(30),@OriginalSize) + ‘ 8K pages or ‘ +<br />
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + ‘MB’<br />
FROM sysfiles<br />
Where name = @LogicalFileName<br />
Create TABLE DummyTrans<br />
(DummyColumn char (8000) not null)<br />
DECLARE @Counter INT,<br />
@StartTime DATETIME,<br />
@TruncLog VARCHAR(255)<br />
Select @StartTime = GETDATE(),<br />
@TruncLog = ‘BACKUP LOG ‘ + db_name() + ‘ WITH TRUNCATE_ONLY’<br />
DBCC SHRINKFILE (@LogicalFileName, @NewSize)<br />
EXEC (@TruncLog)<br />
– Wrap the log if necessary.<br />
WHILE @MaxMinutes &gt; DATEDIFF (mi, @StartTime, GETDATE()) — time has not expired<br />
AND @OriginalSize = (Select size FROM sysfiles Where name = @LogicalFileName)<br />
AND (@OriginalSize * 8 /1024) &gt; @NewSize<br />
BEGIN — Outer loop.<br />
Select @Counter = 0<br />
WHILE ((@Counter &lt; @OriginalSize / 16) AND (@Counter &lt; 50000))<br />
BEGIN — update<br />
Insert DummyTrans VALUES (’Fill Log’)<br />
Delete DummyTrans<br />
Select @Counter = @Counter + 1<br />
END<br />
EXEC (@TruncLog)<br />
END<br />
Select ‘Final Size of ‘ + db_name() + ‘ LOG is ‘ +<br />
CONVERT(VARCHAR(30),size) + ‘ 8K pages or ‘ +<br />
CONVERT(VARCHAR(30),(size*8/1024)) + ‘MB’<br />
FROM sysfiles<br />
Where name = @LogicalFileName<br />
Drop TABLE DummyTrans<br />
SET NOCOUNT OFF<br />
8、说明：更改某个表<br />
exec sp_changeobjectowner ‘tablename’,&#8217;dbo’<br />
9、存储更改全部表<br />
Create PROCEDURE dbo.User_ChangeObjectOwnerBatch<br />
@OldOwner as NVARCHAR(128),<br />
@NewOwner as NVARCHAR(128)<br />
AS<br />
DECLARE @Name as NVARCHAR(128)<br />
DECLARE @Owner as NVARCHAR(128)<br />
DECLARE @OwnerName as NVARCHAR(128)<br />
DECLARE curObject CURSOR FOR<br />
select ‘Name’ = name,<br />
‘Owner’ = user_name(uid)<br />
from sysobjects<br />
where user_name(uid)=@OldOwner<br />
order by name<br />
OPEN curObject<br />
FETCH NEXT FROM curObject INTO @Name, @Owner<br />
WHILE(@@FETCH_STATUS=0)<br />
BEGIN<br />
if @Owner=@OldOwner<br />
begin<br />
set @OwnerName = @OldOwner + ‘.’ + rtrim(@Name)<br />
exec sp_changeobjectowner @OwnerName, @NewOwner<br />
end<br />
– select @name,@NewOwner,@OldOwner<br />
FETCH NEXT FROM curObject INTO @Name, @Owner<br />
END<br />
close curObject<br />
deallocate curObject<br />
GO<br />
10、SQL SERVER中直接循环写入数据<br />
declare @i int<br />
set @i=1<br />
while @i&lt;30<br />
begin<br />
insert into test (userid) values(@i)<br />
set @i=@i+1<br />
end<br />
小记存储过程中经常用到的本周，本月，本年<span id="rlt_1" style="border-bottom: #fa891b 1px solid; cursor: pointer;" onclick="sendmsg('pw_ajax.php','action=relatetag&amp;tagname=函数',this.id)">函数</span><br />
Dateadd(wk,datediff(wk,0,getdate()),-1)<br />
Dateadd(wk,datediff(wk,0,getdate()),6)<br />
Dateadd(mm,datediff(mm,0,getdate()),0)<br />
Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0))<br />
Dateadd(yy,datediff(yy,0,getdate()),0)<br />
Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))<br />
上面的SQL代码只是一个时间段<br />
Dateadd(wk,datediff(wk,0,getdate()),-1)<br />
Dateadd(wk,datediff(wk,0,getdate()),6)<br />
就是表示本周时间段.<br />
下面的SQL的条件部分,就是查询时间段在本周范围内的:<br />
Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6)<br />
而在存储过程中<br />
select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1)<br />
select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6)</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.helloyi.cn/index.php/2010/02/28/mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql性能监控和优化</title>
		<link>http://www.helloyi.cn/index.php/2010/02/26/mysql-performance-monitoring/</link>
		<comments>http://www.helloyi.cn/index.php/2010/02/26/mysql-performance-monitoring/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 02:17:24 +0000</pubDate>
		<dc:creator>好易阁</dc:creator>
				<category><![CDATA[数据库应用]]></category>

		<guid isPermaLink="false">http://www.helloyi.cn/?p=3093</guid>
		<description><![CDATA[MYSQL性能监控和优化： 对于各种不同的数据库来说，不管是数据库性能监控方式还是数据库性能优化方式，在原理和试图达到的目的上都是大同小异，存在很多的共性。当然，具体的监控和调整方法，过程及相关工具会因为不同的数据库而差别很大。比如Oracle性能优化，可以从三个方面入手：硬件升级，内存调优，应用调优。MySQL与之类似，也可以从三个方面下手：硬件升级，进程和内存调优，SQL优化（也就是应用优化）。下面详述。 （一）MySQL性能监控 首先，我们要清楚，哪些指标可以反映出数据库的性能。 就MySQL而言，这些指标可以用来测量数据库性能： 1）CPU,内存和IO在操作系统层面的使用情况； 2）查询响应时间； 3）吞吐量； 4）各种 Cache 命中率；   其次，我们要知道，哪些手段可以用来获得这些指标。 1）配置 sysstat 来收集数据库服务器操作系统层面的CPU,内存，IO 等指标； 2）启用 MySQL 慢查询记录功能来记录下响应时间较长的查询，这些查询往往就是需要做MySQL调整的对象。一旦启用了慢查询记录功能后，超过你设置的查询响应时间的查询就会被记录在你指定的日志文件中，然后，你就可以用mysqldumpslow命令来查看慢查询了。这样启用MySQL慢查询记录功能： # cat /etc/my.cnf [mysqld] ; enable the slow query log, default 10 seconds log-slow-queries ; log queries taking longer than 5 seconds long_query_time = 5 ; log queries that don&#8217;t use indexes even if they [...]]]></description>
			<content:encoded><![CDATA[<p>MYSQL性能监控和优化：</p>
<p>对于各种不同的数据库来说，不管是数据库性能监控方式还是数据库性能优化方式，在原理和试图达到的目的上都是大同小异，存在很多的共性。当然，具体的监控和调整方法，过程及相关工具会因为不同的数据库而差别很大。比如Oracle性能优化，可以从三个方面入手：硬件升级，内存调优，应用调优。MySQL与之类似，也可以从三个方面下手：硬件升级，进程和内存调优，SQL优化（也就是应用优化）。下面详述。<span id="more-3093"></span></p>
<div>（一）MySQL性能监控</div>
<div>首先，我们要清楚，哪些指标可以反映出数据库的性能。</div>
<div>就MySQL而言，这些指标可以用来测量数据库性能：</div>
<div>1）CPU,内存和IO在操作系统层面的使用情况；</div>
<div>2）查询响应时间；</div>
<div>3）吞吐量；</div>
<div>4）各种 Cache 命中率；</div>
<div> </div>
<div>其次，我们要知道，哪些手段可以用来获得这些指标。</div>
<div>1）配置 sysstat 来收集数据库服务器操作系统层面的CPU,内存，IO 等指标；</div>
<div>2）启用 MySQL 慢查询记录功能来记录下响应时间较长的查询，这些查询往往就是需要做MySQL调整的对象。一旦启用了慢查询记录功能后，超过你设置的查询响应时间的查询就会被记录在你指定的日志文件中，然后，你就可以用mysqldumpslow命令来查看慢查询了。这样启用MySQL慢查询记录功能：</div>
<div># cat /etc/my.cnf</div>
<div class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">[mysqld]</span></span></div>
<div class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-size: x-small;"><span style="font-family: Times New Roman;">; enable the slow query log, default 10 seconds</span></span></span></div>
<div class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-size: x-small;"><span style="font-family: Times New Roman;">log-slow-queries</span></span></span></div>
<div class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-size: x-small;"><span style="font-family: Times New Roman;">; log queries taking longer than 5 seconds</span></span></span></div>
<div class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-size: x-small;"><span style="font-family: Times New Roman;">long_query_time = 5</span></span></span></div>
<div class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-size: x-small;"><span style="font-family: Times New Roman;">; log queries that don&#8217;t use indexes even if they take less than long_query_time</span></span></span></div>
<div class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-size: x-small;"><span style="font-family: Times New Roman;">; MySQL 4.1 and newer only</span></span></span></div>
<div><span style="font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-ansi-language: en-us; mso-fareast-language: zh-cn; mso-bidi-language: ar-sa;" lang="EN-US"><span style="font-family: Times New Roman; font-size: x-small;">log-queries-not-using-indexes</span></span></div>
<div><span style="font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-ansi-language: en-us; mso-fareast-language: zh-cn; mso-bidi-language: ar-sa;" lang="EN-US"><span style="font-family: Times New Roman; font-size: x-small;">; long query log file</span></span></div>
<div><span style="font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-ansi-language: en-us; mso-fareast-language: zh-cn; mso-bidi-language: ar-sa;" lang="EN-US"><span style="font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-ansi-language: en-us; mso-fareast-language: zh-cn; mso-bidi-language: ar-sa;" lang="EN-US"><span style="font-family: Times New Roman; font-size: x-small;">log-slow-queries = /path/to/file</span></span></span></div>
<div><span style="font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-ansi-language: en-us; mso-fareast-language: zh-cn; mso-bidi-language: ar-sa;" lang="EN-US"></span> </div>
<div>这样查看慢查询：</div>
<div># mysqldumpslow /path/to/file</div>
<div>3）收集各种吞吐量和缓存相关信息</div>
<div>      a. 查询Cache：执行SQL语句 show status like &#8216;qcache%&#8217; 收集指标值。</div>
<div>      b. 表缓存：MySQL 表对应于磁盘上的文件，表缓存就是文件缓存。执行SQL语句 show status like &#8216;open%tables&#8217; 来收集指标值。</div>
<div>      c. 线程缓存：启用了线程缓存后，一个线程在其生命周期中就可以服务多个连接，从而加速MySQL初始连接速度。执行SQL语句 show status like &#8216;threads%&#8217; 来收集相关指标值。</div>
<div>      d. 关键字段(key)缓存：跟缓存表一样，缓存关键字段同样可以提高查询效率。执行SQL语句 show status like &#8216;%key_read%&#8217; 来收集相关指标值。</div>
<div>     e. 临时表：这里的临时表，指的是MySQL内部临时存放需要进一步处理的数据所使用的表，不是我们在存储过程中自定义的临时表。如果临时表放不下需要临时存放的数据，MySQL会使用磁盘来存放，从而降低性能。执行SQL语句 show status like &#8216;created_tmp%&#8217; 来收集相关指标值。</div>
<div>     f. 排序区： 当MySQL要执行排序操作的时候，它会使用排序区，如果指定的内存排序区放不下需要排序的数据，MySQL会使用磁盘来存放，从而降低性能。执行SQL语句 show status like &#8216;sort%&#8217; 来收集相关指标值。</div>
<div>     g. 全表扫描情况：通常情况下，对大表执行全表扫描很低效，应该尽量避免。执行SQL语句 show status like &#8216;com_select%&#8217; 和 show status like <span style="font-family: Times New Roman;"><span style="font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-ansi-language: en-us; mso-fareast-language: zh-cn; mso-bidi-language: ar-sa;" lang="EN-US"><span style="font-size: x-small;">handler_read_rnd_next</span></span>%&#8217; 来收集相关指标值。</span></div>
<div> </div>
<div>再次，我们要知道，这些指标的基准值（也即是在数据库正常情况下的值）。</div>
<div>为了判读我们的数据库运行状况是否正常，等待用户反映异常情况是一种方法，通常情况下这种方法不是我们所希望的，因为等待用户反映数据库异常的时候，往往问题都已经很严重了，这时候我们所能做的就是所谓的“应急反应”。更好的更有效的方式是，记录下正常情况下的基准值，然后实时将当前值跟基准值做对比，一旦当前值开始偏移基准值，就应该预警，这样，我们就可以做到所谓的“前馈控制”，在问题刚出现时就解决了。</div>
<div>我们应该收集数据库在各个具有代表性的时间段的基准值，在各种具有代表性的负载时的基准值，尤其是在峰值期间的基准值。收集基准值的方法就是前面讲述的用来获得性能指标值的方法。</div>
<div>对于MySQL性能监控，有几个工具值得一提，mytop, mysqlard 和 mysqlreport，这些工具的安装和使用都很简单，但却是很有用，读者可以试试。</div>
<div> </div>
<div>最后，我们要明白，这些指标异常时，我们应该采取什么样的手段，使其恢复到正常的能够接受的值。这是下面MySQL优化的内容。</div>
<div>（二）MySQL 性能优化</div>
<div>正如前面所说的那样，MySQL的优化涉及到三个方面：</div>
<div>1）硬件升级：这种方法很简单，系统负载过高了，好啊，加多CPU；内存不够用了，没问题，再加2G内存，等等。“那如果磁盘IO慢了怎么办呢？”读者可能会问。通常情况下，我们不太可能提高磁盘IO的速度（尽管使用合理的RAID级别，比如1+0，可以在一定程度上提高IO性能，但这往往是一锤子的买卖，试想如果数据库都已经投产了，谁还会轻易去重做RAID。）。实际上磁盘IO跟不上，往往并不是由于磁盘本身IO速度低，而是我们的数据库过度读写磁盘造成的。也就是说，本来可以不用读磁盘就可以搞定的操作，由于我们没有配置好，导致数据库也要去读磁盘。这种方式往往是一种权宜之计，只能解决燃眉之急。随着业务量的继续上升，对数据库处理能力的要求越来越高，升级后硬件的处理能力很快就不能满足要求了。<strong><span style="color: #ff00ff;">因为数据库的性能问题，往往是由于数据库缺乏可伸缩性引起的。所以，解决数据库性能问题的上策，是提高数据库的可伸缩性。</span></strong>而这种方法，出发点不是解决可伸缩性问题，当然其作用就有限了。而下面的两种方法，是以提高数据库的可伸缩性作为出发点的。</div>
<div>2）优化MySQL进程和内存：</div>
<div>     a. 启用查询缓存： 通过在/etc/my.cnf 文件添加 query_cache_size = &lt; 期望缓存的查询数 &gt; 来启用；</div>
<div>     b. 调整表缓存：通过在/etc/my.cnf文件里面加入 table_cache = &lt;期望缓存的表的数量&gt; 来调整；</div>
<div>     c. 调整MySQL线程缓存：通过在 /etc/my.cnf 文件添加 thread_cache = &lt;期望缓存的进程数&gt; 来调整；</div>
<div>     d. 调整关键字段(key)缓存：通过在/etc/my.cnf文件添加 key_buffer = &lt;期望的关键字段缓存大小&gt;来调整；</div>
<div>     e. 使用临时表：通过在/etc/my.cnf文件添加<span style="font-size: x-small;"> <span style="font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-ansi-language: en-us; mso-fareast-language: zh-cn; mso-bidi-language: ar-sa;" lang="EN-US"><span style="font-family: Times New Roman;">tmp_table_size <span style="font-family: SimSun; font-size: x-small;">和</span>max_heap_table_size </span></span></span>来调整；</div>
<div>     f. 设置合适的排序区大小：通过在/etc/my.cnf文件添加 sort_buffer_size = &lt;期望的排序区大小&gt;来调整；</div>
<div>     g. 设置合适的read_buffer_size减少全表扫描次数：通过在/etc/my.cnf文件添加read_buffer_size= &lt;期望的读缓冲区大小&gt;来调整；</div>
<div>     h. 在大表上建索引：</div>
<div>3）优化SQL语句：那些需要调整的SQL语句，往往都被记录在了慢查询日志文件里面了，所以，MySQL会告诉我们该优化哪些SQL语句。接下来就是如何优化的问题。读者可以试试，在一个数百万行的表上执行&#8221;select * from &lt;table_name&gt;会产生什么效果。不用说，数据库IO马上就被堵死了。可是，事实上，刚入行的程序员，就有可能写出这样的惊世赫俗的语句来。所以说，作为系统管理员/DBA，有时间的时候多跟程序员聊聊，提醒他们尽量不要犯这样的或其它类似的低级错误，于人于己都好处多多。关于怎样才能写出高效的SQL语句，不敢乱说，一则是因为我不是SQL高手，二则MySQL 和Oracle文档有很好的阐述，我不敢班门弄斧。值得指出的是，执行计划在优化SQL语句的过程中起着十分重要的作用。另外要说明的是，优化SQL语句对于提高数据库的性能往往是最有效的途径。</div>
<div> </div>
<div>闲话：有很多工具可以用来备份MySQL数据库，不过最有效的最划算的，还是配置MASTER/SLAVE 数据库。这样既起到了实时备份的作用，也可以实现一定程度上的负载分担，提升性能，一箭双雕，何乐而不为。</div>
<div> </div>
<div> 本文出自 “<a href="http://zoukejian.blog.51cto.com/"><span style="color: #000000;">邹可见</span></a>” 博客，<a href="http://zoukejian.blog.51cto.com/131276/58876"><span style="color: #000000;">http://zoukejian.blog.51cto.com/131276/58876</span></a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.helloyi.cn/index.php/2010/02/26/mysql-performance-monitoring/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>了解 NoSQL 的必读资料</title>
		<link>http://www.helloyi.cn/index.php/2010/01/14/nosql/</link>
		<comments>http://www.helloyi.cn/index.php/2010/01/14/nosql/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 13:01:38 +0000</pubDate>
		<dc:creator>好易阁</dc:creator>
				<category><![CDATA[数据库应用]]></category>

		<guid isPermaLink="false">http://www.helloyi.cn/?p=3070</guid>
		<description><![CDATA[NoSQL 是非关系型数据存储的广义定义。它打破了长久以来关系型数据库与 ACID 理论大一统的局面。NoSQL 数据存储不需要固定的表结构，通常也不存在连接 操作。在大数据存取上具备关系型数据库无法比拟的性能优势。该术语在 2009 年初得到了广泛认同。      当今的应用体系结构需要数据存储在横向伸缩性 上能够满足需求。而 NoSQL 存储就是为了实现这个需求。Google 的 BigTable 与 Amazon 的 Dynamo 是非常成功的商业 NoSQL 实现。一些开源的 NoSQL 体系，如Facebook 的 Cassandra ， Apache 的 HBase ，也得到了广泛认同。      如果您刚接触 NoSQL，那有必要学习一些背景知识。下列资料是国外一前沿技术分析师 认为非常有价值的 NoSQL 相关必读资料： Amazon Dynamo 论文 。几乎所有懂 NoSQL 的人都阅读过它。 Google 的 Bigtable 论文 。 也许您已经耳熟能详。 Werner Vogels 的 “Eventually Consistent” （发布于 [...]]]></description>
			<content:encoded><![CDATA[<p><strong><img style="width: 78px; float: left; height: 78px; margin-left: 0pt; margin-right: 1em;" src="http://docs.google.com/File?id=ddrm6c35_1202g7f52zgj_b" alt="" /> NoSQL</strong> 是非关系型数据存储的广义定义。它打破了长久以来关系型数据库与 <a title="ACID" href="http://en.wikipedia.org/wiki/ACID">ACID</a> 理论大一统的局面。NoSQL 数据存储不需要固定的表结构，通常也不存在<a title="Join (SQL)" href="http://en.wikipedia.org/wiki/Join_%28SQL%29">连接</a> 操作。在大数据存取上具备关系型数据库无法比拟的性能优势。该术语在 2009 年初得到了广泛认同。<br />
     当今的应用体系结构需要数据存储在<a title="Scalability" href="http://en.wikipedia.org/wiki/Scalability">横向伸缩性</a> 上能够满足需求。而 NoSQL 存储就是为了实现这个需求。Google 的 <a title="BigTable" href="http://en.wikipedia.org/wiki/BigTable">BigTable</a> 与 <a title="Amazon" href="http://en.wikipedia.org/wiki/Amazon">Amazon</a> 的 <a title="Dynamo (storage system)" href="http://en.wikipedia.org/wiki/Dynamo_%28storage_system%29">Dynamo</a> 是非常成功的商业 NoSQL 实现。一些开源的 NoSQL 体系，如Facebook 的 <a title="Cassandra (database)" href="http://en.wikipedia.org/wiki/Cassandra_%28database%29">Cassandra</a> ， Apache 的 <a title="HBase" href="http://en.wikipedia.org/wiki/HBase">HBase</a> ，也得到了广泛认同。<br />
     如果您刚接触 NoSQL，那有必要学习一些背景知识。下列资料是国外一<a id="ah7u" title="前沿技术分析师" href="http://asserttrue.blogspot.com/">前沿技术分析师</a> 认为非常有价值的 NoSQL 相关必读资料：</p>
<p><span id="more-3070"></span></p>
<ol>
<li><a title="Amazon Dynamo 论文" href="http://s3.amazonaws.com/AllThingsDistributed/sosp/amazon-dynamo-sosp2007.pdf">Amazon Dynamo 论文</a> 。几乎所有懂 NoSQL 的人都阅读过它。</li>
<li>Google 的 <a title="Bigtable 论文" href="http://labs.google.com/papers/bigtable.html">Bigtable 论文</a> 。 也许您已经耳熟能详。</li>
<li>Werner Vogels 的 <a title="“Eventually Consistent”" href="http://www.allthingsdistributed.com/2008/12/eventually_consistent.html">“Eventually Consistent”</a> （发布于 <a title="ACM Queue" href="http://delivery.acm.org/10.1145/1470000/1466448/p14-vogels.pdf?key1=1466448&amp;key2=8241830621&amp;coll=GUIDE&amp;dl=GUIDE&amp;CFID=65986758&amp;CFTOKEN=76261788"><em>ACM Queue</em> </a>）。如果您对“<strong>最终一致性</strong> ”不是非常清晰，请阅读这篇文章。</li>
<li>Brewer 的 <strong>CAP 理论</strong> （可伸缩性的基础）在<a title="这里" href="http://www.julianbrowne.com/article/viewer/brewers-cap-theorem">这里</a> 可以找到非常好的诠释。也可以看看 2000 7 月 PODC 上 <a title="Brewer的原始幻灯片" href="http://www.cs.berkeley.edu/~brewer/cs262b-2004/PODC-keynote.pdf">Brewer的原始幻灯片</a> 。</li>
<li><a title="在 2009 年 6 月在 SFO 的 NoSQL 见面会的幻灯片" href="http://blog.oskarsson.nu/2009/06/nosql-debrief.html">在 2009 年 6 月在 SFO 的 NoSQL 见面会的幻灯片</a> 。这些资料可以用经典的、关键的、将影响巨大的、值得纪念的来形容。</li>
<li><a title="SQL Databases Don't Scale" href="http://adam.blog.heroku.com/past/2009/7/6/sql_databases_dont_scale/">SQL Databases Don&#8217;t Scale</a> 是一篇简短、基础、直切问题的文章。除非您是一位在<strong>伸缩性问题</strong> 上身经百战的数据库管理员，否则，这篇文章讲述的内容对于您可能是非常关键的。</li>
<li><a title="Jonathan  Ellis" href="http://twitter.com/spyced" target="_blank">Jonathan Ellis</a> 的文章 <a title="NoSQL Ecosystem" href="http://www.rackspacecloud.com/blog/2009/11/09/nosql-ecosystem/">NoSQL Ecosystem</a> 以表格的方式对当今<strong>主流的分布式数据库</strong> 做了比较。类似的比较还有 <a title="Quick Reference to Alternative data storages" href="http://themindstorms.blogspot.com/2009/05/quick-reference-to-alternative-data.html">Quick Reference to Alternative data storages</a> 。Ellis 的文章除了表格对比外对于想了解 NoSQL 生态的人来说是非常值得一读的，该文章内涵丰富，短小精悍；而 <a title="Quick Reference to Alternative data storages" href="http://themindstorms.blogspot.com/2009/05/quick-reference-to-alternative-data.html">Quick Reference to Alternative data storages</a> 主要是表格，这些表格对比的内容又比 Ellis 的完整。</li>
</ol>
<h4><strong>相关国外资源</strong></h4>
<p>    <a id="d2ma" title="http://nosql-databases.org" href="http://nosql-databases.org/">http://nosql-databases.org</a> —— 该站点的标语是：“非关系型世界的终结向导！”，该站点非常确信自己是：“在互联网上拥有 NoSQL 相关链接最多的网站。”总之，该网站值得关注。<br />
     另外，作为 NoSQL 极客（geeks），请 follow <a title="@nosqlupdate" href="http://twitter.com/nosqlupdate">@nosqlupdate</a> 。另外，请 follow <a title="@al3xandru" href="http://twitter.com/al3xandru">@al3xandru</a> （<a title="MyNoSQL blog" href="http://nosql.mypopescu.com/">MyNoSQL blog</a> 与 <a title="NoSQL Week in Review" href="http://nosql.mypopescu.com/post/272903545/nosql-week-review-part-1">NoSQL Week in Review</a> 的创建者）。<a title="NoSQL Week in Review" href="http://nosql.mypopescu.com/post/272903545/nosql-week-review-part-1">NoSQL Week in Review</a> 比较新，希望能保持正常更新，因为它确实很棒！<br />
     当然，您还可以看看 Ricky Ho 最近的博文，他总结了一些分布式数据存储技术关键点。他的博文中有两篇非常值得一看的文章：<a title="Query Processing for NoSQL Databases" href="http://horicky.blogspot.com/2009/11/query-processing-for-nosql-db.html">Query Processing for NoSQL Databases</a> ，还有 <a title="NoSQL Design Patterns" href="http://horicky.blogspot.com/2009/11/nosql-patterns.html">NoSQL Design Patterns</a> 。</p>
<h4><strong>相关国内资源</strong></h4>
<ul>
<li><a id="jdy:" title="Tim[后端技术]" href="http://timyang.net/">Tim[后端技术]</a> ：<a id="rioi" title="分布式 Key Value Store 漫谈" href="http://www.slideshare.net/iso1600/key-value-store">分布式 Key Value Store 漫谈</a></li>
<li><a id="kp_-" title="CSDN 新闻频道" href="http://news.csdn.net/">CSDN 新闻频道</a> ：<a id="kmu8" title="豆瓣开源 Key Value 存储系统 BeansDB" href="http://news.csdn.net/a/20091231/216203.html">豆瓣开源 Key Value 存储系统 BeansDB</a></li>
<li><a id="s55e" title="robbin的自言自语" href="http://robbin.javaeye.com/">robbin 的自言自语</a> ：<a id="y6n2" title="NoSQL数据库探讨之一" href="http://robbin.javaeye.com/blog/524977">NoSQL数据库探讨之一</a></li>
<li><a id="o6l3" title="J道" href="http://www.jdon.com/">J道</a> <a id="dim7" title="BanQ" href="http://www.jdon.com/jivejdon/blog/banq">BanQ</a> ：<a id="f:g4" title="CAP原理和BASE思想" href="http://www.jdon.com/jivejdon/thread/37625">CAP 原理和 BASE 思想</a></li>
</ul>
<p>来源：<a href="http://asserttrue.blogspot.com/2009/12/nosql-required-reading.html" target="_blank">NoSQL Required Reading</a> ，<a id="f5eu" title="Wikipedia  - NoSQL" href="http://en.wikipedia.org/wiki/NoSQL">Wikipedia &#8211; NoSQL</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.helloyi.cn/index.php/2010/01/14/nosql/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>MySQL索引类型一览让MySQL高效运行起来</title>
		<link>http://www.helloyi.cn/index.php/2009/10/27/mysql-index/</link>
		<comments>http://www.helloyi.cn/index.php/2009/10/27/mysql-index/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 07:55:44 +0000</pubDate>
		<dc:creator>好易阁</dc:creator>
				<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.helloyi.cn/?p=2976</guid>
		<description><![CDATA[索引是快速搜索的关键。MySQL索引的建立对于MySQL的高效运行是很重要的。下面介绍几种常见的MySQL索引类型。在数据库表中，对字段建立索引可以大大提高查询速度。假如我们创建了一个 mytable表： CREATE TABLE mytable(     ID INT NOT NULL,      username VARCHAR(16) NOT NULL    );     我们随机向里面插入了10000条记录，其中有一条：5555, admin。 在查找username=&#8221;admin&#8221;的记录 SELECT * FROM mytable WHERE username=&#8217;admin&#8217;;时，如果在username上已经建立了索引，MySQL无须任何扫描，即准确可找到该记录。相反，MySQL会扫描所有记录，即要查询10000条记录。 索引分单列索引和组合索引。单列索引，即一个索引只包含单个列，一个表可以有多个单列索引，但这不是组合索引。组合索引，即一个索包含多个列。 MySQL索引类型包括： （1）普通索引 这是最基本的索引，它没有任何限制。它有以下几种创建方式： ◆创建索引 CREATE INDEX indexName ON mytable(username(length));  如果是CHAR，VARCHAR类型，length可以小于字段实际长度；如果是BLOB和TEXT类型，必须指定 length，下同。 ◆修改表结构 ALTER mytable ADD INDEX [indexName] ON (username(length))  ◆创建表的时候直接指定 CREATE TABLE mytable(     ID INT NOT NULL,      username VARCHAR(16) NOT NULL,     INDEX [indexName] (username(length))     );   删除索引的语法： DROP INDEX [indexName] ON mytable;  （2）唯一索引 它与前面的普通索引类似，不同的就是：索引列的值必须唯一，但允许有空值。如果是组合索引，则列值的组合必须唯一。它有以下几种创建方式： ◆创建索引 CREATE UNIQUE INDEX indexName ON mytable(username(length))  ◆修改表结构 ALTER mytable ADD UNIQUE [indexName] ON (username(length))  [...]]]></description>
			<content:encoded><![CDATA[<p>索引是快速搜索的关键。MySQL索引的建立对于MySQL的高效运行是很重要的。下面介绍几种常见的MySQL索引类型。在数据库表中，对字段建立索引可以大大提高查询速度。假如我们创建了一个 mytable表：<span id="more-2976"></span></p>
<pre>
<li><span><span><strong><span style="color: #006699;">CREATE</span></strong></span><span> </span><span><strong><span style="color: #006699;">TABLE</span></strong></span><span> mytable(  </span></span></li>
<li><span> </span></li>
<li><span>ID </span><span><strong><span style="color: #006699;">INT</span></strong></span><span> </span><span><span style="color: #808080;">NOT</span></span><span> </span><span><span style="color: #808080;">NULL</span></span><span>,   </span></li>
<li><span> </span></li>
<li><span>username </span><span><strong><span style="color: #006699;">VARCHAR</span></strong></span><span>(16) </span><span><span style="color: #808080;">NOT</span></span><span> </span><span><span style="color: #808080;">NULL</span></span><span> </span></li>
<li><span> </span></li>
<li><span>);  </span></li>
<li><span> </span></li>
</pre>
<p>我们随机向里面插入了10000条记录，其中有一条：5555, admin。</p>
<p>在查找username=&#8221;admin&#8221;的记录 SELECT * FROM mytable WHERE username=&#8217;admin&#8217;;时，如果在username上已经建立了索引，MySQL无须任何扫描，即准确可找到该记录。相反，MySQL会扫描所有记录，即要查询10000条记录。</p>
<p>索引分单列索引和组合索引。单列索引，即一个索引只包含单个列，一个表可以有多个单列索引，但这不是组合索引。组合索引，即一个索包含多个列。</p>
<p>MySQL索引类型包括：</p>
<p><strong>（1）普通索引</strong></p>
<p>这是最基本的索引，它没有任何限制。它有以下几种创建方式：</p>
<p>◆创建索引</p>
<pre>
<li><span><span><strong><span style="color: #006699;">CREATE</span></strong></span><span> </span><span><strong><span style="color: #006699;">INDEX</span></strong></span><span> indexName </span><span><strong><span style="color: #006699;">ON</span></strong></span><span> mytable(username(length)); </span></span></li>
</pre>
<p>如果是CHAR，VARCHAR类型，length可以小于字段实际长度；如果是BLOB和TEXT类型，必须指定 length，下同。</p>
<p>◆修改表结构</p>
<pre>
<li><span><span><strong><span style="color: #006699;">ALTER</span></strong></span><span> mytable </span><span><strong><span style="color: #006699;">ADD</span></strong></span><span> </span><span><strong><span style="color: #006699;">INDEX</span></strong></span><span> [indexName] </span><span><strong><span style="color: #006699;">ON</span></strong></span><span> (username(length)) </span></span></li>
</pre>
<p>◆创建表的时候直接指定</p>
<pre>
<li><span><span><strong><span style="color: #006699;">CREATE</span></strong></span><span> </span><span><strong><span style="color: #006699;">TABLE</span></strong></span><span> mytable(  </span></span></li>
<li><span> </span></li>
<li><span>ID </span><span><strong><span style="color: #006699;">INT</span></strong></span><span> </span><span><span style="color: #808080;">NOT</span></span><span> </span><span><span style="color: #808080;">NULL</span></span><span>,   </span></li>
<li><span> </span></li>
<li><span>username </span><span><strong><span style="color: #006699;">VARCHAR</span></strong></span><span>(16) </span><span><span style="color: #808080;">NOT</span></span><span> </span><span><span style="color: #808080;">NULL</span></span><span>,  </span></li>
<li><span> </span></li>
<li><span><strong><span style="color: #006699;">INDEX</span></strong></span><span> [indexName] (username(length))  </span></li>
<li><span> </span></li>
<li><span>);  </span></li>
</pre>
<p>删除索引的语法：</p>
<pre>
<li><span><span><strong><span style="color: #006699;">DROP</span></strong></span><span> </span><span><strong><span style="color: #006699;">INDEX</span></strong></span><span> [indexName] </span><span><strong><span style="color: #006699;">ON</span></strong></span><span> mytable; </span></span></li>
</pre>
<p><strong>（2）唯一索引</strong></p>
<p>它与前面的普通索引类似，不同的就是：索引列的值必须唯一，但允许有空值。如果是组合索引，则列值的组合必须唯一。它有以下几种创建方式：</p>
<p>◆创建索引</p>
<pre>
<li><span><span><strong><span style="color: #006699;">CREATE</span></strong></span><span> </span><span><strong><span style="color: #006699;">UNIQUE</span></strong></span><span> </span><span><strong><span style="color: #006699;">INDEX</span></strong></span><span> indexName </span><span><strong><span style="color: #006699;">ON</span></strong></span><span> mytable(username(length)) </span></span></li>
</pre>
<p>◆修改表结构</p>
<pre>
<li><span><span><strong><span style="color: #006699;">ALTER</span></strong></span><span> mytable </span><span><strong><span style="color: #006699;">ADD</span></strong></span><span> </span><span><strong><span style="color: #006699;">UNIQUE</span></strong></span><span> [indexName] </span><span><strong><span style="color: #006699;">ON</span></strong></span><span> (username(length)) </span></span></li>
</pre>
<p>◆创建表的时候直接指定</p>
<pre>
<li><span><span><strong><span style="color: #006699;">CREATE</span></strong></span><span> </span><span><strong><span style="color: #006699;">TABLE</span></strong></span><span> mytable(  </span></span></li>
<li><span> </span></li>
<li><span>ID </span><span><strong><span style="color: #006699;">INT</span></strong></span><span> </span><span><span style="color: #808080;">NOT</span></span><span> </span><span><span style="color: #808080;">NULL</span></span><span>,   </span></li>
<li><span> </span></li>
<li><span>username </span><span><strong><span style="color: #006699;">VARCHAR</span></strong></span><span>(16) </span><span><span style="color: #808080;">NOT</span></span><span> </span><span><span style="color: #808080;">NULL</span></span><span>,  </span></li>
<li><span> </span></li>
<li><span><strong><span style="color: #006699;">UNIQUE</span></strong></span><span> [indexName] (username(length))  </span></li>
<li><span> </span></li>
<li><span>);  </span></li>
</pre>
<p><strong>（3）主键索引</strong></p>
<p>它是一种特殊的唯一索引，不允许有空值。一般是在建表的时候同时创建主键索引：</p>
<pre>
<li><span><span><strong><span style="color: #006699;">CREATE</span></strong></span><span> </span><span><strong><span style="color: #006699;">TABLE</span></strong></span><span> mytable(  </span></span></li>
<li><span> </span></li>
<li><span>ID </span><span><strong><span style="color: #006699;">INT</span></strong></span><span> </span><span><span style="color: #808080;">NOT</span></span><span> </span><span><span style="color: #808080;">NULL</span></span><span>,   </span></li>
<li><span> </span></li>
<li><span>username </span><span><strong><span style="color: #006699;">VARCHAR</span></strong></span><span>(16) </span><span><span style="color: #808080;">NOT</span></span><span> </span><span><span style="color: #808080;">NULL</span></span><span>,  </span></li>
<li><span> </span></li>
<li><span><strong><span style="color: #006699;">PRIMARY</span></strong></span><span> </span><span><strong><span style="color: #006699;">KEY</span></strong></span><span>(ID)  </span></li>
<li><span> </span></li>
<li><span>);  </span></li>
</pre>
<p>当然也可以用 ALTER 命令。记住：一个表只能有一个主键。</p>
<p><strong>（4）组合索引</strong></p>
<p>为了形象地对比单列索引和组合索引，为表添加多个字段：</p>
<pre>
<li><span><span><strong><span style="color: #006699;">CREATE</span></strong></span><span> </span><span><strong><span style="color: #006699;">TABLE</span></strong></span><span> mytable(  </span></span></li>
<li><span> </span></li>
<li><span>ID </span><span><strong><span style="color: #006699;">INT</span></strong></span><span> </span><span><span style="color: #808080;">NOT</span></span><span> </span><span><span style="color: #808080;">NULL</span></span><span>,   </span></li>
<li><span> </span></li>
<li><span>username </span><span><strong><span style="color: #006699;">VARCHAR</span></strong></span><span>(16) </span><span><span style="color: #808080;">NOT</span></span><span> </span><span><span style="color: #808080;">NULL</span></span><span>,  </span></li>
<li><span> </span></li>
<li><span>city </span><span><strong><span style="color: #006699;">VARCHAR</span></strong></span><span>(50) </span><span><span style="color: #808080;">NOT</span></span><span> </span><span><span style="color: #808080;">NULL</span></span><span>,  </span></li>
<li><span> </span></li>
<li><span>age </span><span><strong><span style="color: #006699;">INT</span></strong></span><span> </span><span><span style="color: #808080;">NOT</span></span><span> </span><span><span style="color: #808080;">NULL</span></span><span> </span></li>
<li><span> </span></li>
<li><span>);  </span></li>
</pre>
<p>为了进一步榨取MySQL的效率，就要考虑建立组合索引。就是将 name, city, age建到一个索引里：</p>
<pre>
<li><span><span><strong><span style="color: #006699;">ALTER</span></strong></span><span> </span><span><strong><span style="color: #006699;">TABLE</span></strong></span><span> mytable </span><span><strong><span style="color: #006699;">ADD</span></strong></span><span> </span><span><strong><span style="color: #006699;">INDEX</span></strong></span><span> name_city_age (</span><span><strong><span style="color: #006699;">name</span></strong></span><span>(10),city,age); </span></span></li>
</pre>
<p>建表时，usernname长度为 16，这里用 10。这是因为一般情况下名字的长度不会超过10，这样会加速索引查询速度，还会减少索引文件的大小，提高INSERT的更新速度。</p>
<p>如果分别在 usernname，city，age上建立单列索引，让该表有3个单列索引，查询时和上述的组合索引效率也会大不一样，远远低于我们的组合索引。虽然此时有了三个索引，但MySQL只能用到其中的那个它认为似乎是最有效率的单列索引。</p>
<p>建立这样的组合索引，其实是相当于分别建立了下面三组组合索引：</p>
<pre>
<li><span><span>usernname,city,age  </span></span></li>
<li><span> </span></li>
<li><span>usernname,city  </span></li>
<li><span> </span></li>
<li><span>usernname  </span></li>
</pre>
<p>为什么没有 city，age这样的组合索引呢？这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引，下面的几个SQL就会用到这个组合索引：</p>
<pre>
<li><span><span><strong><span style="color: #006699;">SELECT</span></strong></span><span> * </span><span><strong><span style="color: #006699;">FROM</span></strong></span><span> mytable WHREE username=</span><span><span style="color: #0000ff;">"admin"</span></span><span> </span><span><span style="color: #808080;">AND</span></span><span> city=</span><span><span style="color: #0000ff;">"郑州"</span></span><span> </span></span></li>
<li><span> </span></li>
<li><span><strong><span style="color: #006699;">SELECT</span></strong></span><span> * </span><span><strong><span style="color: #006699;">FROM</span></strong></span><span> mytable WHREE username=</span><span><span style="color: #0000ff;">"admin"</span></span><span> </span></li>
</pre>
<p>而下面几个则不会用到：</p>
<pre>
<li><span><span><strong><span style="color: #006699;">SELECT</span></strong></span><span> * </span><span><strong><span style="color: #006699;">FROM</span></strong></span><span> mytable WHREE age=20 </span><span><span style="color: #808080;">AND</span></span><span> city=</span><span><span style="color: #0000ff;">"郑州"</span></span><span> </span></span></li>
<li><span> </span></li>
<li><span><strong><span style="color: #006699;">SELECT</span></strong></span><span> * </span><span><strong><span style="color: #006699;">FROM</span></strong></span><span> mytable WHREE city=</span><span><span style="color: #0000ff;">"郑州"</span></span><span> </span></li>
</pre>
<p><strong>（5）建立索引的时机</strong></p>
<p>到这里我们已经学会了建立索引，那么我们需要在什么情况下建立索引呢？一般来说，在WHERE和JOIN中出现的列需要建立索引，但也不完全如此，因为MySQL只对&lt;，&lt;=，=，&gt;，&gt;=，BETWEEN，IN，以及某些时候的LIKE才会使用索引。例如：</p>
<pre>
<li><span><span><strong><span style="color: #006699;">SELECT</span></strong></span><span> t.</span><span><strong><span style="color: #006699;">Name</span></strong></span><span> </span></span></li>
<li><span> </span></li>
<li><span><strong><span style="color: #006699;">FROM</span></strong></span><span> mytable t </span><span><span style="color: #ff1493;">LEFT</span></span><span> </span><span><span style="color: #808080;">JOIN</span></span><span> mytable m   </span></li>
<li><span> </span></li>
<li><span><strong><span style="color: #006699;">ON</span></strong></span><span> t.</span><span><strong><span style="color: #006699;">Name</span></strong></span><span>=m.username </span><span><strong><span style="color: #006699;">WHERE</span></strong></span><span> m.age=20 </span><span><span style="color: #808080;">AND</span></span><span> m.city=</span><span><span style="color: #0000ff;">'郑州'</span></span><span> </span></li>
</pre>
<p>此时就需要对city和age建立索引，由于mytable表的userame也出现在了JOIN子句中，也有对它建立索引的必要。</p>
<p>刚才提到只有某些时候的LIKE才需建立索引。因为在以通配符%和_开头作查询时，MySQL不会使用索引。例如下句会使用索引：</p>
<pre>
<li><span><span><strong><span style="color: #006699;">SELECT</span></strong></span><span> * </span><span><strong><span style="color: #006699;">FROM</span></strong></span><span> mytable </span><span><strong><span style="color: #006699;">WHERE</span></strong></span><span> username </span><span><span style="color: #808080;">like</span></span><span><span style="color: #0000ff;">'admin%'</span></span><span> </span></span></li>
</pre>
<p>而下句就不会使用：</p>
<pre>
<li><span><span><strong><span style="color: #006699;">SELECT</span></strong></span><span> * </span><span><strong><span style="color: #006699;">FROM</span></strong></span><span> mytable WHEREt </span><span><strong><span style="color: #006699;">Name</span></strong></span><span> </span><span><span style="color: #808080;">like</span></span><span><span style="color: #0000ff;">'%admin'</span></span><span> </span></span></li>
</pre>
<p>因此，在使用LIKE时应注意以上的区别。</p>
<p><strong>（6）索引的不足之处</strong></p>
<p>上面都在说使用索引的好处，但过多的使用索引将会造成滥用。因此索引也会有它的缺点：</p>
<p>◆虽然索引大大提高了查询速度，同时却会降低更新表的速度，如对表进行INSERT、UPDATE和DELETE。因为更新表时，MySQL不仅要保存数据，还要保存一下索引文件。</p>
<p>◆建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重，但如果你在一个大表上创建了多种组合索引，索引文件的会膨胀很快。</p>
<p>索引只是提高效率的一个因素，如果你的MySQL有大数据量的表，就需要花时间研究建立最优秀的索引，或优化查询语句。</p>
<p><strong>（7）使用索引的注意事项</strong></p>
<p>使用索引时，有以下一些技巧和注意事项：</p>
<p>◆索引不会包含有NULL值的列</p>
<p>只要列中包含有NULL值都将不会被包含在索引中，复合索引中只要有一列含有NULL值，那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。</p>
<p>◆使用短索引</p>
<p>对串列进行索引，如果可能应该指定一个前缀长度。例如，如果有一个CHAR(255)的列，如果在前10个或20个字符内，多数值是惟一的，那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。</p>
<p>◆索引列排序</p>
<p>MySQL查询只使用一个索引，因此如果where子句中已经使用了索引的话，那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作；尽量不要包含多个列的排序，如果需要最好给这些列创建复合索引。</p>
<p>◆like语句操作</p>
<p>一般情况下不鼓励使用like操作，如果非使用不可，如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。</p>
<p>◆不要在列上进行运算</p>
<pre>
<li><span><span><strong><span style="color: #006699;">select</span></strong></span><span> * </span><span><strong><span style="color: #006699;">from</span></strong></span><span> users </span><span><strong><span style="color: #006699;">where</span></strong></span><span> </span><span><span style="color: #ff1493;">YEAR</span></span><span>(adddate)&lt;2007; </span></span></li>
</pre>
<p>将在每个行上进行运算，这将导致索引失效而进行全表扫描，因此我们可以改成</p>
<pre>
<li><span><span><strong><span style="color: #006699;">select</span></strong></span><span> * </span><span><strong><span style="color: #006699;">from</span></strong></span><span> users </span><span><strong><span style="color: #006699;">where</span></strong></span><span> adddate&lt;‘2007-01-01’;  </span></span></li>
</pre>
<p>◆不使用NOT IN和&lt;&gt;操作</p>
<p>以上，就对其中MySQL索引类型进行了介绍。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.helloyi.cn/index.php/2009/10/27/mysql-index/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>联想在线存储LenovoData专业版公测</title>
		<link>http://www.helloyi.cn/index.php/2009/04/12/lenovodata/</link>
		<comments>http://www.helloyi.cn/index.php/2009/04/12/lenovodata/#comments</comments>
		<pubDate>Sun, 12 Apr 2009 07:25:24 +0000</pubDate>
		<dc:creator>好易阁</dc:creator>
				<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[免费空间]]></category>

		<guid isPermaLink="false">http://www.helloyi.cn/?p=2463</guid>
		<description><![CDATA[LenovoData 是由联想实验室早期推出的一款网络数据存储服务，近期，官方悄然发布了一款安全系数、服务质量更高的在线存储专业版，面向用户开始公测。 LenovoData 是 由联想实验室在07年5月份推出的一款网络硬盘，它的诞生致力于为用户提供高效、安全、简洁易用的在线数据存储、分享、备份服务；通过联想在线数据中心用 户可以在任何有Internet的地方，使用任何浏览器方便的管理自己的数据。 在历经近两年多时间的经营与发展，近期，联想在线数据中心悄然发布了更胜一 筹的专业版网盘，目前已面向全面接受来自国内用户的公开测试（活动截止本月底）；相比于大众版而言，专业版最大亮点是更严密的安全措施（采用SSL安全套接字层加密技术）以及强化了在线协作功能（支持在线预览、外链等）。 联 想试图以研究院的方式重返互联网果然和我当初预想的一样——不靠谱！目前，除了联想在线数据中心以外，LenovoLabs 旗下多款曾经一度广 受好评的SaaS软件，譬如在线绘图工具Best4C Show、日程管理工具 Scheduler Online以及在线思维导图制作工具 MindMap 等都纷纷下线，有些甚至连域名也被重定向到了那种很黄很暴力的娱乐网站上。这个时候，我绝对不是所谓幸灾乐祸，之所以认为联想重新涉足互联网领域是多么不靠谱的一件事情，主要考虑的是联想目前在自己主营的PC业务上尚存在巨大的问题，如果再在是否赶着浪潮儿从事互联网相关事宜的问题上左右摇摆显然是一件不 够明智的想法；更何况，现在的互联网早已经不在是联想FM365的那个年代，运气也已离开柳传志和联想很远很远。]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://www.helloyi.cn/topics/239.htm"></a></p>
<p><a href="http://www.lenovodata.com/">LenovoData</a> 是由联想实验室早期推出的一款网络数据存储服务，近期，官方悄然发布了一款安全系数、服务质量更高的<a href="http://www.lenovodata.com/tryprofession.html">在线存储专业版</a>，面向用户开始公测。<br />
<a href="http://www.lenovodata.com/">LenovoData</a> 是 由联想实验室在07年5月份推出的一款网络硬盘，它的诞生致力于为用户提供高效、安全、简洁易用的在线数据存储、分享、备份服务；通过联想在线数据中心用 户可以在任何有Internet的地方，使用任何浏览器方便的管理自己的数据。</p>
<p style="text-align: center;"><span id="more-2463"></span>在历经近两年多时间的经营与发展，近期，联想在线数据中心悄然发布了更胜一 筹的<a href="http://www.lenovodata.com/tryprofession.html">专业版网盘</a>，目前已面向全面接受来自国内用户的公开测试（活动截止本月底）；相比于大众版而言，专业版最大亮点是更严密的安全措施（采用SSL安全套接字层加密技术）以及强化了在线协作功能（支持在线预览、外链等）。</p>
<p><a href="http://www.helloyi.cn/index.php/2009/04/12/lenovodata"><img class="size-full wp-image-2464 aligncenter" title="lenovodata" src="http://www.helloyi.cn/wp-content/uploads/2009/04/1156380431445810.png" alt="" width="500" height="383" /></a></p>
<p>联 想试图以研究院的方式重返互联网果然和我当初预想的一样——不靠谱！目前，除了联想在线数据中心以外，LenovoLabs 旗下多款曾经一度广 受好评的SaaS软件，譬如在线绘图工具Best4C Show、日程管理工具 Scheduler Online以及在线思维导图制作工具 MindMap 等都纷纷下线，有些甚至连域名也被重定向到了那种很黄很暴力的娱乐网站上。这个时候，我绝对不是所谓幸灾乐祸，之所以认为联想重新涉足互联网领域是多么不靠谱的一件事情，主要考虑的是联想目前在自己主营的PC业务上尚存在巨大的问题，如果再在是否赶着浪潮儿从事互联网相关事宜的问题上左右摇摆显然是一件不 够明智的想法；更何况，现在的互联网早已经不在是联想FM365的那个年代，运气也已离开柳传志和联想很远很远。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.helloyi.cn/index.php/2009/04/12/lenovodata/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL常用命令集结</title>
		<link>http://www.helloyi.cn/index.php/2009/04/10/mysql-stock-command/</link>
		<comments>http://www.helloyi.cn/index.php/2009/04/10/mysql-stock-command/#comments</comments>
		<pubDate>Fri, 10 Apr 2009 05:34:52 +0000</pubDate>
		<dc:creator>好易阁</dc:creator>
				<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[SQL注入]]></category>

		<guid isPermaLink="false">http://www.helloyi.cn/?p=2454</guid>
		<description><![CDATA[一) 连接MYSQL： 格式： mysql -h主机地址 -u用户名 －p用户密码 1、例1：连接到本机上的MYSQL 首先在打开DOS窗口，然后进入mysql安装目录下的bin目录下，例如： D:\mysql\bin，再键入命令mysql -uroot -p，回车后提示你输密码，如果刚安装好MYSQL，超级用户root是没有密码的，故直接回车即可进入到MYSQL中了，MYSQL的提示符是：mysql&#62; 2、例2：连接到远程主机上的MYSQL 假设远程主机的IP为：10.0.0.1，用户名为root,密码为123。则键入以下命令： mysql -h10.0.0.1 -uroot -p123 （注：u与root可以不用加空格，其它也一样） 3、退出MYSQL命令 exit （回车）   (二) 修改密码： 格式：mysqladmin -u用户名 -p旧密码 password 新密码 1、例1：给root加个密码123。首先在DOS下进入目录C:\mysql\bin，然后键入以下命令： mysqladmin -uroot -password 123 注：因为开始时root没有密码，所以-p旧密码一项就可以省略了。 2、例2：再将root的密码改为456 mysqladmin -uroot -pab12 password 456 (三) 增加新用户：（注意：和上面不同，下面的因为是MYSQL环境中的命令，所以后面都带一个分号作为命令结束符） 格式：grant select on 数据库.* to 用户名@登录主机 identified by "密码" 例1、增加一个用户test1密码为abc，让他可以在任何主机上登录，并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入MYSQL，然后键入以下命令： grant [...]]]></description>
			<content:encoded><![CDATA[<p>一) 连接MYSQL：</p>
<pre>   格式： mysql -h主机地址 -u用户名 －p用户密码</pre>
<p>1、例1：连接到本机上的MYSQL</p>
<pre>   首先在打开DOS窗口，然后进入mysql安装目录下的bin目录下，例如： D:\mysql\bin，再键入命令mysql -uroot -p，回车后提示你输密码，如果刚安装好MYSQL，超级用户root是没有密码的，故直接回车即可进入到MYSQL中了，MYSQL的提示符是：mysql&gt;</pre>
<p>2、例2：连接到远程主机上的MYSQL</p>
<p><span id="more-2454"></span>假设远程主机的IP为：10.0.0.1，用户名为root,密码为123。则键入以下命令：</p>
<pre>   mysql -h10.0.0.1 -uroot -p123</pre>
<pre>  （注：u与root可以不用加空格，其它也一样）</pre>
<p>3、退出MYSQL命令</p>
<pre>   exit （回车）</pre>
<p> </p>
<p>(二) 修改密码：</p>
<pre>   格式：mysqladmin -u用户名 -p旧密码 password 新密码</pre>
<p>1、例1：给root加个密码123。首先在DOS下进入目录C:\mysql\bin，然后键入以下命令：</p>
<pre>   mysqladmin -uroot -password 123</pre>
<pre>   注：因为开始时root没有密码，所以-p旧密码一项就可以省略了。</pre>
<p>2、例2：再将root的密码改为456</p>
<pre>   mysqladmin -uroot -pab12 password 456</pre>
<p>(三) 增加新用户：（注意：和上面不同，下面的因为是MYSQL环境中的命令，所以后面都带一个分号作为命令结束符）</p>
<pre>   格式：grant select on 数据库.* to 用户名@登录主机 identified by "密码"</pre>
<pre>   例1、增加一个用户test1密码为abc，让他可以在任何主机上登录，并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入MYSQL，然后键入以下命令：
   grant select,insert,update,delete on *.* to test1@"%" Identified by "abc";

   但例1增加的用户是十分危险的，你想如某个人知道test1的密码，那么他就可以在internet上的任何一台电脑上登录你的mysql数据库并对你的数据可以为所欲为了，解决办法见例2。</pre>
<pre>   例2、增加一个用户test2密码为abc,让他只可以在localhost上登录，并可以对数据库mydb进行查询、插入、修改、删除的操作（localhost指本地主机，即MYSQL数据库所在的那台主机），这样用户即使用知道test2的密码，他也无法从internet上直接访问数据库，只能通过MYSQL主机上的web页来访问了。
   grant select,insert,update,delete on mydb.* to test2@localhost identified by "abc";</pre>
<pre>   如果你不想test2有密码，可以再打一个命令将密码消掉。
   grant select,insert,update,delete on mydb.* to test2@localhost identified by "";</pre>
<p>(四) 显示命令</p>
<p>1、显示数据库列表：</p>
<pre>   show databases;
   刚开始时才两个数据库：mysql和test。mysql库很重要它里面有MYSQL的系统信息，我们改密码和新增用户，实际上就是用这个库进行操作。</pre>
<p>2、显示库中的数据表：</p>
<pre>   use mysql； //打开库
   show tables;</pre>
<p>3、显示数据表的结构：</p>
<pre>   describe 表名;</pre>
<p>4、建库：</p>
<pre>   create database 库名;</pre>
<p>5、建表：</p>
<pre>   use 库名；
   create table 表名 (字段设定列表)；</pre>
<p>6、删库和删表:</p>
<pre>   drop database 库名;
   drop table 表名；</pre>
<p>7、将表中记录清空：</p>
<pre>   delete from 表名;</pre>
<p>8、显示表中的记录：</p>
<pre>   select * from 表名;</pre>
<pre>全局管理权限：
FILE: 在MySQL服务器上读写文件。
PROCESS: 显示或杀死属于其它用户的服务线程。
RELOAD: 重载访问控制表，刷新日志等。
SHUTDOWN: 关闭MySQL服务。
数据库/数据表/数据列权限：
ALTER: 修改已存在的数据表(例如增加/删除列)和索引。
CREATE: 建立新的数据库或数据表。
DELETE: 删除表的记录。
DROP: 删除数据表或数据库。
INDEX: 建立或删除索引。
INSERT: 增加表的记录。
SELECT: 显示/搜索表的记录。
UPDATE: 修改表中已存在的记录。
特别的权限：
ALL: 允许做任何事(和root一样)。
USAGE: 只允许登录--其它什么也不允许做。</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.helloyi.cn/index.php/2009/04/10/mysql-stock-command/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

