?? 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 + -