譯者:晏子 (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
mSQL
這一節由MySQL開發者編寫,因此應該理智地閱讀它,但是沒有我們聽說的事實錯誤。
對於所有支援的限制、函數和類型的一個列表,看crash-me
網頁。
mSQL
應該在下列方面更快些:INSERT
操作。 CREATE TABLE
和DROP TABLE
。 SELECT
。(一個表掃描是很容易的。)因為這些操作是如此簡單,當你有更高的啟動開銷時,很難在這些方面變得更好。在連接被建立以後,MySQL應該性能好一些。在另一方面,MySQL比mSQL
(以及大多數其他的SQL實現)在下列方面更好些:
SELECT
操作。 VARCHAR
列上索引。SELECT
。 SELECT
。 mSQL
中,一旦一個連接被建立了,所有其它執行緒必須等到第一個執行緒完成,不管連接正在運行的查詢是短的或是長的。當第一個連接終止時,下一個才能工作,而此時所有其它執行緒再次等待,等等。SELECT
中的表的順序,mSQL
可能變得異常地慢。在效能套件中,比MySQL要慢超過15000倍的時間。這是由於mSQL
缺乏一個聯結最佳化器以便以最佳的順序排定表。然而,如果你把表按完全正確的順序放在mSQL
2中並且WHERE
是很簡單的並使用索引列,聯結將相對快些!見10.8 使用你自己的效能。ORDER BY
和GROUP BY
。DISTINCT
。TEXT
或BLOB
列。GROUP BY
和HAVING
。mSQL
根本不支援GROUP
BY
。MySQL支援一個有兩個HAVING
和下列函數:
COUNT()
、AVG()
、MIN()
、MAX()
、SUM()
和STD()
的完整的GROUP
BY
。如果SELECT
從一張表中檢索,沒有其他列被檢索並且沒有WHERE
子句,COUNT(*)
被最佳化以很快地返回。
MIN()
和MAX()
可以取字符串參數。 INSERT
和UPDATE
。MySQL能在一個INSERT
或UPDATE
中做計算。例如:mysql> UPDATE SET x=x*10+y WHERE x<20;
SELECT
。MySQL有很多函數(太多不能在這裡列出﹔見7.4 用在SELECT
和WHERE
子句中的函數)。MEDIUMINT
,它是3個字節長。如果你有100,000,000個記錄,每個記錄節省甚至一個字節也是很重要的。mSQL2
有一個較有限的列類型集合,因此更難於使表更小。mSQL
穩定性的經驗,因此我們對此不能說任何東西。mSQL
更靈活的使用授權,並且也不比mSQL
昂貴。無論你選擇使用哪個產品,記得要至少考慮支付一個使用授權或電子郵件支援的費用。(當然如果你把你出售的一個產品包括在MySQL中,你將被要求獲得一個使用授權。)mSQL
基本相同Perl介面,當有一些增加的功能。推薦的驅動程式是twz或mm驅動程式。兩者均被報導工作出色。我們知道mSQL
有一個
JDBC 驅動程式,但是我們對它有太少的經驗不能進行比較。
GROUP
BY
等在mSQL
中仍未實現,它有很多追趕工作要做。要想得到關於它的一些前景,你可以查看mSQL
最後一年的
“HISTIRY”文件,並將它與MySQL參考書手冊的新功能小節比較(見D MySQL變遷歷史)。哪個快開發得最快應該是相當明顯的。mSQL
和MySQL都有許多有趣的第三方工具。因為向上移植(從mSQL
到MySQL)是很容易的,幾乎所有mSQL
可用的有趣的應用程式也可被MySQL使用。MySQL帶有一個簡單的msql2mysql
程式修正在mSQL
和MySQL使用的大多數C
API函數之間拼寫差別。例如,它將msqlConnect()
實例改變為mysql_connect()
。變換一個客戶程式從mSQL
到MySQL通常花幾分鐘時間。mSQL
的工具轉換到MySQL根據我們的經驗,轉換諸如使用mSQL
C API的msql-tcl
和msqljava
工具將只花不大一小時時間,使得他們用MySQL
C API工作。
轉換程序是:
msql2mysql
。這需要replace
程式,它與MySQL一起散發。mSQL
C API與MySQL C API 之間差別是:
MYSQL
結構作為一種連接類型(mSQL
使用一個int
)。mysql_connect()
取一個指向一個MYSQL
結構的指針作為一個參數。很容易定義全局性定義一個或使用malloc()
獲得一個。mysql_connect()
也取兩個參數指定用戶和密碼。你可以為了內定使用將這些設置為NULL,NULL
。mysql_error()
取MYSQL
結構作為一個參數。如果你正在移植老的代碼,只是把參數加到你的老的msql_error()
編碼中。
mSQL
僅返回一條文字錯誤消息。
mSQL
和MySQL的客戶機/伺服器通訊協議有何不同有足夠的差別使得不可能(或至少不容易)支援兩者。
它MySQL協議不同於mSQL
協議的最重要的方面列在下面:
mSQL
2.0的SQL句法與MySQL有何不同列類型
MySQL
CREATE TABLE
句法): 、ENUM
類型。SET
類型。 BIGINT
類型。UNSIGNED
選項。ZEROFILL
選項。PRIMARY KEY
的整數列的AUTO_INCREMENT
選項。見20.4.29 mysql_insert_id()
。DEFAULT
值。 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 KEY
或UNIQUE
鍵。 mSQL
_rowid
列。注意_rowid
可以將來改變,取決於很多因素。得到列最後被修改的時間
MySQL
TIMESTAMP
列。如果你不給出列值或如果你給它一個NULL
值,該列自動為INSERT
或UPDATE
語句設置為當前的日期和時間。mSQL
_timestamp
列。NULL
值的比較
MySQL
NULL
的比較總是NULL
。mSQL
mSQL
中,NULL = NULL
是TRUE(真)。當從mSQL
到MySQL移植老的代碼時,你必須將=NULL
改委IS
NULL
,並將<>NULL
改為IS NOT NULL
。字符串的比較
MySQL
BINARY
屬性,它使得比較根據用在MySQL伺服器主機上的ASCII順序進行。mSQL
大小寫不敏感的搜索
MySQL
LIKE
是一個大小寫不敏感或大小寫敏感的運算符,這取決於涉及的列。如果LIKE
參數不以一個通配符字符開始,如有可能,MySQL則使用索引。mSQL
CLIKE
。尾部空格的處理
MySQL
CHAR
和VARCHAR
列尾部的空格。如果不希望這種行為,使用一個TEXT
行列。mSQL
WHERE
子句
MySQL
AND
在OR
前計算)。要想在MySQL裡得到mSQL
的行為,使用括號(如下所示)。mSQL
mSQL
查詢:mysql> SELECT * FROM table WHERE a=1 AND b=2 OR a=3 AND b=4;
為了使MySQL像mSQL
那樣計算它,你必須增加括號:
mysql> SELECT * FROM table WHERE (a=1 AND (b=2 OR (a=3 AND (b=4))));
存取控制
MySQL
mSQL
PostgreSQL
有一些更高級的功能如定義用戶類型、觸發器、規則和一些事務支援。然而,PostgreSQL
缺乏很多來自 ANSI SQL和ODBC的很多標準類型和函數。對於一個完整的限制列表及其支援或不支援哪一個類型和函數,見crash-me
網頁。
通常,PostgreSQL
是比MySQL慢很多。見10.8 使用你自己的效能。這大部分是由於他們的事務系統。如果你確實需要事務或PostgreSQL提供的豐富的類型體系並且你能承受速度的損失,你應該看看
PostgreSQL。