📄 manual_comparisons.html
字号:
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
<title>MySQL中文参考手册-21 如何比较MySQL与其他数据库</title>
<style type="text/css">
<!--
.p14{font-size:14.8px;font-family:宋体;line-height:14pt;}
.p5{ border: 1px solid rgb(146,201,201) }
.a:hover{color:red;}
a.t1:visited{color:red;}
-->
</style>
</head>
<body BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#101090" VLINK="#7030B0" class="p4">
<h1><img src="Img/mysql-logo.gif" alt="mysql-logo.gif (3082 bytes)" WIDTH="127" HEIGHT="60"><font color="#FF0000">MySQL中文参考手册</font></h1>
<p>翻译:<a href="mailto:clyan@sohu.com">晏子</a>(yanzi)
主页:<a href="http://linuxdn.yeah.net">http://linuxdb.yeah.net</a></p>
<hr>
<p><a HREF="manual_Introduction.html">第一章</a>, <a HREF="manual_Clients.html">前一章</a>,
<a HREF="manual_Users.html">下一章</a>, <a HREF="manual_Concept_Index.html">最后一章</a>,<a HREF="manual_toc.html">目录</a>. </p>
<hr>
<h1><a NAME="Comparisons" HREF="manual_toc.html#Comparisons">21 怎样对比MySQL与其他数据库</a></h1>
<h2><a NAME="Compare_mSQL" HREF="manual_toc.html#Compare_mSQL">21.1 怎样对比MySQL与<code>mSQL</code></a></h2>
<p>这一节由<strong>MySQL</strong>开发者编写,因此应该理智地阅读它,但是没有我们听说的事实错误。</p>
<p>对于所有支持的限制、函数和类型的一个列表,看<a HREF="http://www.mysql.com/crash-me-choose.htmy"><code>crash-me</code>网页</a>。
<dl>
<dt><strong>性能</strong> </dt>
<dd>对于速度的真实比较,请教不断成熟的<strong>MySQL</strong>基准套件。见<a HREF="manual_Performance.html#Benchmarks">10.8 使用你自己的基准</a>。因为没有线程创建开销、一个较小的语法分析器、较少功能和简单的安全性,<code>mSQL</code>应该在下列方面更快些:<ul>
<li>执行重复的连接和断开的测试,在每个连接期间运行一个非常简单的查询。
</li>
<li>有很少的列和键的插入很简单的表的<code>INSERT</code>操作。 </li>
<li><code>CREATE TABLE</code>和<code>DROP TABLE</code>。 </li>
<li>在不是一个索引的一些东西上<code>SELECT</code>。(一个表扫描是很容易的。)</li>
</ul>
<p>因为这些操作是如此简单,当你有更高的启动开销时,很难在这些方面变得更好。在连接被建立以后,<strong>MySQL</strong>应该性能好一些。在另一方面,<strong>MySQL</strong>比<code>mSQL</code>(以及大多数其他的SQL实现)在下列方面更好些:<ul>
<li>复杂的<code>SELECT</code>操作。 </li>
<li>检索较大的结果(<strong>MySQL</strong>有一个更好、更快并且更安全的协议)。
</li>
<li>有变长字符串的表,因为<strong>MySQL</strong>有更有效的并可在<code>VARCHAR</code>列上索引。</li>
<li>有很多列的表的处理。</li>
<li>由长记录的表的处理。 </li>
<li>有很多许多表达式的<code>SELECT</code>。 </li>
<li>在大表上的<code>SELECT</code>。 </li>
<li>同时处理很多连接。<strong>MySQL</strong>充分是完全多线程化的,每个连接有它自己的线程,这意味着没有线程必须等待另一个线程(除非一个线程正在修改一张表,另外的线程想要存取)在<code>mSQL</code>中,一旦一个连接被建立了,所有其它线程必须等到第一个线程完成,不管连接正在运行的查询是短的或是长的。当第一个连接终止时,下一个才能工作,而此时所有其它线程再次等待,等等。</li>
<li>联结。如果你改变一个<code>SELECT</code>中的表的顺序,<code>mSQL</code>可能变得异常地慢。在基准套件中,比<strong>MySQL</strong>要慢超过15000倍的时间。这是由于<code>mSQL</code>缺乏一个联结优化器以便以最佳的顺序排定表。然而,如果你把表按完全正确的顺序放在<code>mSQL</code>2中并且<code>WHERE</code>是很简单的并使用索引列,联结将相对快些!见<a HREF="manual_Performance.html#Benchmarks">10.8 使用你自己的基准</a>。</li>
<li><code>ORDER BY</code>和<code>GROUP BY</code>。</li>
<li><code>DISTINCT</code>。</li>
<li>使用<code>TEXT</code>或<code>BLOB</code>列。</li>
</ul>
</dd>
<dt><strong>SQL功能</strong> </dt>
<dd><ul>
<li><code>GROUP BY</code>和<code>HAVING</code>。<code>mSQL</code>根本不支持<code>GROUP
BY</code>。<strong>MySQL</strong>支持一个有两个<code>HAVING</code>和下列函数:
<code>COUNT()</code>、<code>AVG()</code>、<code>MIN()</code>、<code>MAX()</code>、<code>SUM()</code>和<code>STD()</code>的完整的<code>GROUP
BY</code>。如果<code>SELECT</code>从一张表中检索,没有其他列被检索并且没有<code>WHERE</code>子句,<code>COUNT(*)</code>被优化以很快地返回。
<code>MIN()</code>和<code>MAX()</code>可以取字符串参数。 </li>
<li>带计算的<code>INSERT</code>和<code>UPDATE</code>。<strong>MySQL</strong>能在一个<code>INSERT</code>或<code>UPDATE</code>中做计算。例如:<pre>mysql> UPDATE SET x=x*10+y WHERE x<20;
</pre>
</li>
<li>别名。<strong>MySQL</strong>有列的别名。</li>
<li>限制列名。在<strong>MySQL</strong>中,如果一个列名在用于查询的表之间唯一的,你不必须使用完整的
合格者。</li>
<li>带函数的<code>SELECT</code>。<strong>MySQL</strong>有很多函数(太多不能在这里列出;见<a HREF="manual_Reference.html#Functions">7.4 用在<code>SELECT</code>和<code>WHERE</code>子句中的函数</a>)。</li>
</ul>
</dd>
<dt><strong>磁盘空间效率</strong> </dt>
<dd>即,你能使你的表有多小?<strong>MySQL</strong>有很精确的类型,因此你可以创建占据很小空间的表。一个有用的<strong>MySQL</strong>数据类型的例子是<code>MEDIUMINT</code>,它是3个字节长。如果你有100,000,000个记录,每个记录节省甚至一个字节也是很重要的。<code>mSQL2</code>有一个较有限的列类型集合,因此更难于使表更小。</dd>
<dt><strong>稳定性</strong> </dt>
<dd>这较难客观地评价。对于<strong>MySQL</strong>稳定性的讨论,见<a HREF="manual_Introduction.html#Stability">1.5 MySQL有多么稳定?</a>。我们没有<code>mSQL</code>稳定性的经验,因此我们对此不能说任何东西。</dd>
<dt><strong>价格</strong> </dt>
<dd>另一个重要的问题是许可证。<strong>MySQL</strong>有一个比<code>mSQL</code>更灵活的许可证,并且也不比<code>mSQL</code>昂贵。无论你选择使用哪个产品,记得要至少考虑支付一个许可证或电子邮件支持的费用。(当然如果你把你出售的一个产品包括在<strong>MySQL</strong>中,你将被要求获得一个许可证。)</dd>
<dt><strong>Perl接口</strong> </dt>
<dd><strong>MySQL</strong>有与<code>mSQL</code>基本相同Perl接口,当有一些增加的功能。</dd>
<dt><strong>JDBC ( Java )</strong> </dt>
<dd><strong>MySQL</strong>目前有4个JDBC驱动程序:<ul>
<li>gwe 驱动程序:由GWE technologies 开发的一个Java接口(不再支持)。</li>
<li>jms 驱动程序:由Xiaokun Kelvin ZHU的开发的一个改进的gwe驱动程序。</li>
<li>twz 驱动程序:由Terrence W. Zellers 开发的一个type 4 JDBC驱动程序并用于学习目的。</li>
<li>mm 驱动程序:由Mark Matthews 开发的一个type 4 JDBC驱动程序。</li>
</ul>
<p>推荐的驱动程序是twz或mm驱动程序。两者均被报导工作出色。我们知道<code>mSQL</code>有一个
JDBC 驱动程序,但是我们对它有太少的经验不能进行比较。</p>
</dd>
<dt><strong>开发速度</strong> </dt>
<dd><strong>MySQL</strong>有一个非常小的开发者队伍,但是我们是非常习惯于用C和C++编码,非常快速。因为线程、函数、<code>GROUP
BY</code>等在<code>mSQL</code>中仍未实现,它有很多追赶工作要做。要想得到关于它的一些前景,你可以查看<code>mSQL</code>最后一年的
<tt>“HISTIRY”</tt>文件,并将它与<strong>MySQL</strong>参考书手册的新功能小节比较(见<a HREF="manual_News.html#News">D MySQL变迁历史</a>)。哪个快开发得最快应该是相当明显的。</dd>
<dt><strong>实用程序</strong> </dt>
<dd><code>mSQL</code>和<strong>MySQL</strong>都有许多有趣的第三方工具。因为向上移植(从<code>mSQL</code>到<strong>MySQL</strong>)是很容易的,几乎所有<code>mSQL</code>可用的有趣的应用程序也可被<strong>MySQL</strong>使用。<strong>MySQL</strong>带有一个简单的<code>msql2mysql</code>程序修正在<code>mSQL</code>和<strong>MySQL</strong>使用的大多数C
API函数之间拼写差别。例如,它将<code>msqlConnect()</code>实例改变为<code>mysql_connect()</code>。变换一个客户程序从<code>mSQL</code>到<strong>MySQL</strong>通常花几分钟时间。</dd>
</dl>
<h3><a NAME="Using_mSQL_tools" HREF="manual_toc.html#Using_mSQL_tools">21.1.1 怎样将<code>mSQL</code>的工具转换到MySQL</a></h3>
<p>根据我们的经验,转换诸如使用<code>mSQL</code> C API的<code>msql-tcl</code>和<code>msqljava</code>工具将只花不大一小时时间,使得他们用<strong>MySQL</strong>
C API工作。</p>
<p>转换过程是:
<ol>
<li>在源代码上运行外壳脚本<code>msql2mysql</code>。这需要<code>replace</code>程序,它与<strong>MySQL</strong>一起散发。</li>
<li>编译。</li>
<li>修正所有编译器错误。</li>
</ol>
<p><code>mSQL</code> C API与<strong>MySQL</strong> C API 之间差别是:
<ul>
<li><strong>MySQL</strong>使用一个<code>MYSQL</code>结构作为一种连接类型(<code>mSQL</code>使用一个<code>int</code>)。</li>
<li><code>mysql_connect()</code>取一个指向一个<code>MYSQL</code>结构的指针作为一个参数。很容易定义全局性定义一个或使用<code>malloc()</code>获得一个。<code>mysql_connect()</code>也取两个参数指定用户和口令。你可以为了缺省使用将这些设置为<code>NULL,NULL</code>。</li>
<li><code>mysql_error()</code>取<code>MYSQL</code>结构作为一个参数。如果你正在移植老的代码,只是把参数加到你的老的<code>msql_error()</code>编码中。
</li>
<li><strong>MySQL</strong>对所有错误返回一个错误号和一条文本错误消息。<code>mSQL</code>仅返回一条文字错误消息。
</li>
<li>存在某些不兼容性,因为<strong>MySQL</strong>支持从同一个进程的到服务器多个连接。</li>
</ul>
<h3><a NAME="Protocol_differences" HREF="manual_toc.html#Protocol_differences">21.1.2 <code>mSQL</code>和MySQL的客户机/服务器通讯协议有何不同</a></h3>
<p>有足够的差别使得不可能(或至少不容易)支持两者。</p>
<p>它<strong>MySQL</strong>协议不同于<code>mSQL</code>协议的最重要的方面列在下面:
<ul>
<li>一个消息缓冲区可以包含很多结果行。 </li>
<li>如果查询或结果比当前缓冲区大,消息缓冲区动态地被扩大,直到一个可配置的服务器和客户上限。</li>
<li>所有的包被编号以捕捉重复或丢失的包。</li>
<li>所有的列值以ASCII码发送。列和行的长度以紧凑的二进制编码(1、2或3个字节)发送。</li>
<li><strong>MySQL</strong>能在未缓冲得结果中读取(不必在客户端存储完整的集合)。</li>
<li>如果一个单独写/读花了超过30秒时间,服务器关闭连接。</li>
<li>如果一个连接空闲8个小时,服务器关闭连接。</li>
</ul>
<h3><a NAME="Syntax_differences" HREF="manual_toc.html#Syntax_differences">21.1.3 <code>mSQL</code>
2.0的SQL句法与MySQL有何不同</a></h3>
<p><strong>列类型</strong>
<dl COMPACT="Syntax_differences">
<dt><code><strong>MySQL</strong></code> </dt>
<dd>有下列额外的类型(比较其他的;见<a HREF="manual_Reference.html#CREATE_TABLE">7.7<code> CREATE TABLE</code>句法</a>): 、<ul>
<li>对于一个字符串集中之一的<code>ENUM</code>类型。</li>
<li>对于一个字符串集中多个的<code>SET</code>类型。 </li>
<li>对于64位整数的<code>BIGINT</code>类型。</li>
</ul>
</dd>
<dd><strong>MySQL</strong>也支持下列额外的类型属性: <ul>
<li><code>UNSIGNED</code>选项。</li>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -