mysql-logo.gif (3082 bytes)MySQL中文參考手冊

譯者:晏子 (clyan@sohu.com
GB 碼主頁:http://linuxdb.yeah.net

Big5 轉碼者:statue (statue@bbs.yzu.edu.tw
詞彙轉換:彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁: http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站: http://php.wilson.gs/mysqldoc/big5/manual_toc.html


第一章, 前一章, 下一章, 最後一章目錄.


21 怎樣對比MySQL與其他資料庫

21.1 怎樣對比MySQL與mSQL

這一節由MySQL開發者編寫,因此應該理智地閱讀它,但是沒有我們聽說的事實錯誤。

對於所有支援的限制、函數和類型的一個列表,看crash-me網頁

性能
對於速度的真實比較,請教不斷成熟的MySQL效能套件。見10.8 使用你自己的效能。因為沒有執行緒創建開銷、一個較小的語法分析器、較少功能和簡單的安全性,mSQL應該在下列方面更快些:

因為這些操作是如此簡單,當你有更高的啟動開銷時,很難在這些方面變得更好。在連接被建立以後,MySQL應該性能好一些。在另一方面,MySQLmSQL(以及大多數其他的SQL實現)在下列方面更好些:

SQL功能
磁碟空間效率
即,你能使你的表有多小?MySQL有很精確的類型,因此你可以創建占據很小空間的表。一個有用的MySQL數據類型的例子是MEDIUMINT,它是3個字節長。如果你有100,000,000個記錄,每個記錄節省甚至一個字節也是很重要的。mSQL2有一個較有限的列類型集合,因此更難於使表更小。
穩定性
這較難客觀地評價。對於MySQL穩定性的討論,見1.5 MySQL有多麼穩定?。我們沒有mSQL穩定性的經驗,因此我們對此不能說任何東西。
價格
另一個重要的問題是使用授權。MySQL有一個比mSQL更靈活的使用授權,並且也不比mSQL昂貴。無論你選擇使用哪個產品,記得要至少考慮支付一個使用授權或電子郵件支援的費用。(當然如果你把你出售的一個產品包括在MySQL中,你將被要求獲得一個使用授權。)
Perl介面
MySQL有與mSQL基本相同Perl介面,當有一些增加的功能。
JDBC ( Java )
MySQL目前有4個JDBC驅動程式:

推薦的驅動程式是twz或mm驅動程式。兩者均被報導工作出色。我們知道mSQL有一個 JDBC 驅動程式,但是我們對它有太少的經驗不能進行比較。

開發速度
MySQL有一個非常小的開發者黑郔,但是我們是非常習慣於用C和C++編碼,非常快速。因為執行緒、函數、GROUP BY等在mSQL中仍未實現,它有很多追趕工作要做。要想得到關於它的一些前景,你可以查看mSQL最後一年的 “HISTIRY”文件,並將它與MySQL參考書手冊的新功能小節比較(見D MySQL變遷歷史)。哪個快開發得最快應該是相當明顯的。
實用程式
mSQLMySQL都有許多有趣的第三方工具。因為向上移植(從mSQLMySQL)是很容易的,幾乎所有mSQL可用的有趣的應用程式也可被MySQL使用。MySQL帶有一個簡單的msql2mysql程式修正在mSQLMySQL使用的大多數C API函數之間拼寫差別。例如,它將msqlConnect()實例改變為mysql_connect()。變換一個客戶程式從mSQLMySQL通常花幾分鐘時間。

21.1.1 怎樣將mSQL的工具轉換到MySQL

根據我們的經驗,轉換諸如使用mSQL C API的msql-tclmsqljava工具將只花不大一小時時間,使得他們用MySQL C API工作。

轉換程序是:

  1. 在原始程式上運行外殼腳本msql2mysql。這需要replace程式,它與MySQL一起散發。
  2. 編譯。
  3. 修正所有編譯器錯誤。

mSQL C API與MySQL C API 之間差別是:

21.1.2 mSQL和MySQL的客戶機/伺服器通訊協議有何不同

有足夠的差別使得不可能(或至少不容易)支援兩者。

MySQL協議不同於mSQL協議的最重要的方面列在下面:

21.1.3 mSQL 2.0的SQL句法與MySQL有何不同

列類型

MySQL
有下列額外的類型(比較其他的﹔見7.7 CREATE TABLE句法): 、
MySQL也支援下列額外的類型屬性:
mSQL2
mSQL列類型對應於MySQL類型顯示在下面:
mSQL類型 相應的MySQL類型
CHAR(len) CHAR(len)
TEXT(len) TEXT(len)len是最大長度。並且LIKE可運用。
INT INT,有很多的選項!
REAL REAL,或FLOAT。有4和8字節版本。
UINT INT UNSIGNED
DATE DATE,使用 ANSI SQL 格式而非mSQL自己的。
TIME TIME
MONEY DECIMAL(12,2),有2個小數位的定點值。

索引創建

MySQL
索引可以在表創建時用CREATE TABLE語句指定。
mSQL
在表被創建了以後,索引必須被創建,用單獨的CREATE INDEX語句。

把一個唯一標識符插入到一張表中

MySQL
使用AUTO_INCREMENT作為列類型修飾符。見20.4.29 mysql_insert_id()
mSQL
在一張表上創建一個SEQUENCE並且選擇_seq列。

為行獲得一個唯一標識符

MySQL
向表中增加一個PRIMARY KEYUNIQUE鍵。
mSQL
使用_rowid列。注意_rowid可以將來改變,取決於很多因素。

得到列最後被修改的時間

MySQL
在表中增加一個TIMESTAMP列。如果你不給出列值或如果你給它一個NULL值,該列自動為INSERTUPDATE語句設置為當前的日期和時間。
mSQL
使用_timestamp列。

NULL值的比較

MySQL
MySQL遵從ANSI SQL且與NULL的比較總是NULL
mSQL
mSQL中,NULL = NULL是TRUE(真)。當從mSQLMySQL移植老的代碼時,你必須將=NULL改委IS NULL,並將<>NULL改為IS NOT NULL

字符串的比較

MySQL
通常,字符串比較以大小寫無關方式按當前字符集(內定為ISO-8859-1 Latin1)決定的排序次序實施。如果你不喜歡這樣,聲明你的列有BINARY屬性,它使得比較根據用在MySQL伺服器主機上的ASCII順序進行。
mSQL
所有的字符串比較以大小寫敏感的方式以ASCII順序排序來進行。

大小寫不敏感的搜索

MySQL
LIKE是一個大小寫不敏感或大小寫敏感的運算符,這取決於涉及的列。如果LIKE參數不以一個通配符字符開始,如有可能,MySQL則使用索引。
mSQL
使用CLIKE

尾部空格的處理

MySQL
剝去CHARVARCHAR列尾部的空格。如果不希望這種行為,使用一個TEXT行列。
mSQL
保留尾部的空格。

WHERE子句

MySQL
MySQL正確地優先化任何東西(ANDOR前計算)。要想在MySQL裡得到mSQL的行為,使用括號(如下所示)。
mSQL
從左到右計算任何東西。這意味著超過3個參數的一些邏輯運算不能以任何方式表示,它也意味著當你升級到MySQL時,你必須改變一些查詢。你通過增加括號很容易做到這點。假定你有下列mSQL查詢:
mysql> SELECT * FROM table WHERE a=1 AND b=2 OR a=3 AND b=4;

為了使MySQLmSQL那樣計算它,你必須增加括號:

mysql> SELECT * FROM table WHERE (a=1 AND (b=2 OR (a=3 AND (b=4))));

存取控制

MySQL
有表來儲存對每個用戶、主機和資料庫的授權(許可)選項。見6.6 權限系統如何工作
mSQL
有一個文件“mSQL.acl”,在哪裡你能為用戶授權讀/寫權限。
 

21.2 怎樣對比MySQL與PostgreSQL

PostgreSQL有一些更高級的功能如定義用戶類型、觸發器、規則和一些事務支援。然而,PostgreSQL 缺乏很多來自 ANSI SQL和ODBC的很多標準類型和函數。對於一個完整的限制列表及其支援或不支援哪一個類型和函數,見crash-me網頁

通常,PostgreSQL是比MySQL慢很多。見10.8 使用你自己的效能。這大部分是由於他們的事務系統。如果你確實需要事務或PostgreSQL提供的豐富的類型體系並且你能承受速度的損失,你應該看看 PostgreSQL。


第一章, 前一章, 下一章, 最後一章目錄.