﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-把永恒在一刹那间收藏-文章分类-mysql</title><link>http://www.blogjava.net/gm_jing/category/13516.html</link><description>生活之点点滴滴</description><language>zh-cn</language><lastBuildDate>Sat, 04 Aug 2007 06:39:04 GMT</lastBuildDate><pubDate>Sat, 04 Aug 2007 06:39:04 GMT</pubDate><ttl>60</ttl><item><title> 快速上手 MySQL －－图形化操作详解 </title><link>http://www.blogjava.net/gm_jing/articles/108957.html</link><dc:creator>黎夕</dc:creator><author>黎夕</author><pubDate>Fri, 06 Apr 2007 07:47:00 GMT</pubDate><guid>http://www.blogjava.net/gm_jing/articles/108957.html</guid><wfw:comment>http://www.blogjava.net/gm_jing/comments/108957.html</wfw:comment><comments>http://www.blogjava.net/gm_jing/articles/108957.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gm_jing/comments/commentRss/108957.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gm_jing/services/trackbacks/108957.html</trackback:ping><description><![CDATA[【引用】 <a href="http://blog.csdn.net/javamxj/archive/2005/01/13/251861.aspx">http://blog.csdn.net/javamxj/archive/2005/01/13/251861.aspx</a><br><br><br><strong><font size=4>一、MySQL下载与安装</font></strong>
<div>&nbsp;</div>
<div>&nbsp;<strong>1、下载介绍</strong></div>
<div><strong></strong>&nbsp;</div>
<div>&nbsp;&nbsp;&nbsp; MySQL相信大家一定听说过，如果不知道它是干什么的，可以去google一下。</div>
<div>&nbsp;&nbsp;&nbsp; MySQL的大本营：<a href="http://www.mysql.com/"><u><font color=#0000ff>http://www.mysql.com/</font></u></a></div>
<div>&nbsp;&nbsp;&nbsp; MySQL的下载地址：<a href="http://dev.mysql.com/downloads/"><u><font color=#0000ff>http://dev.mysql.com/downloads/</font></u></a>&nbsp;&nbsp; 因为要从这个地址下载不少东东，所以详细分析一下这个网页。&nbsp;&nbsp; </div>
<div><img src="http://blog.csdn.net/images/blog_csdn_net/javamxj/87325/o_mysql001.jpg"></div>
<div>&nbsp;&nbsp;&nbsp; </div>
<div>&nbsp;</div>
<div>● 关于镜像网站，没有大陆的，有香港和台湾的。选择它，是为了加快下载速度，不过也不是绝对的，我经常就从北美的镜像下载，速度反而更快些。&nbsp;</div>
<div>&nbsp;</div>
<div>● MySQL数据库服务器&nbsp; 这里我选择MySQL 4.1版本。版本太低，许多新特性用不上；太高，测试还没有完善，容易出Bug。这里选择它推荐的。</div>
<div>&nbsp;</div>
<div>&nbsp;&nbsp; 点击这个链接，进入下载页面，可以看到，当前版本是4.1.8。找到&#8220;<strong>Windows downloads</strong>&#8221;，如图，因为我使用的是Windows平台。这里我选择&#8220;<strong>Without installer (unzip in C:\)&#8221;</strong>这个版本，因为我喜欢不需要安装的软件，用的不高兴，随时可以直接删除，当然需要自己配置一下才能使用。</div>
<div>&nbsp;&nbsp; 点击&#8220;Pick a mirror&#8221;,进入一个页面，那里的表格可以不填，直接选择一个链接下载它就可以了。下载后的文件名是&#8220;mysql-4.1.8-win-noinstall.zip&#8221;，大小是35.2M。</div>
<div>&nbsp;<img src="http://blog.csdn.net/images/blog_csdn_net/javamxj/87325/o_mysql002.jpg"></div>
<div>&nbsp;</div>
<div>● 关于&#8220;<strong>Graphical clients</strong>&#8221; 图形界面的客户端，选择一个吧，可以进行图形化操作，何乐而不为？只不过以前我一直用&#8220;MySQL Control Center&#8221;的，现在却不开发了。选择&#8220;MySQL Administrator&#8221;吧，下载后的文件名是&#8220;mysql-administrator-1.0.19-win-noinstall.zip&#8221;（这里我选择的是不需要安装版本），大小是4.5M。</div>
<div>&nbsp;</div>
<div>&nbsp;&nbsp; 同样也选择&#8220;MySQL Query Browser&#8221;，它是来查询的。下载后的文件名是&#8220;mysql-query-browser-1.1.5-win-noinstall.zip&#8221;（不需要安装版本），大小是4.5M。</div>
<div>&nbsp;</div>
<div>&nbsp;&nbsp; 关于这方面的软件比较多，如：MySQL-Front，EMS MySQL Manager等，比较好用，不过它们是要Money的。</div>
<div>&nbsp;</div>
<div>● &#8220;<strong>Application Programming Interfaces (APIs)</strong> &#8221; 应用程序接口&nbsp; 由于我主要是面向Java应用，所以这里就选择&#8220;<strong>MySQL Connector/J</strong> &#8221;，版本选择&#8220;MySQL Connector/J 3.0&#8221;，因为它是&#8220;Procdution&#8221;版本。下载后的文件名是&#8220;mysql-connector-java-3.0.16-ga.zip&#8221;，大小是1.2M。</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div><strong>2、安装MySQL</strong></div>
<div><strong></strong>&nbsp;</div>
<div>&nbsp;&nbsp;<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font size=3>&#183;</font></span></span> 找到下载后的mysql-4.1.8-win-noinstall.zip，解压到D盘，是一个&#8220;mysql-4.1.8-win&#8221;文件夹，这里我把它改名为&#8220;mysql&#8221;，因为我不喜欢带版本号。即这时是&#8220;D:\mysql&#8221;目录，这个目录下有一个&#8220;data&#8221;目录，这里就是存放数据的地方。为了方便备份和升级，最好把它放在其它地方。这里我在D盘新建一个目录&#8220;mysql-data&#8221;，然后把&#8220;D:\mysql&#8221;目录下的&#8220;data&#8221;子目录剪切到&#8220;D:\mysql-data&#8221;目录中。</div>
<div>&nbsp;&nbsp; </div>
<div>&nbsp;&nbsp;<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font size=3>&#183;</font></span></span>新建一个&#8220;my.ini&#8221;文件，注意后缀名是&#8220;ini&#8221;。内容如下：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<table borderColor=#000000 cellSpacing=0 cellPadding=4 width="75%" border=0>
    <tbody>
        <tr>
            <td style="BORDER-BOTTOM: rgb(51,51,204) thin inset" vAlign=top width="100%" bgColor=#d9eaf2 height=33>
            <div><font size=2><em>E:\WINDOWS\my.ini</em></font></div>
            </td>
        </tr>
        <tr>
            <td style="BORDER-TOP-STYLE: none; BORDER-TOP-COLOR: rgb(236,233,216)" vAlign=top width="100%" bgColor=#edf2b8>
            <div><font size=2>[WinMySQLAdmin]<br>&nbsp;&nbsp; <font color=#0000ff>Server</font>=D:/mysql/bin/mysqld-nt.exe<br>&nbsp;&nbsp; <br>[mysqld]<br>&nbsp;&nbsp; <font color=#0000ff>basedir</font>=D:/mysql<br>&nbsp;&nbsp; <font color=#0000ff>datadir</font>=D:/mysql-data/data</font></div>
            </td>
        </tr>
    </tbody>
</table>
</div>
<div>&nbsp; 上面&#8220;Server&#8221;指向<font size=4><font size=3>MySQL</font>的执行主程序，&#8220;basedir&#8221;指向MySQL的安装目录，&#8220;datadir&#8221;指向MySQL的数据存放目录（因为我改变了它，所以需要特别指定）。</font></div>
<div><font size=4>&nbsp; </font>然后把这个文件移动到<strong>Windows的系统安装目录</strong>下，我这里是&#8220;E:\WINDOWS&#8221;。</div>
<div>&nbsp;</div>
<div>&nbsp;&nbsp;<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font size=3>&#183;</font></span></span> 打开MS-DOS窗口，切换到&#8220;D:\mysql\bin&#8221;目录；或者把&#8220;D:\mysql\bin&#8221;添加到&#8220;环境变量&#8221;的&#8220;Path&#8221;变量中，这样可以避免切换到&#8220;D:\mysql\bin&#8221;目录。</div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font size=3>&nbsp; &#183;</font></span>加入到Windows XP的服务中：</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span lang=EN style="FONT-SIZE: 12pt; FONT-FAMILY: Arial"><font face=宋体>D:\mysql\bin&gt; <font color=#0000ff>mysqld-nt&nbsp; -install</font>&nbsp;&nbsp;</font></span></div>
<div><span lang=EN style="FONT-SIZE: 12pt; FONT-FAMILY: Arial"><font face=宋体>&nbsp;&nbsp;&nbsp;（这时打开&#8220;控制面板&#8221;-&gt;管理工具-&gt;服务：可以看到服务列表中存在&#8220;MySQL&#8221;服务，如果不希望它自动执行，可以改为手动，不用它的时候可以节省点内存）</font></span></div>
<div><span lang=EN style="FONT-SIZE: 12pt; FONT-FAMILY: Arial"><img src="http://blog.csdn.net/images/blog_csdn_net/javamxj/87325/o_mysql006.jpg"></span></div>
<div><span lang=EN style="FONT-SIZE: 12pt; FONT-FAMILY: Arial"><br><font face=宋体>&nbsp;&nbsp;<strong>&nbsp;&#183; </strong>启动和停止mysql服务<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D:\mysql\bin&gt;<font color=#0000ff>net&nbsp; start mysql</font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D:\mysql\bin&gt;<font color=#0000ff>net&nbsp; stop&nbsp; mysql</font></font></span></div>
<div><span lang=EN style="FONT-SIZE: 12pt; FONT-FAMILY: Arial"></span>&nbsp;</div>
<div><span lang=EN style="FONT-SIZE: 12pt; FONT-FAMILY: Arial"><font face=宋体><img src="http://blog.csdn.net/images/blog_csdn_net/javamxj/87325/o_mysql003.jpg"></font></span></div>
<div><span lang=EN style="FONT-SIZE: 12pt; FONT-FAMILY: Arial"><font face=宋体>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></div>
<div><span lang=EN style="FONT-SIZE: 12pt; FONT-FAMILY: Arial"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font size=3>&nbsp;&nbsp; &#183; </font></span><font face=宋体>移出mysql服务</font></span></div>
<div><span lang=EN style="FONT-SIZE: 12pt; FONT-FAMILY: Arial"><font face=宋体>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=#0000ff>mysqld-nt --remove</font></font></span></div>
<div><span lang=EN style="FONT-SIZE: 12pt; FONT-FAMILY: Arial"><font face=宋体>&nbsp;&nbsp; （如果你不再需要MySQL了，先停止MySQL服务，然后再移出MySQL服务，最后删除MySQL安装目录即可）</font></span></div>
<div><span lang=EN style="FONT-SIZE: 12pt; FONT-FAMILY: Arial"><font face=宋体></font></span>&nbsp;</div>
<div><span lang=EN style="FONT-SIZE: 12pt; FONT-FAMILY: Arial"><font face=宋体></font></span>&nbsp;</div>
<div><span lang=EN style="FONT-SIZE: 12pt; FONT-FAMILY: Arial"><font face=宋体></font></span>&nbsp;</div>
<div><span lang=EN style="FONT-SIZE: 12pt; FONT-FAMILY: Arial"></span><strong><font size=4>二、基本操作</font></strong>&nbsp;&nbsp; </div>
<div>&nbsp;</div>
<div>● <strong>准备工作</strong></div>
<div>&nbsp;</div>
<div>&nbsp; 在D盘建立一个mysql-software的目录，把刚才下载的 mysql-administrator-1.0.19-win-noinstall.zip 复制到这个子目录中，解压，得到一个 MySQL Administrator 1.0 的目录。</div>
<div>&nbsp; 同样如此操作 mysql-query-browser-1.1.5-win-noinstall.zip，得到一个 MySQL Query Browser 1.1 的目录。</div>
<div>&nbsp;&nbsp; </div>
<div>&nbsp;</div>
<div>● <strong>启动服务</strong>：</div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font size=3>&#183;</font></span></span>&nbsp;双击D:\mysql-software\MySQL Administrator 1.0 目录下的 MySQLSystemTrayMonitor.exe，这时会在任务栏右侧出现一个图标。点击&#8220;Start Instance&#8221;,运行MySQL。</div>
<div><img src="http://blog.csdn.net/images/blog_csdn_net/javamxj/87325/o_mysql008.jpg"></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font size=3>&#183; </font></span></span>然后双击 D:\mysql-software\MySQL Administrator 1.0 目录中的 MySQLAdministrator.exe，或者直接点击上面右键菜单中的&#8220;MySQL Administrator &#8221;：</div>
<div><img src="http://blog.csdn.net/images/blog_csdn_net/javamxj/87325/o_mysql007.jpg"></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font size=3>&#183;</font></span></span> 创建一个连接名，可以随便填，这里是&#8220;mxj&#8221;，用户名：root，密码空着。这是因为mysql默认有一个没有密码的root帐号。点击&#8220;OK&#8221;，出现管理窗口：</div>
<div><img src="http://blog.csdn.net/images/blog_csdn_net/javamxj/87325/o_mysql009.jpg"></div>
<div>这没什么好说的，英文也很简单。只谈谈上面勾选的两项。</div>
<div>&nbsp;</div>
<div>● <strong>更改密码</strong></div>
<div><img src="http://blog.csdn.net/images/blog_csdn_net/javamxj/87325/o_mysql010.jpg"></div>
<div>好了，我的root帐号的密码设置为：javamxj&nbsp;&nbsp; 最后，点击&#8220;Apply Change&#8221;。</div>
<div>&nbsp;</div>
<div>● 初始的数据库</div>
<div><img src="http://blog.csdn.net/images/blog_csdn_net/javamxj/87325/o_mysql011.jpg"></div>
<div>&nbsp; 上图可以看到，初始有两个数据库，mysql库中含有各种配置信息，不要在这个库中进行表操作。</div>
<div>test库初始是空的。<em>另外，建立表时，不要和mysql库中的表名取名相同，以免冲突</em>。</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>● <strong>数据创建与查询（兼谈谈字符编码）</strong></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font size=3>&#183;</font></span></span>现在来到查询浏览器，还是右击右下角&#8220;MySQL System Tray Monitor&#8221;图标，从中选择&#8220;MySQL Query Browser&#8221;，因为已经更改过root的密码，所以要填入新密码。</div>
<div><img src="http://blog.csdn.net/images/blog_csdn_net/javamxj/87325/o_mysql012.jpg"></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font size=3>&#183;</font></span></span> 进入主界面，右击test数据库，创建一个新表。</div>
<div><img src="http://blog.csdn.net/images/blog_csdn_net/javamxj/87325/o_mysql013.jpg">&nbsp;</div>
<div><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font size=3></font></span></span>&nbsp;</div>
<div><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font size=3>&#183;&nbsp; </font></span></span>如下简单创建一个表</div>
<div><img src="http://blog.csdn.net/images/blog_csdn_net/javamxj/87325/o_mysql014.jpg"></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font size=3>&#183; </font></span></span>切换到&#8220;Table Options&#8221;：</div>
<div><img src="http://blog.csdn.net/images/blog_csdn_net/javamxj/87325/o_mysql015.jpg"></div>
<div>&nbsp;&nbsp; 如果了解数据库的话，这些应该是很熟悉的，不多说了。注意字符设置默认是&#8220;Latin1&#8221;（保存改变，再次切换到这一栏，就能看到了）。</div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font size=3>&#183; </font></span></span>填入一些测试数据：</div>
<div><img src="http://blog.csdn.net/images/blog_csdn_net/javamxj/87325/o_mysql016.jpg"></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font size=3>&#183; </font></span></span>关闭&#8220;MySQL Query Browser&#8221;，再重新打开它，切换到testtable表，看到了没有？刚才输入的中文变成了&#8220;？？？？？？&#8221;，为什么呢？ 再次切换到&#8220;Table Options&#8221;：</div>
<div><img src="http://blog.csdn.net/images/blog_csdn_net/javamxj/87325/o_mysql017.jpg"></div>
<div>&nbsp;知道为什么了吧，原来默认字符是&#8220;latin1&#8221;，因为MySQL是瑞典一家公司的产品。中国人看来要努力了！</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">● </span>解决方法：</div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font size=3>&#183; </font></span></span>停止MySql服务，关闭所有与MySql相关的程序，打开<strong>Windows的系统安装目录</strong>下的 my.ini 文件，如下修改：</div>
<div>
<table borderColor=#000000 cellSpacing=0 cellPadding=4 width="75%" border=0>
    <tbody>
        <tr>
            <td style="BORDER-BOTTOM: rgb(51,51,204) thin inset" vAlign=top width="100%" bgColor=#d9eaf2 height=33>
            <div><font size=2><em>E:\WINDOWS\my.ini</em></font></div>
            </td>
        </tr>
        <tr>
            <td style="BORDER-TOP-STYLE: none; BORDER-TOP-COLOR: rgb(236,233,216)" vAlign=top width="100%" bgColor=#edf2b8>
            <div><font size=2>[WinMySQLAdmin]<br>&nbsp;&nbsp; <font color=#0000ff>Server</font>=D:/mysql/bin/mysqld-nt.exe<br>&nbsp;&nbsp; <br>[mysqld]<br>&nbsp;&nbsp; <font color=#0000ff>basedir</font>=D:/mysql<br>&nbsp;&nbsp; <font color=#0000ff>datadir</font>=D:/mysql-data/data</font></div>
            <div>&nbsp;&nbsp; <font size=2><font color=#0000ff>default-character-set</font>=gbk<br>&nbsp;&nbsp; <br>[client]<br>&nbsp;&nbsp; <font color=#0000ff>default-character-set</font>=gbk</font></div>
            </td>
        </tr>
    </tbody>
</table>
</div>
<div>添加的两条语句的含义是在客户端和服务端都使用GBK字符集进行编码。</div>
<div>&nbsp;</div>
<div>保存后，重新激活 MySql 服务，打开&#8220;MySQL Query Browser&#8221;，再次创建一个表，输入中文，一切OK！</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div><strong><font size=4>后记</font></strong>&nbsp;&nbsp; </div>
<div>&nbsp;</div>
<div>&nbsp;&nbsp;&nbsp;关于在DOS端如何用命令行进行 MySQL 的操作，这里就不谈了，网上这方面的资料很多。图形界面进行 MySQL 操作的软件还有很多，不过大多数是需要破费的。自己看着用吧。</div>
<div></div>
<div>&nbsp;&nbsp;&nbsp;至于 mysql-connector-java-3.0.16-ga.zip 这个文件，在以后开发 EJB 的时候会用到的，到时再说。</div>
<br><br><br>
<img src ="http://www.blogjava.net/gm_jing/aggbug/108957.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gm_jing/" target="_blank">黎夕</a> 2007-04-06 15:47 <a href="http://www.blogjava.net/gm_jing/articles/108957.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>InnoDB 表的限制</title><link>http://www.blogjava.net/gm_jing/articles/64323.html</link><dc:creator>黎夕</dc:creator><author>黎夕</author><pubDate>Fri, 18 Aug 2006 05:48:00 GMT</pubDate><guid>http://www.blogjava.net/gm_jing/articles/64323.html</guid><wfw:comment>http://www.blogjava.net/gm_jing/comments/64323.html</wfw:comment><comments>http://www.blogjava.net/gm_jing/articles/64323.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gm_jing/comments/commentRss/64323.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gm_jing/services/trackbacks/64323.html</trackback:ping><description><![CDATA[
		<li>
				<font face="Verdana, Arial, Helvetica, sans-serif">在 &lt; 3.23.50 版本的 InnoDB 中，不可以使用 <code>ALTER TABLE</code> 或 <code>CREATE INDEX</code> 来修改一个已经有了外键约束或参考了外键约束的表。使用 <code>DROP TABLE</code> 和 <code>CREATE TABLE</code> 来代替它。</font>
		</li>
		<li>不可以将 <font face="Verdana, Arial, Helvetica, sans-serif">MySQL 系统表(如 <code>'user'</code> 或 <code>'host'</code> )转换成 InnoDB 类型。系统表必须总是为 MyISAM 类型的。</font></li>
		<li>
				<font face="Verdana, Arial, Helvetica, sans-serif">InnoDB 表不支持全文搜索(fulltext search)。 </font>
		</li>
		<li>
				<font face="Verdana, Arial, Helvetica, sans-serif">MySQL 以自动提交模式(autocommit mode)执行复制(replication)。因此slave中的 consistent reads 可能看起来你部分处理过的事务，所以在 slave 中这种读取(read)并不是真正的 consistent 。这个限制在 3.23.52 不再存在。</font>
		</li>
		<li>
				<font face="Verdana, Arial, Helvetica, sans-serif">InnoDB 在内部不保存一个表记录总数，这是由于 multiversioning 的原因使它实现有点复杂。</font>
				<font face="Verdana, Arial, Helvetica, sans-serif">为了响应一个查询 <code>SELECT COUNT(*) FROM T</code> ，InnoDB 不得不扫描表的一个索引，如果表没有完全在缓冲池中这将花费一些时间。 为了得到更快的计数你不得不使用自己创建一个计数表，让你的应用程序在插入与删除时自己更新它。 消除因锁等待引起的瓶颈的一个方法就是创建整体的计数器集。应用程序可以随机地每次选择一个。 为了得到计数，仅仅只要对计数器求和：<code>SELECT SUM(counter_column) FROM your_counter_table</code>。 </font>
		</li>
		<li>
				<font face="Verdana, Arial, Helvetica, sans-serif">表中有 auto-increment 列的必须为它定义一个键，这个键必须仅仅包含这个 auto-increment 列。InnoDB 不支持在一个 <code>CREATE TABLE</code> 语句中使用 <code>AUTO_INCREMENT=...</code> 。这个子句是为了给一个 auto-increment 列设置第一个值(默认的第一个值为 1)。工作区(Workaround)：向自增列中插入一个指定的值做为第一个值。从此，InnoDB 将从这值开始增加。</font>
		</li>
		<li>
				<font face="Verdana, Arial, Helvetica, sans-serif">
						<code>SHOW TABLE STATUS</code> 不能给出 InnoDB 表的精密统计数据，除了由表保留的物理大小之外。记录行数只能通过一个优化的 SQL 来获得大致的估计。</font>
		</li>
		<li>
				<font face="Verdana, Arial, Helvetica, sans-serif">在 MySQL 中复制(replication)中，<code>load table from master</code> 仍然不能在 InnoDB 表中工作。 在主(master)服务器中开设一个工作区(workaround )用于将表转换成 MyISAM 型，然后再进行 load，之后再在 master 中将表改回 InnoDB 类型。</font>
		</li>
		<li>
				<font face="Verdana, Arial, Helvetica, sans-serif">如果以一个列的前面部分建立索引：</font>
				<pre>
						<font face="Verdana, Arial, Helvetica, sans-serif">
								<code>CREATE TABLE T (A CHAR(20), B INT, INDEX T_IND (A(5))) TYPE = InnoDB;</code>
						</font>
				</pre>
				<font face="Verdana, Arial, Helvetica, sans-serif">InnoDB 将内在的在整个列上建立一个索引，而不是仅以设定的首部分。</font>
		</li>
		<li>
				<font face="Verdana, Arial, Helvetica, sans-serif">InnoDB 表不支持 <code>INSERT DELAYED</code> 。</font>
		</li>
		<li>
				<font face="Verdana, Arial, Helvetica, sans-serif">MySQL 的 <code>LOCK TABLES</code> 操作无法知道一个 SQL 语句已完成对 InnoDB 的行锁定：这就意味着即使已有其它用户的事务在同一张表上设置了行锁，你仍然会锁定该表。 所以你在这张表上的操作与其它用户的锁定冲突则不得不等待。同样死锁也是可能的。无论如何， 这能事务完整性(transaction integrity)并不危险，因为 InnoDB 设置的行级锁定通常会照顾完整性(integrity)的。同样，一个表级锁定可以防止其它事务在表上获得更多的行级锁定(锁定模式不一致)。</font>
		</li>
		<li>
				<font face="Verdana, Arial, Helvetica, sans-serif">在 <code>BLOB</code> 或 <code>TEXT</code> 字段上无法设置索引。</font>
		</li>
		<li>
				<font face="Verdana, Arial, Helvetica, sans-serif">一张表不可以有超过 1000 个字段。 </font>
		</li>
		<li>
				<font face="Verdana, Arial, Helvetica, sans-serif">
						<code>DELETE FROM TABLE</code> 除了删除所有记录行之外不再重建表，一个接一个地删除，这并不那么快。在将来的 MySQL 版本中可以使用 <code>TRUNCATE</code> ，这是相当快的。</font>
		</li>
		<li>
				<font face="Verdana, Arial, Helvetica, sans-serif">在 &lt;= 3.23.43 的 InnoDB 中，在对 InnoDB 表调用 <code>DROP DATABASE</code> 之前，必须调用 <code>DROP TABLE</code> 来移除(drop) 个体的 InnoDB 表。这个限制在 &gt;= 3.23.44 的版本中不再存在。</font>
		</li>
		<li>
				<font face="Verdana, Arial, Helvetica, sans-serif">InnoDB 默认的数据库页面大小为 16 kB。通过重新编译源代码可以设置为 8 kB 到 64 kB。你必须在 <tt>univ.i</tt> 中更新 <code>UNIV_PAGE_SIZE</code> 和 <code>UNIV_PAGE_SIZE_SHIFT</code> 。在版本 &lt;= 3.23.39a 的 InnoDB中，最大记录行长度为比数据库页面长度的一半稍小点。从源释放版本 3.23.39b (但是在</font>
				<font face="Verdana, Arial, Helvetica, sans-serif"> MySQL -Max 3.23.40 二进制释放版本中仍然没有)开始， BLOB 和 TEXT 字段允许 &lt; 4 GB，整个行长度同样 &lt; 4 GB。InnoDB 不在分开的页面中存储尺寸 &lt;= 128 bytes 的字段。在 InnoDB 通过将长字段存储在分开的页面上修改记录后，剩余的记录行长度必须小于数据库页面的一半。最大键长为 500 bytes。 </font>
		</li>
		<li>日志文件的总尺寸必须<font face="Verdana, Arial, Helvetica, sans-serif"> &lt; 4 GB。 </font></li>
		<li>
				<font face="Verdana, Arial, Helvetica, sans-serif">最大表空间尺寸为数据库页面的 4 十亿(billion)倍。这同样也是一个表的最大尺寸。最小表空间为 10 MB。</font>
		</li>
<img src ="http://www.blogjava.net/gm_jing/aggbug/64323.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gm_jing/" target="_blank">黎夕</a> 2006-08-18 13:48 <a href="http://www.blogjava.net/gm_jing/articles/64323.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mysql开发中的外键与参照完整性</title><link>http://www.blogjava.net/gm_jing/articles/64322.html</link><dc:creator>黎夕</dc:creator><author>黎夕</author><pubDate>Fri, 18 Aug 2006 05:45:00 GMT</pubDate><guid>http://www.blogjava.net/gm_jing/articles/64322.html</guid><wfw:comment>http://www.blogjava.net/gm_jing/comments/64322.html</wfw:comment><comments>http://www.blogjava.net/gm_jing/articles/64322.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gm_jing/comments/commentRss/64322.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gm_jing/services/trackbacks/64322.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="98%" border="0">
				<tbody>
						<tr>
								<td class="title_td">
										<font size="3">
												<strong>Mysql开发中的外键与参照完整性</strong>
										</font>
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="0" width="98%" border="0">
				<tbody>
						<tr>
								<td height="6">
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="0" border="0">
				<tbody>
						<tr>
								<td align="middle">
										<table cellspacing="0" cellpadding="0" width="548" border="0">
												<tbody>
														<tr>
																<td align="middle" colspan="4">
																		<div align="center">[ 作者:  加入时间:2006-06-24 12:31:18  来自: ]</div>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="0" width="548" border="0">
				<tbody>
						<tr>
								<td background="/images/title_line.gif" height="3">
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="0" width="548" border="0">
				<tbody>
						<tr>
								<td height="12">
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="0" width="548" border="0">
				<tbody>
						<tr>
								<td width="8">
								</td>
								<td>
										<font class="f14" id="zoom">
												<font color="#000000">
														<p>参照完整性(Referential integrity)是数据库设计中一个重要的概念。在系统不同的列表中，当数据库所有参照合法或非合法关联时都会涉及到参照完整性。当参照完整性存在时，任何与不存在记录的关联将变得无效化，由此可防止用户出现各种错误，从而提供更为准确和实用的数据库。 </p>
														<p>参照完整性通常通过外键(foreign key)的使用而被广泛应用。长久以来，流行工具开源RDBMS MySQL并没有支持外键，原因是这种支持将会降低RDBMS的速度和性能。然而，由于很多用户对参照完整性的优点倍感兴趣，最近MySQL的不同版本都通过新InnoDB列表引擎支持外键。由此，在数据库组成的列表中保持参照完整性将变得非常简单。 </p>
														<p>为了建立两个MySQL表之间的一个外键关系，必须满足以下三种情况： </p>
														<p>两个表必须是InnoDB表类型。 </p>
														<p>使用在外键关系的域必须为索引型(Index)。 </p>
														<p>使用在外键关系的域必须与数据类型相似。 </p>
														<p>例子是理解以上要点的最好方法。如表A所示，建立两个表，其中一个列出动物种类及相应的代码(表名为：species)，另一表列出动物园中的动物(表名为：zoo)。现在，我们想通过species关联这两个表，所以我们只需要接受和保存zoo表中包含species表中的合法动物的入口到数据库中。 </p>
														<p>表A </p>
														<p>mysql&gt; CREATE TABLE species (id TINYINT NOT NULL AUTO_INCREMENT, name VARCHAR(50) NOT NULL, PRIMARY KEY(id)) ENGINE=INNODB; </p>
														<p>Query OK, 0 rows affected (0.11 sec) </p>
														<p>mysql&gt; INSERT INTO species VALUES (1, 'orangutan'), (2, 'elephant'), (3, 'hippopotamus'), (4, 'yak'); </p>
														<p>Query OK, 4 rows affected (0.06 sec) </p>
														<p>Records: 4 Duplicates: 0 Warnings: 0 </p>
														<p>mysql&gt; CREATE TABLE zoo (id INT(4) NOT NULL, name VARCHAR(50) NOT NULL, FK_species TINYINT(4) NOT NULL, INDEX (FK_species), FOREIGN KEY (FK_species) REFERENCES species (id), PRIMARY KEY(id)) ENGINE=INNODB; </p>
														<p>注意:对于非InnoDB表， FOREIGN KEY 语句将被忽略。 </p>
														<p>现在，fieldszoo.species与species.id 之间存在一个外键关系。只有相应的zoo.specie与species.idfield的一个值相匹配，动物表中的入口才可被访问。以下的输出即演示了当你想输入一个Harry Hippopotamus记录，而使用到不合法的species代码： </p>
														<p>mysql&gt; INSERT INTO zoo VALUES (1, 'Harry', 5); </p>
														<p>ERROR 1216 (23000): Cannot add or update a child row: a foreign key constraint fails </p>
														<p>这里，MySQL核查species表以查看species代码是否存在，如果发现不存在，就拒绝该记录。当你输入正确代码的，可以与以上做比较。 </p>
														<p>mysql&gt; INSERT INTO zoo VALUES (1, 'Harry', 3); </p>
														<p>Query OK, 1 row affected (0.06 sec) </p>
														<p>这里，MySQL核查species表以查看species代码是否存在，当发现存在，允许记录保存在zoo表中。 </p>
														<p>为了删除一个外键关系，首先使用SHOW CREATE TABLE找出InnoDB的内部标签，如表B所示： </p>
														<p>表 B </p>
														<p>+-------+---------------------------------------------------+ </p>
														<p>| Table | Create Table | </p>
														<p>+-------+---------------------------------------------------+ </p>
														<p>| zoo | CREATE TABLE `zoo` ( </p>
														<p>`id` int(4) NOT NULL default '0', </p>
														<p>`name` varchar(50) NOT NULL default '', </p>
														<p>`FK_species` tinyint(4) NOT NULL default '0', </p>
														<p>KEY `FK_species` (`FK_species`), </p>
														<p>CONSTRAINT `zoo_ibfk_1` FOREIGN KEY (`FK_species`) </p>
														<p>REFERENCES `species` (`id`) </p>
														<p>) ENGINE=InnoDB DEFAULT CHARSET=latin1 | </p>
														<p>+-------+----------------------------------------------------+ </p>
														<p>然后使用带有DROP FOREIGN KEY 语句的ALTER TABLE命令，如以下： </p>
														<p>mysql&gt; ALTER TABLE zoo DROP FOREIGN KEY zoo_ibfk_1; </p>
														<p>Query OK, 1 row affected (0.11 sec) </p>
														<p>Records: 1 Duplicates: 0 Warnings: 0 </p>
														<p>为了将一个外键添加到一个现成的表中，使用ADD FOREIGN KEY的 ALTER TABLE语句指定合适的域作为一个外键： </p>
														<p>mysql&gt; ALTER TABLE zoo ADD FOREIGN KEY (FK_species) REFERENCES species (id); </p>
														<p>Query OK, 1 rows affected (0.11 sec) </p>
														<p>Records: 1 Duplicates: 0 Warnings: 0 </p>
														<p>如以上例子解释的，外键在捉摸数据入口错误上起着重要的作用，由此可建立更为强健更加集成的数据库。另一方面值得提到的是，执行外键核实是内部资料处理的过程，且不同表之间指定复杂的内部关系可以导致数据库的性能下降。所以，在参照完整性与性能考虑之间找到平衡点相当重要，而使用外键就是能够确保性能与稳健之间的最优结合。</p>
												</font>
										</font>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/gm_jing/aggbug/64322.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gm_jing/" target="_blank">黎夕</a> 2006-08-18 13:45 <a href="http://www.blogjava.net/gm_jing/articles/64322.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySql常用命令</title><link>http://www.blogjava.net/gm_jing/articles/64107.html</link><dc:creator>黎夕</dc:creator><author>黎夕</author><pubDate>Thu, 17 Aug 2006 05:57:00 GMT</pubDate><guid>http://www.blogjava.net/gm_jing/articles/64107.html</guid><wfw:comment>http://www.blogjava.net/gm_jing/comments/64107.html</wfw:comment><comments>http://www.blogjava.net/gm_jing/articles/64107.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gm_jing/comments/commentRss/64107.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gm_jing/services/trackbacks/64107.html</trackback:ping><description><![CDATA[<p _extended="true"><font face=宋体 _extended="true">有很多朋友虽然安装好了mysql但却不知如何使用它。在这篇文章中我们就从连接mysql、<br _extended="true">修改密码、增加用户等方面来学习一些mysql的常用命令。</font></p>
<p _extended="true"><font face=宋体 _extended="true">一、连接mysql。<br _extended="true">格式： mysql -h主机地址 -u用户名 －p用户密码<br _extended="true">1、 例1：连接到本机上的mysql。<br _extended="true">首先在打开DOS窗口，然后进入目录mysqlMin，再键入命令mysql -uroot -p， 回<br _extended="true">车后提示你输密码，如果刚安装好mysql，超级用户root是没有密码的，故直接回<br _extended="true">车即可进入到mysql中了，mysql的提示符是：mysql&gt;<br _extended="true">2、例2：连接到远程主机上的mysql。假设远程主机的IP为：110.110.110.110，用户<br _extended="true">名为root,密码为abcd123。则键入以下命令：<br _extended="true">mysql -h110.110.110.110 -uroot -pabcd123<br _extended="true">（注:u与root可以不用加空格，其它也一样）<br _extended="true">3、 退出mysql命令：exit（回车）</font></p>
<p _extended="true"><font face=宋体 _extended="true">二、修改密码。<br _extended="true">格式：mysqladmin -u用户名 -p旧密码 password 新密码<br _extended="true">1、例1：给root加个密码ab12。首先在DOS下进入目录mysqlbin，然后键入以下命令<br _extended="true">mysqladmin -uroot password ab12<br _extended="true">注：因为开始时root没有密码，所以-p旧密码一项就可以省略了。<br _extended="true">2、 例2：再将root的密码改为djg345。<br _extended="true">mysqladmin -uroot -pab12 password djg345<br _extended="true">另一种方法：<br _extended="true">shell&gt;mysql -u root -p<br _extended="true">mysql&gt;SET PASSWORD FOR root=PASSWORD("root");</font></p>
<p _extended="true"><font face=宋体 _extended="true">三、增加新用户。（注意：和上面不同，下面的因为是mysql环境中的命令，所以后面都带<br _extended="true">一个分号作为命令结束符）<br _extended="true">格式：grant select on 数据库.* to 用户名@登录主机 identified by "密码"<br _extended="true">例1、增加一个用户test1密码为abc，让他可以在任何主机上登录，并对所有数据库有<br _extended="true">查询、插入、修改、删除的权限。首先用以root用户连入mysql，然后键入以下命<br _extended="true">令：<br _extended="true">grant select,insert,update,delete on *.* to test1@"%" Identified<br _extended="true">by "abc";<br _extended="true">但例1增加的用户是十分危险的，你想如某个人知道test1的密码，那么他就可以在<br _extended="true">internet上的任何一台电脑上登录你的mysql数据库并对你的数据可以为所欲为了，<br _extended="true">解决办法见例2。<br _extended="true">例2、增加一个用户test2密码为abc,让其只可以在localhost上登录，并可以对数据库<br _extended="true">mydb进行查询、插入、修改、删除的操作（localhost指本地主机，即mysql数据<br _extended="true">库所在的那台主机），这样用户即使用知道test2的密码，也无法从internet上直<br _extended="true">接访问数据库，只能通过mysql主机上的web页来访问了。<br _extended="true">grant select,insert,update,delete on mydb.* to test2@localhost<br _extended="true">identified by "abc";<br _extended="true">如果你不想test2有密码，可以再打一个命令将密码消掉。<br _extended="true">grant select,insert,update,delete on mydb.* to test2@localhost<br _extended="true">identified by "";</font></p>
<p _extended="true"><font face=宋体 _extended="true"><br _extended="true">有关数据库方面的操作。注意：你必须首先登录到mysql中，以下操作都是在mysql的提<br _extended="true">示符下进行的，而且每个命令以分号结束。</font></p>
<p _extended="true">一、操作技巧<br _extended="true">1、如果你打命令时，回车后发现忘记加分号，你无须重打一遍命令，只要打个分号回<br _extended="true">车就可以了。也就是说你可以把一个完整的命令分成几行来打，完后用分号作结束<br _extended="true">标志就OK。</p>
<p _extended="true"><br _extended="true">二、显示命令<br _extended="true">1、 显示数据库列表。<br _extended="true">show databases;<br _extended="true">刚开始时才两个数据库：mysql和test。 mysql库很重要它里面有mysql的系统信息，<br _extended="true">我们改密码和新增用户，实际上就是用这个库进行操作。<br _extended="true">2、 显示库中的数据表：<br _extended="true">use mysql； ／／打开库，学过FOXBASE的一定不会陌生吧<br _extended="true">show tables;<br _extended="true">3、 显示数据表的结构：<br _extended="true">describe 表名;<br _extended="true">4、 建库：<br _extended="true">create database 库名;<br _extended="true">5、 建表：<br _extended="true">use 库名；<br _extended="true">create table 表名(字段设定列表)；<br _extended="true">6、 删库和删表:<br _extended="true">drop database 库名;<br _extended="true">drop table 表名；<br _extended="true">7、 将表中记录清空：<br _extended="true">delete from 表名;<br _extended="true">8、 显示表中的记录：<br _extended="true">select * from 表名;</p>
<p _extended="true">三、一个建库和建表以及插入数据的实例<br _extended="true">drop database if exists school; //如果存在SCHOOL则删除<br _extended="true">create database school; //建立库SCHOOL<br _extended="true">use school; //打开库SCHOOL<br _extended="true">create table teacher //建立表TEACHER<br _extended="true">(<br _extended="true">id int(3) auto_increment not null primary key,<br _extended="true">name char(10) not null,<br _extended="true">address varchar(50) default '深圳',<br _extended="true">year date<br _extended="true">); //建表结束<br _extended="true">//以下为插入字段<br _extended="true">insert into teacher values('','glchengang','深圳一中','1976-10-10');<br _extended="true">insert into teacher values('','jack','深圳一中','1975-12-23');</p>
<p _extended="true">注：在建表中<br _extended="true">(1) 将ID设为长度为3的数字字段:int(3)，并让它每个记录自动加一: auto_increment，<br _extended="true">并不能为空:not null，而且让它成为主字段primary key<br _extended="true">(2) 将NAME设为长度为10的字符字段<br _extended="true">(3) 将ADDRESS设为长度50的字符字段，而且缺省值为深圳。varchar和char有什么区别<br _extended="true">呢，只有等以后的文章再说了。<br _extended="true">(4) 将YEAR设为日期字段。<br _extended="true">如果你在mysql提示符键入上面的命令也可以，但不方便调试。你可以将以上命令<br _extended="true">原样写入一个文本文件中假设为school.sql，然后复制到c:下，并在DOS状态进入目录<br _extended="true">mysqlin，然后键入以下命令：<br _extended="true">mysql -uroot -p密码 &lt; c:school.sql<br _extended="true">如果成功，空出一行无任何显示；如有错误，会有提示。（以上命令已经调试，你<br _extended="true">只要将//的注释去掉即可使用）。</p>
<p _extended="true">四、将文本数据转到数据库中<br _extended="true">1、文本数据应符合的格式：字段数据之间用tab键隔开，null值用来代替。例：<br _extended="true">3 rose 深圳二中 1976-10-10<br _extended="true">4 mike 深圳一中 1975-12-23<br _extended="true">2、 数据传入命令load data local infile "文件名" into table 表名;<br _extended="true">注意：你最好将文件复制到mysqlin目录下，并且要先用use命令选表所在的库。</p>
<p _extended="true">五、导出和导入数据：(命令在DOS的mysqlin目录下执行)<br _extended="true">导出表<br _extended="true">mysqldump --opt school &gt; school.sql<br _extended="true">注释：将数据库school中的表全部备份到school.sql文件，school.sql是一个文本文件，<br _extended="true">文件名任取，打开看看你会有新发现。<br _extended="true">mysqldump --opt school teacher student &gt; school.teacher.student.sql<br _extended="true">注释：将数据库school中的teacher表和student表备份到school.teacher.student.sql文<br _extended="true">件，school.teacher.student.sql是一个文本文件，文件名任取，打开看看你会有新发现。</p>
<p _extended="true">导入表<br _extended="true">mysql<br _extended="true">mysql&gt;create database school;<br _extended="true">mysql&gt;use school;<br _extended="true">mysql&gt;source school.sql;<br _extended="true">(或将school.sql换为school.teacher.sql / school.teacher.student.sql)</p>
<p _extended="true">导出数据库<br _extended="true">mysqldump --databases db1 db2 &gt; db1.db2.sql<br _extended="true">注释：将数据库dbl和db2备份到db1.db2.sql文件，db1.db2.sql是一个文本文件，文件名<br _extended="true">任取，打开看看你会有新发现。<br _extended="true">(举个例子：<br _extended="true">mysqldump -h host -u user -p pass --databases dbname &gt; file.dump<br _extended="true">就是把host上的以名字user，口令pass的数据库dbname导入到文件file.dump中。)</p>
<p _extended="true">导入数据库<br _extended="true">mysql &lt; db1.db2.sql</p>
<p _extended="true">复制数据库<br _extended="true">mysqldump --all-databases &gt; all-databases.sql<br _extended="true">注释：将所有数据库备份到all-databases.sql文件，all-databases.sql是一个文本文件，<br _extended="true">文件名任取。</p>
<p _extended="true">导入数据库<br _extended="true">mysql<br _extended="true">mysql&gt;drop database a;<br _extended="true">mysql&gt;drop database b;<br _extended="true">mysql&gt;drop database c;<br _extended="true">...<br _extended="true">mysql&gt;source all-databases.sql; (或exit退出mysql后 mysql &lt; all-databases.sql)</p>
<p _extended="true">后记：<br _extended="true">其实mysql的对数据库的操作与其它的SQL类数据库大同小异，您最好找本将SQL的书看<br _extended="true">看。我在这里只介绍一些基本的，其实我也就只懂这些了，呵呵。<br _extended="true">最好的mysql教程还是"晏子"译的"mysql中文参考手册"。不仅免费，每个相关网站都有<br _extended="true">下载，而且它是最权威的。可惜不象"PHP4中文手册"那样是chm的格式，在查找函数命令的<br _extended="true">时候不太方便。</p>
<p _extended="true">3.打开数据库：use dbname；<br _extended="true">显示所有数据库：show databases;<br _extended="true">显示数据库mysql中所有的表：先use mysql；然后show tables;<br _extended="true">显示表的列信息：describe user;(显示表mysql数据库中user表的信息）；</p>
<p _extended="true">4.创建一个可以从任何地方连接服务器的一个完全的超级用户，但是必须使用一个口令something做这个<br _extended="true">GRANT ALL PRIVILEGES ON *.* TO monty@localhost IDENTIFIED BY 'something' WITH GRANT OPTION;<br _extended="true">GRANT ALL PRIVILEGES ON *.* TO monty@"%" IDENTIFIED BY 'something' WITH GRANT OPTION;</p>
<p _extended="true">5.删除授权：<br _extended="true">REVOKE ALL PRIVILEGES ON *.* FROM root@"%";<br _extended="true">USE mysql;<br _extended="true">DELETE FROM user WHERE User="root" and Host="%";<br _extended="true">FLUSH PRIVILEGES;</p>
<p _extended="true">6. 创建一个用户custom在特定客户端weiqiong.com登录，可访问特定数据库bankaccount<br _extended="true">mysql&gt; GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON bankaccount.*<br _extended="true">TO custom@weiqiong.com IDENTIFIED BY 'stupid';</p>
<p _extended="true">7.重命名表:<br _extended="true">ALTER TABLE t1 RENAME t2;</p>
<p _extended="true">为了改变列a，从INTEGER改为TINYINT NOT NULL(名字一样)，<br _extended="true">并且改变列b，从CHAR(10)改为CHAR(20)，同时重命名它，从b改为c:<br _extended="true">ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);</p>
<p _extended="true">增加一个新TIMESTAMP列，名为d：<br _extended="true">ALTER TABLE t2 ADD d TIMESTAMP;</p>
<p _extended="true">在列d上增加一个索引，并且使列a为主键：<br _extended="true">ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a);</p>
<p _extended="true">删除列c：<br _extended="true">ALTER TABLE t2 DROP COLUMN c;</p>
<p _extended="true">增加一个新的AUTO_INCREMENT整数列，命名为c：<br _extended="true">ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,ADD INDEX (c);<br _extended="true">注意，我们索引了c，因为AUTO_INCREMENT柱必须被索引，并且另外我们声明c为NOT NULL，<br _extended="true">因为索引了的列不能是NULL。</p>
<p _extended="true">8.删除记录:<br _extended="true">DELETE FROM t1 WHERE C&gt;10;</p>
<p _extended="true">6.改变某几行:<br _extended="true">UPDATE t1 SET user=weiqiong,password=weiqiong;</p>
<p _extended="true">7.使用name列的头10个字符创建一个索引:<br _extended="true">CREATE INDEX part_of_name ON customer (name(10));</p>
<img src ="http://www.blogjava.net/gm_jing/aggbug/64107.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gm_jing/" target="_blank">黎夕</a> 2006-08-17 13:57 <a href="http://www.blogjava.net/gm_jing/articles/64107.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL服务维护笔记</title><link>http://www.blogjava.net/gm_jing/articles/60484.html</link><dc:creator>黎夕</dc:creator><author>黎夕</author><pubDate>Fri, 28 Jul 2006 02:00:00 GMT</pubDate><guid>http://www.blogjava.net/gm_jing/articles/60484.html</guid><wfw:comment>http://www.blogjava.net/gm_jing/comments/60484.html</wfw:comment><comments>http://www.blogjava.net/gm_jing/articles/60484.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gm_jing/comments/commentRss/60484.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gm_jing/services/trackbacks/60484.html</trackback:ping><description><![CDATA[
		<h2 class="diaryTitle">MySQL服务维护笔记</h2>                                       
<p></p><p>转自：<a href="http://www.chedong.com/tech/mysql.html">http://www.chedong.com/tech/mysql.html</a></p><p>作者： 车东 Email: chedongATbigfoot.com/chedongATchedong.com</p><p>内容摘要：使用MySQL服务的一些经验，主要从以下几个方面考虑的MySQL服务规划设计。对于高负载站点来说PHP和MySQL运行在一起（或者说任何应用和数据库运行在一起的规划）都是性能最大的瓶颈，这样的设计有如让人一手画圆一手画方，这样2个人的工作效率肯定不如让一个人专门画圆一个人专门画方效率高，让应用和数据库都跑在一台高性能服务器上说不定还不如跑在2台普通服务器上快。<br /></p><p>以下就是针对MySQL作为专门的数据库服务器的优化建议：</p><ol><li>MySQL服务的安装/配置的通用性； 
</li><li>系统的升级和数据迁移方便性； 
</li><li>备份和系统快速恢复； 
</li><li>数据库应用的设计要点； 
</li><li>一次应用优化实战； </li></ol><p>MySQL服务器的规划<br />=================<br />为了以后维护，升级备份的方便和数据的安全性，最好将MySQL程序文件和数据分别安装在“不同的硬件”上。<br /></p><pre>         /   / <br />        |    /usr                     &lt;== 操作系统         <br />        |    /home/mysql              &lt;== mysql主目录，为了方便升级，这只是一个最新版本目录的链接 <br />硬盘1==&gt;|    /home/mysql-3.23.54/     &lt;== 最新版本的mysql /home/mysql链接到这里<br />         \   /home/mysql-old/         &lt;== 以前运行的旧版本的mysql<br /><br />         /   /data/app_1/             &lt;== 应用数据和启动脚本等<br />硬盘2==&gt;|    /data/app_2/<br />         \   /data/app_3/<br /></pre><p><br />MySQL服务的安装和服务的启动：<br />MySQL一般使用当前STABLE的版本：<br />尽量不使用--with-charset=选项，我感觉with-charset只在按字母排序的时候才有用，这些选项会对数据的迁移带来很多麻烦。<br />尽量不使用innodb，innodb主要用于需要外键，事务等企业级支持，代价是速度比MYISAM有数量级的下降。<br />./configure --prefix=/home/mysql --without-innodb<br />make <br />make install<br /><br />服务的启动和停止<br />================<br />1 复制缺省的mysql/var/mysql到 /data/app_1/目录下，<br />2 MySQLD的启动脚本：start_mysql.sh<br />#!/bin/sh<br />rundir=`dirname "$0"`<br />echo "$rundir"<br />/home/mysql/bin/safe_mysqld --user=mysql --pid-file="$rundir"/mysql.pid --datadir="$rundir"/var "$@"\<br />-O max_connections=500 -O wait_timeout=600 -O key_buffer=32M --port=3402 --socket="$rundir"/mysql.sock &amp; </p><p>注释：<br />--pid-file="$rundir"/mysql.pid --socket="$rundir"/mysql.sock --datadir="$rundir"/var <br />目的都是将相应数据和应用临时文件放在一起；<br />-O 后面一般是服务器启动全局变量优化参数，有时候需要根据具体应用调整；<br />--port: 不同的应用使用PORT参数分布到不同的服务上去，一个服务可以提供的连接数一般是MySQL服务的主要瓶颈； </p><p>修改不同的服务到不同的端口后，在rc.local文件中加入：<br />/data/app_1/start_mysql.sh<br />/data/app_2/start_mysql.sh<br />/data/app_3/start_mysql.sh<br /><i>注意：必须写全路径<br /></i><br />3 MySQLD的停止脚本：stop_mysql.sh<br />#!/bin/sh<br />rundir=`dirname "$0"`<br />echo "$rundir"<br />/home/mysql/bin/mysqladmin -u mysql -S"$rundir"/mysql.sock shutdown <br /><br />使用这个脚本的好处在于：<br />1 多个服务启动：对于不同服务只需要修改脚本中的--port[=端口号]参数。单个目录下的数据和服务脚本都是可以独立打包的。<br />2 所有服务相应文件都位于/data/app_1/目录下：比如：mysql.pid mysql.sock，当一台服务器上启动多个服务时，多个服务不会互相影响。但都放到缺省的/tmp/下则有可能被其他应用误删。<br />3 当硬盘1出问题以后，直接将硬盘2放到一台装好MySQL的服务器上就可以立刻恢复服务（如果放到my.cnf里则还需要备份相应的配置文件）。 </p><p>服务启动后/data/app_1/下相应的文件和目录分布如下：<br />/data/app_1/<br />    start_mysql.sh 服务启动脚本<br />    stop_mysql.sh 服务停止脚本<br />    mysql.pid 服务的进程ID<br />    mysql.sock 服务的SOCK<br />    var/ 数据区<br />       mysql/ 用户库<br />       app_1_db_1/ 应用库<br />       app_1_db_2/<br />...<br />/data/app_2/<br />... </p><p>查看所有的应用进程ID：<br />cat /data/*/mysql.pid </p><p>查看所有数据库的错误日志：<br />cat /data/*/var/*.err </p><p>个人建议：MySQL的主要瓶颈在PORT的连接数上，因此，将表结构优化好以后，相应单个MySQL服务的CPU占用仍然在10％以上，就要考虑将服务拆分到多个PORT上运行了。</p><p>服务的备份<br />==========<br />尽量使用MySQL DUMP而不是直接备份数据文件，以下是一个按weekday将数据轮循备份的脚本：备份的间隔和周期可以根据备份的需求确定<br />/home/mysql/bin/mysqldump -S/data/app_1/mysql.sock -umysql db_name | gzip -f&gt;/path/to/backup/db_name.`data +%w`.dump.gz<br />因此写在CRONTAB中一般是：<br />15 4 * * * /home/mysql/bin/mysqldump -S/data/app_1/mysql.sock -umysql db_name | gzip -f&gt;/path/to/backup/db_name.`data +\%w`.dump.gz<br /><i>注意：<br />1 在crontab中'%'需要转义成'\%'<br />2 根据日志统计，应用负载最低的时候一般是在早上4-6点<br /></i><br />先备份在本地然后传到远程的备份服务器上，或者直接建立一个数据库备份帐号，直接在远程的服务器上备份，远程备份只需要将以上脚本中的-S /path/to/msyql.sock改成-h IP.ADDRESS即可。<br /><br />数据的恢复和系统的升级<br />======================<br />日常维护和数据迁移：在数据盘没有被破坏的情况下<br />硬盘一般是系统中寿命最低的硬件。而系统（包括操作系统和MySQL应用）的升级和硬件升级，都会遇到数据迁移的问题。<br />只要数据不变，先装好服务器，然后直接将数据盘（硬盘2）安装上，只需要将启动脚本重新加入到rc.local文件中，系统就算是很好的恢复了。<br /><br />灾难恢复：数据库数据本身被破坏的情况下<br />确定破坏的时间点，然后从备份数据中恢复。</p><p>应用的设计要点<br />==============<br />如果MySQL应用占用的CPU超过10%就应该考虑优化了。<br /></p><ol><li>如果这个服务可以被其他非数据库应用代替（比如很多基于数据库的计数器完全可以用WEB日志统计代替）最好将其禁用：<br />非用数据库不可吗？虽然数据库的确可以简化很多应用的结构设计，但本身也是一个系统资源消耗比较大的应用。在某些情况下文本，DBM比数据库是更好的选择，比如：很多应用如果没有很高的实时统计需求的话，完全可以先记录到文件日志中，定期的导入到数据库中做后续统计分析。如果还是需要记录简单的2维键－值对应结构的话可以使用类似于DBM的HEAP类型表。因为HEAP表全部在内存中存取，效率非常高，但服务器突然断电时有可能出现数据丢失，所以非常适合存储在线用户信息，日志等临时数据。即使需要使用数据库的，应用如果没有太复杂的数据完整性需求的化，完全可以不使用那些支持外键的商业数据库，比如MySQL。只有非常需要完整的商业逻辑和事务完整性的时候才需要Oracle这样的大型数据库。对于高负载应用来说完全可以把日志文件，DBM，MySQL等轻量级方式做前端数据采集格式，然后用Oracle MSSQL DB2 Sybase等做数据库仓库以完成复杂的数据库挖掘分析工作。<br />有朋友和我说用标准的MyISAM表代替了InnoDB表以后，数据库性能提高了20倍。<br /><br /></li><li>数据库服务的主要瓶颈：单个服务的连接数<br />对于一个应用来说，如果数据库表结构的设计能够按照数据库原理的范式来设计的话，并且已经使用了最新版本的MySQL，并且按照比较优化的方式运行了，那么最后的主要瓶颈一般在于单个服务的连接数，即使一个数据库可以支持并发500个连接，最好也不要把应用用到这个地步，因为并发连接数过多数据库服务本身用于调度的线程的开销也会非常大了。所以如果应用允许的话：让一台机器多跑几个MySQL服务分担。将服务均衡的规划到多个MySQL服务端口上：比如app_1 ==&gt; 3301 app_2 ==&gt; 3302...app_9 ==&gt; 3309。一个1G内存的机器跑上10个MySQL是很正常的。让10个MySQLD承担1000个并发连接效率要比让2个MySQLD承担1000个效率高的多。当然，这样也会带来一些应用编程上的复杂度；<br /><br /></li><li>使用单独的数据库服务器（不要让数据库和前台WEB服务抢内存），MySQL拥有更多的内存就可能能有效的进行结果集的缓存；在前面的启动脚本中有一个-O key_buffer=32M参数就是用于将缺省的8M索引缓存增加到32M（当然对于）<br /><br /></li><li>应用尽量使用PCONNECT和polling机制，用于节省MySQL服务建立连接的开销，但也会造成MySQL并发链接数过多（每个HTTPD都会对应一个MySQL线程）；<br /><br /></li><li>表的横向拆分：让最常被访问的10%的数据放在一个小表里，90%的历史数据放在一个归档表里（所谓：快慢表），数据中间通过定期“搬家”和定期删除无效数据来节省，毕竟大部分应用（比如论坛）访问2个月前数据的几率会非常少，而且价值也不是很高。这样对于应用来说总是在一个比较小的结果级中进行数据选择，比较有利于数据的缓存，不要指望MySQL中对单表记录条数在10万级以上还有比较高的效率。而且有时候数据没有必要做那么精确，比如一个快表中查到了某个人发表的文章有60条结果，快表和慢表的比例是1:20，那么就可以简单的估计这个人一共发表了1200篇。Google的搜索结果数也是一样：对于很多上十万的结果数，后面很多的数字都是通过一定的算法估计出来的。<br /><br /></li><li>数据库字段设计：表的纵向拆分（过渡范化）：将所有的定长字段（char, int等）放在一个表里，所有的变长字段（varchar,text,blob等）放在另外一个表里，2个表之间通过主键关联，这样，定长字段表可以得到很大的优化（这样可以使用HEAP表类型，数据完全在内存中存取），这里也说明另外一个原则，对于我们来说，尽量使用定长字段可以通过空间的损失换取访问效率的提高。在MySQL4中也出现了支持外键和事务的InnoDB类型表，标准的MyISAM格式表和基于HASH结构的HEAP内存表，MySQL之所以支持多种表类型，实际上是针对不同应用提供了不同的优化方式；<br /><br /></li><li>仔细的检查应用的索引设计：可以在服务启动参数中加入 --log-slow-queries[=file]用于跟踪分析应用瓶颈，对于跟踪服务瓶颈最简单的方法就是用MySQL的status查看MySQL服务的运行统计和show processlist来查看当前服务中正在运行的SQL，如果某个SQL经常出现在PROCESS LIST中，一。有可能被查询的此时非常多，二，里面有影响查询的字段没有索引，三，返回的结果数过多数据库正在排序（SORTING）；所以做一个脚本：比如每2秒运行以下show processlist;把结果输出到文件中，看到底是什么查询在吃CPU。<br /><br /></li><li>全文检索：如果相应字段没有做全文索引的话，全文检索将是一个非常消耗CPU的功能，因为全文检索是用不上一般数据库的索引的，所以要进行相应字段记录遍历。关于全文索引可以参考一下基于<a href="http://www.chedong.com/tech/lucene.html">Java的全文索引引擎lucene的介绍</a>。<br /><br /></li><li>前台应用的记录缓存：比如一个经常使用数据库认证，如果需要有更新用户最后登陆时间的操作，最好记录更新后就把用户放到一个缓存中（设置2个小时后过期），这样如果用户在2个小时内再次使用到登陆，就直接从缓存里认证，避免了过于频繁的数据库操作。<br /><br /></li><li>查询优先的表应该尽可能为where和order by字句中的字段加上索引，数据库更新插入优先的应用索引越少越好。<br /></li></ol><p>总之：对于任何数据库单表记录超过100万条优化都是比较困难的，关键是要把应用能够转化成数据库比较擅长的数据上限内。也就是把复杂需求简化成比较成熟的解决方案内。</p><p>一次优化实战<br />============<br />以下例子是对一个论坛应用进行的优化：<br /></p><ol><li>用Webalizer代替了原来的通过数据库的统计。<br /></li><li>首先通过TOP命令查看MySQL服务的CPU占用左右80%和内存占用：10M，说明数据库的索引缓存已经用完了，修改启动参数，增加了-O key_buffer=32M，过一段时间等数据库稳定后看的内存占用是否达到上限。最后将缓存一直增加到64M，数据库缓存才基本能充分使用。对于一个数据库应用来说，把内存给数据库比给WEB服务实用的多，因为MySQL查询速度的提高能加快web应用从而节省并发的WEB服务所占用的内存资源。<br /></li><li>用show processlist;统计经常出现的SQL：<br /><br />每分钟运行一次show processlist并记录日志：<br />* * * * * (/home/mysql/bin/mysql -uuser -ppassword &lt; /home/chedong/show_processlist.sql &gt;&gt;  /home/chedong/mysql_processlist.log)<br /><br />show_processlist.sql里就一句：<br />show processlist;<br /><br />比如可以从日志中将包含where的字句过滤出来：<br />grep where mysql_processlist.log<br />如果发现有死锁，一定要重新审视一下数据库设计了，对于一般情况：查询速度很慢，就将SQL where字句中没有索引的字段加上索引，如果是排序慢就将order by字句中没有索引的字段加上。对于有%like%的查询，考虑以后禁用和使用全文索引加速。<br /><br /></li><li>还是根据show processlist;看经常有那些数据库被频繁使用，考虑将数据库拆分到其他服务端口上。 </li></ol><p>MSSQL到MySQL的数据迁移：ACCESS＋MySQL ODBC Driver</p><p>在以前的几次数据迁移实践过程中，我发现最简便的数据迁移过程并不是通过专业的数据库迁移工具，也不是MSSQL自身的DTS进行数据迁移（迁移过程中间会有很多表出错误警告），但通过将MSSQL数据库通过ACCESS获取外部数据导入到数据库中，然后用ACCESS的表==&gt;右键==&gt;导出，制定ODBC，通过MySQL的DSN将数据导出。这样迁移大部分数据都会非常顺利，如果导出的表有索引问题，还会出添加索引提示（DTS就不行），然后剩余的工作就是在MySQL中设计字段对应的SQL脚本了。</p><img src ="http://www.blogjava.net/gm_jing/aggbug/60484.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gm_jing/" target="_blank">黎夕</a> 2006-07-28 10:00 <a href="http://www.blogjava.net/gm_jing/articles/60484.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>