Linux數(shù)據(jù)庫大比拼_第1頁
Linux數(shù)據(jù)庫大比拼_第2頁
Linux數(shù)據(jù)庫大比拼_第3頁
Linux數(shù)據(jù)庫大比拼_第4頁
Linux數(shù)據(jù)庫大比拼_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Linux數(shù)據(jù)庫大比拼當?shù)谝淮斡腥私ㄗh我為LinuxPlanet寫數(shù)據(jù)庫管理系統(tǒng)的比較時,我搖了搖頭,我從來沒做過這樣的比較,但是后來,我想:有何不可?也許一種新鮮天真的方法并不壞。因此就有本文:一種全新眼光看繽紛的Linux數(shù)據(jù)庫世界。本文共4部分。 在這里比較的數(shù)據(jù)庫管理器是免費的或有便宜的許可費,并且他們可在所有層次的Linux系統(tǒng)上運行,從低端硬件到高端多處理器服務(wù)器,他們已經(jīng)廣泛地應(yīng)用世界范圍的生產(chǎn)系統(tǒng)上。為了比較,我把我自己放在了運行典型的Linux機器的境地,每天都由 DBMS提供動力。 我將考察: mSQL MySQL PostgreSQL我將以一個這3個數(shù)據(jù)庫系統(tǒng)的安裝和配置

2、的討論開始,然后我將在第2部分繼續(xù),通過用SQL的一個小數(shù)據(jù)庫的設(shè)計,指出我碰到的困難和試圖使數(shù)據(jù)庫系統(tǒng)接受的差異,我也將解釋一個程序的編碼,它在數(shù)據(jù)庫上執(zhí)行各種的真實操作,例如增加數(shù)據(jù)并產(chǎn)生報表,同時討論數(shù)據(jù)庫在處理上的各種差別。這個客戶程序針對所有3個數(shù)據(jù)庫系統(tǒng)用C語言實現(xiàn)。為此,我必須不僅學(xué)習(xí)所有系統(tǒng)SQL API,還有SQL。如果沒有其他東西,這將肯定饒有興趣地看下去。 第三部分將包含一些真實的基準測試,作為獎賞。我已經(jīng)有了在Linux 新聞組上款觀看關(guān)于數(shù)據(jù)庫的基準測試結(jié)果沒完沒了的爭論的保持懷疑的樂趣,因此我將只測試客戶程序做隨機事情的時間性能,既在理想的條件下運行跑又通過多個并發(fā)

3、進程的時候。那時我將已經(jīng)涉及DBMS之間的大多數(shù)差別,因此你應(yīng)該有了關(guān)于他們的強項和弱項的一個良好概念。 最后的部分將是你所期待的一切:結(jié)論、覆蓋的特征、實現(xiàn)、在DBMS之間的API和性能差別。 但是現(xiàn)在,準備深入數(shù)據(jù)庫管理的王國的探險吧。 獲得并安裝 PostgreSQL 位于PostgreSQL 網(wǎng)站的軟件小節(jié),有一個FTP和HTTP鏡像網(wǎng)站的列表,可從他們下載分發(fā),也有定購DBMS CD的選擇。構(gòu)造并安裝它是一個多步驟過程。 首先,如果你想要建立Postgresql的Perl語言綁定,在你系統(tǒng)上的Perl 5 可執(zhí)行文件必須已知是perl5的名字。通常,這意味著你需要做一個符號連接。 也

4、許要做的最重要的事情是創(chuàng)造一個postgres用戶。在我的系統(tǒng)上,這個命令可運行: useradd - c “ PostgreSQL Administrator” - d /opt/postgresql - g users postgres 在其他系統(tǒng)上,命令可能有所不同。注意我假定postgres是在users組里。你可能比較喜歡給數(shù)據(jù)庫主管一個它自己的組。 如果不另外說明,所有其它安裝步驟需要以用戶postgres身份來做。解開PostgreSQL下載包并進入源代碼目錄樹: tar - xvzf postgresql-6.5.2.tar.gz cd postgresql-6.5.2 用ro

5、ot用戶,創(chuàng)建PostgreSQL目錄并把交給postgres用戶: mkdir /opt/pgsql chown postgres.users /opt/pgsql 進入源代碼目錄并配置軟件包。我用下列選擇: ./configure - prefix=/opt/pgsql - with-perl 進行構(gòu)造和安裝過程: cd . /doc make install cd . /src make all make install現(xiàn)在是執(zhí)行一些附加的系統(tǒng)配置的時間了。 作為root,將下行 /opt/pgsql/lib 加入/etc/ld.so.conf并運行l(wèi)dconfig。 安裝Perl綁定,

6、當用root登錄后: cd interface/perl5 make install 設(shè)置postgres賬號。將下列行增加到.profile文件中: PATH=$PATH:/opt/pgsql/bin MANPATH=$MANPATH:/opt/pgsql/man PGLIB=/opt/pgsql/lib PGDATA=/opt/pgsql/data export PATH MANPATH PGLIB PGDATA LC_COLLATE=C LC_CTYPE=C export LC_COLLATE LC_CTYPE 最后3行對init過程和也許某些測試是必要的試。對實際的用戶,他們當然應(yīng)該設(shè)

7、置到適當?shù)默F(xiàn)場,但是每個使用 PostgreSQL的人至少需要有PGLIB和PGDATA的設(shè)置。 Source .profile文件: source .profile 運行后期安裝: initdb 獲得并安裝 MySQL MySQL的最新版本可從MySQL下載頁。有很多可選擇的鏡像站點。你需要執(zhí)行下列步驟: 解開包并進入源代碼目錄樹: tar - xvzf mysql-3.22.26a.tar.gz cd mysql-3.22.26a 配置軟件包;我使用下列選項目: ./configure - prefix=/opt/mysql 構(gòu)造它: make 安裝它;用root用戶: make inst

8、all 然后你需要配置安裝: 作為root用戶,創(chuàng)建授權(quán)數(shù)據(jù)庫表: scripts/mysql_install_db 作為root,啟動服務(wù)器: /opt/mysql/bin/safe_mysqld & 作為root,創(chuàng)建mysql用戶: useradd - c “ MySQL Administrator” - d /opt/mysql - g users mysql 作為root,把安裝樹屬權(quán)賦給mysql用戶:獲得并安裝 mSQL 下載mSQL不比下載PostgreSQL或MySQL那樣簡單, 但是,其分發(fā)更小。從Hughes技術(shù)網(wǎng)頁開始并且尋找更進一步的指令。為了下載mSQL,首先需要在

9、該站點注冊并且通過一個基于CGI的下載系統(tǒng),如有必要允許你在一些鏡像站點間選擇。構(gòu)造和安裝的mSQL的步驟如下: 解開包并進入源代碼目錄: tar - xvzf msql-2.0.11.tar.gz cd msql-2.0.11 產(chǎn)生目標定義: make target 進入你平臺的目標目錄: cd targets/Linux-2.2.12-i586 配置軟件包: ./setup 編輯site.mm;我將安裝路徑改成/opt/msql。 構(gòu)造它: make all 作為root 用戶安裝它: make install 在構(gòu)造和安裝的mSQL以后,你需要配置它: 作為root,創(chuàng)建msql用戶:

10、useradd - c “mSQL Administrator” - d /opt/msql - g users msql 作為root,把目錄屬權(quán)交給msql用戶: chown - R msql.users /opt/msql 據(jù)庫設(shè)計編者按:這是涉及可自由地獲得的Linux DBMS的系列文章的第二部分。 為了測試并比較3個數(shù)據(jù)庫管理系統(tǒng),我當然需要一個數(shù)據(jù)庫來管理他們。在讀完了SQL傻瓜書后,我有了一些如何設(shè)計現(xiàn)實的數(shù)據(jù)庫的基本知識,因此我揀選了一特別無聊的真實世界情形(一個因特網(wǎng)書店,其他?)并且寫下了一個小型數(shù)據(jù)庫設(shè)計以便探討一點Sql的能力。 在這個數(shù)據(jù)庫里有5個表,BOOK保存可

11、得到的書的登記信息;CUSTOMER包含登記的顧客。對每份訂單,BOOKORDER創(chuàng)建一行,參照其顧客。對每個定購的項目,在ORDER_POSITION里引用它的訂單號。作為一種獎勵,針對書的排名我增加了一RATING表。 下列的SQL代碼可裝入到一個數(shù)據(jù)庫系統(tǒng)的SQL監(jiān)控程序并且被接受應(yīng)該沒有任何問題。所有的表在創(chuàng)建前被刪除因此確保他們不會在創(chuàng)建之前已經(jīng)存在。DROP TABLE BOOK; CREATE TABLE BOOK ( ARTICLE_NO INTEGER PRIMARY KEY, AUTHOR_FIRST_NAMES CHARACTER(30), AUTHOR_LAST_NAM

12、ES CHARACTER(30), TITLE CHARACTER(30), ISBN CHARACTER(13) UNIQUE, WHOLESALE_PRICE NUMERIC(4,2), RETAIL_PRICE NUMERIC(4,2), COPIES_AVAILABLE INTEGER ); DROP TABLE CUSTOMER; CREATE TABLE CUSTOMER ( CUSTOMER_NO INTEGER PRIMARY KEY, FIRST_NAMES CHARACTER(30), LAST_NAMES CHARACTER(30), STREET CHARACTER(3

13、0), HOUSE_NO SMALLINT, POSTCODE CHARACTER(7), TOWN CHARACTER(30), ISO_COUNTRY_CODE CHARACTER(2) ); DROP TABLE BOOKORDER; CREATE TABLE BOOKORDER ( ORDER_NO INTEGER PRIMARY KEY, CUSTOMER_NO INTEGER NOT NULL, ORDERED DATE, DELIVERY DATE, STATUS CHARACTER(8) CHECK (STATUS IN (ACCEPTED, DELAYED, SHIPPED,

14、 RETURNED, PAID), CONSTRAINT CUSTOMER_FK FOREIGN KEY (CUSTOMER_NO) REFERENCES KUNDE (KUNDENNAME) ); DROP TABLE ORDER_POSITION; CREATE TABLE ORDER_POSITION ( POSITION_NO INTEGER PRIMARY KEY, ORDER_NO INTEGER NOT NULL, ARTICLE_NO INTEGER NOT NULL, NUMBER SMALLINT, CONSTRAINT ORDER_FK FOREIGN KEY (ORDE

15、R_NO) REFERENCES BOOKORDER (ORDER_NO), CONSTRAINT BOOK_FK FOREIGN KEY (ARTICLE_NO) REFERENCES BOOK (ARTICLE_NO) ); DROP TABLE RATING; CREATE TABLE RATING ( RATING_NO INTEGER PRIMARY KEY, ARTICLE_NO INTEGER NOT NULL, SCORE NUMERIC(1,0), COMMENT CHARACTER VARYING(300), CONSTRAINT BOOK_FK FOREIGN KEY (

16、ARTICLE_NO) REFERENCES BOOK (ARTICLE_NO) ); 當然,這是一個極其簡單的數(shù)據(jù)庫。它看上去真實,但是它不適用于真實世界的應(yīng)。它不保存顧客記錄或任何東西,并且它甚至沒有書的出版商的列。它只是一個測試環(huán)境。 注意我不想花大氣力強制CUSTOMER.ISO_COUNTRY_CODE為今天是實際有效的編碼。我在代碼做了一點限制以測試數(shù)據(jù)庫系統(tǒng)是否接受他們;我沒嘗試使數(shù)據(jù)庫無懈可擊。 改變設(shè)計適應(yīng)PostgreSQL當我將遵循ANSI標準的CREATE TABLE語句裝入Postgresql的psql監(jiān)控視程序是,我遇到的困難是很少的。我得到一些警告:外部關(guān)鍵字限制

17、被接受但還沒有實現(xiàn),而且我不得不裁減RATING的COMMENT字段到255個字符,因為這是PostgreSQL的CHARACTER VARYING類型的字段的最大字段寬度。系統(tǒng)為存儲大量數(shù)據(jù)提供BLOB數(shù)據(jù)類型,但是它們不在標準版本內(nèi),因此我決定了不使用他們。另外的問題是相當愚蠢-因為我不能找到有關(guān)PostgreSQL如何強制NUMERIC到C數(shù)據(jù)類型,也因為我不想使用float以避免舍入,我決定使得貨幣字段為分值(cent)的整數(shù)數(shù)字。 我最后得到了這個略有不同的腳本: DROP TABLE BOOK; CREATE TABLE BOOK ( ARTICLE_NO INTEGER PRIM

18、ARY KEY, AUTHOR_FIRST_NAMES CHARACTER(30), AUTHOR_LAST_NAMES CHARACTER(30), TITLE CHARACTER(30), ISBN CHARACTER(13) UNIQUE, WHOLESALE_PRICE INTEGER, RETAIL_PRICE INTEGER, COPIES_AVAILABLE INTEGER ); DROP TABLE CUSTOMER; CREATE TABLE CUSTOMER ( CUSTOMER_NO INTEGER PRIMARY KEY, FIRST_NAMES CHARACTER(3

19、0), LAST_NAMES CHARACTER(30), STREET CHARACTER(30), HOUSE_NO SMALLINT, POSTCODE CHARACTER(7), TOWN CHARACTER(30), ISO_COUNTRY_CODE CHARACTER(2) ); DROP TABLE BOOKORDER; CREATE TABLE BOOKORDER ( ORDER_NO INTEGER PRIMARY KEY, CUSTOMER_NO INTEGER NOT NULL, ORDERED DATE, DELIVERY DATE, STATUS CHARACTER(

20、8) CHECK (STATUS IN (ACCEPTED, DELAYED, SHIPPED, RETURNED, PAID), CONSTRAINT CUSTOMER_FK FOREIGN KEY (CUSTOMER_NO) REFERENCES KUNDE (KUNDENNAME) ); DROP TABLE ORDER_POSITION; CREATE TABLE ORDER_POSITION ( POSITION_NO INTEGER PRIMARY KEY, ORDER_NO INTEGER NOT NULL, ARTICLE_NO INTEGER NOT NULL, NUMBER

21、 SMALLINT, CONSTRAINT ORDER_FK FOREIGN KEY (ORDER_NO) REFERENCES BOOKORDER (ORDER_NO), CONSTRAINT BOOK_FK FOREIGN KEY (ARTICLE_NO) REFERENCES BOOK (ARTICLE_NO) ); DROP TABLE RATING; CREATE TABLE RATING ( RATING_NO INTEGER PRIMARY KEY, ARTICLE_NO INTEGER NOT NULL, SCORE SMALLINT, COMMENT CHARACTER VA

22、RYING(255), CONSTRAINT BOOK_FK FOREIGN KEY (ARTICLE_NO) REFERENCES BOOK (ARTICLE_NO) ); 使設(shè)計適應(yīng)MySQL MySQL象PostgreSQL一樣忽略外部關(guān)鍵字的限制,但是它搞了個UNIQUE限制。最后的腳本與PostgreSQL腳本差不多: DROP TABLE BOOK; CREATE TABLE BOOK ( ARTICLE_NO INTEGER PRIMARY KEY, AUTHOR_FIRST_NAMES CHARACTER(30), AUTHOR_LAST_NAMES CHARACTER(30)

23、, TITLE CHARACTER(30), ISBN CHARACTER(13), WHOLESALE_PRICE INTEGER, RETAIL_PRICE INTEGER, COPIES_AVAILABLE INTEGER ); DROP TABLE CUSTOMER; CREATE TABLE CUSTOMER ( CUSTOMER_NO INTEGER PRIMARY KEY, FIRST_NAMES CHARACTER(30), LAST_NAMES CHARACTER(30), STREET CHARACTER(30), HOUSE_NO SMALLINT, POSTCODE C

24、HARACTER(7), TOWN CHARACTER(30), ISO_COUNTRY_CODE CHARACTER(2) ); DROP TABLE BOOKORDER; CREATE TABLE BOOKORDER ( ORDER_NO INTEGER PRIMARY KEY, CUSTOMER_NO INTEGER NOT NULL, ORDERED DATE, DELIVERY DATE, STATUS CHARACTER(8), CONSTRAINT CUSTOMER_FK FOREIGN KEY (CUSTOMER_NO) REFERENCES KUNDE (KUNDENNAME

25、) ); DROP TABLE ORDER_POSITION; CREATE TABLE ORDER_POSITION ( POSITION_NO INTEGER PRIMARY KEY, ORDER_NO INTEGER NOT NULL, ARTICLE_NO INTEGER NOT NULL, NUMBER SMALLINT, CONSTRAINT ORDER_FK FOREIGN KEY (ORDER_NO) REFERENCES BOOKORDER (ORDER_NO), CONSTRAINT BOOK_FK FOREIGN KEY (ARTICLE_NO) REFERENCES B

26、OOK (ARTICLE_NO) ); DROP TABLE RATING; CREATE TABLE RATING ( RATING_NO INTEGER PRIMARY KEY, ARTICLE_NO INTEGER NOT NULL, SCORE NUMERIC(1,0), COMMENT CHARACTER VARYING(255), CONSTRAINT BOOK_FK FOREIGN KEY (ARTICLE_NO) REFERENCES BOOK (ARTICLE_NO) ); 使設(shè)計適應(yīng) mSQL 因為mSQL是一個精簡的數(shù)據(jù)庫管理器(的確,有些人可能懷疑MySQL和mSQL是

27、否是數(shù)據(jù)庫管理系統(tǒng)),它放棄了大多數(shù)Sql的功能而僅僅接受SQL的一個嚴格限制的子集。這樣,mSQL的腳本看上有很大不同: DROP TABLE BOOK CREATE TABLE BOOK ( ARTICLE_NO INTEGER NOT NULL, AUTHOR_FIRST_NAMES CHARACTER(30), AUTHOR_LAST_NAMES CHARACTER(30), TITLE CHARACTER(30), ISBN CHARACTER(13), WHOLESALE_PRICE MONEY, RETAIL_PRICE MONEY, COPIES_AVAILABLE INTEG

28、ER ) DROP TABLE CUSTOMER CREATE TABLE CUSTOMER ( CUSTOMER_NO INTEGER NOT NULL, FIRST_NAMES CHARACTER(30), LAST_NAMES CHARACTER(30), STREET CHARACTER(30), HOUSE_NO SMALLINT, POSTCODE CHARACTER(7), TOWN CHARACTER(30), ISO_COUNTRY_CODE CHARACTER(2) ) DROP TABLE BOOKORDER CREATE TABLE BOOKORDER ( ORDER_

29、NO INTEGER NOT NULL, CUSTOMER_NO INTEGER NOT NULL, ORDERED DATE, DELIVERY DATE, STATUS CHARACTER(1) ) DROP TABLE ORDER_POSITION CREATE TABLE ORDER_POSITION ( POSITION_NO INTEGER NOT NULL, ORDER_NO INTEGER NOT NULL, ARTICLE_NO INTEGER NOT NULL, NUMBER SMALLINT ) DROP TABLE RATING CREATE TABLE RATING

30、( RATING_NO INTEGER NOT NULL, ARTICLE_NO INTEGER NOT NULL, SCORE SMALLINT, COMMENT TEXT(255) ) 幾乎所有的約束都不見了,并且NUMERIC和CHARACTER VARYING分別由MONEY和TEXT代替。 在mSQL的監(jiān)視程序中有令人沮喪的不足:它似乎不能接受從標準輸入輸入SQL腳本,這樣, 需要剪切/粘貼代碼。mSQL也討厭分號;最終我只能一個一個地輸入命令并用g(“go”斜杠命令)終止每條命令 。 實現(xiàn)測試客戶 為了比較3個數(shù)據(jù)庫管理器,我決定為執(zhí)行在bookstore數(shù)據(jù)庫上的交易的目的用C寫

31、了一個測試客戶。結(jié)果,我實現(xiàn)了一些操作,它們能比較API。為了性能比較,我隨后充分實現(xiàn)了它們,并且把一個非交互式模式加入客戶程序,因此它能自己運行,產(chǎn)生隨意的數(shù)據(jù)且隨機執(zhí)行交易。 我決定了在樣品數(shù)據(jù)庫上實現(xiàn)下列行動: 增加一本新書: INSERT INTO BOOK (.) VALUES (.); 刪除一本存在的書: DELETE FROM BOOK WHERE ARTICLE_NO=.; 增加一個顧客: INSERT INTO CUSTOMER (.) VALUES (.); 刪除一個顧客: DELETE FROM CUSTOMER WHERE CUSTOMER_NO=.; 訂書的一個顧客:

32、 INSERT INTO BOOKORDER (.) VALUES (.); INSERT INTO ORDER_POSITION (.) VALUES (.); 評估一本書的一個顧客: INSERT INTO RATING (.) VALUES (.); 改變一份訂單的狀態(tài): UPDATE BOOKORDER SET STATUS=. WHERE ORDER_NO=.; 然后,能生成下列報表: 書籍列表: SELECT * FROM BOOK; 顧客列表: SELECT * FROM CUSTOMER; 正在投遞的交貨表,按狀態(tài)排序: SELECT * FROM BOOKORDER ORDE

33、R BY STATUS; 書籍的利潤額,最后有平均值: SELECT RETAIL_PRICE-WHOLESALE_PRICE FROM BOOK; SELECT AVG(RETAIL_PRICE-WHOLESALE_PRICE) FROM BOOK; 書評、評級和為一本書的平均評級: SELECT * FROM RATING WHERE ARTICLE_NO=.; SELECT AVG(SCORE) FROM RATING WHERE ARTICLE_NO=.; 將客戶帶入PostgreSQL的生活 關(guān)于用C編程PostgreSQL的好處是你能使用嵌入式SQL。(而且,至少我喜歡它)它不是很

34、好地文檔化,但是ESQL預(yù)處理器ecpg運行并能產(chǎn)生PostgreSQL接口代碼就好。Sql 的定式思維方法有時妨礙了我;但是,開發(fā)客戶程序并不是很難的。 我說過“不是很好地文檔化”嗎?那是一個保守說法。否則PostgreSQL完整的HTML 文檔在這方面非常缺乏。我從書本得到的ESQL知識是初級的,而且聯(lián)機文檔沒幫助太多,因此我不得不自己了解如何由ecpg將C的變量強制轉(zhuǎn)換為NUMERIC值-還有其他東西,而且,ESQL預(yù)處理器不是很詳細,且無論何時它碰到任何小錯誤,總是似乎完全釋放出來,這對任何從事又長期準備的項目的人來說將是一個持久戰(zhàn)。 在編程PostgreSQL的客戶程序時,我碰到了一

35、些小錯誤。例如,如果文檔記錄是可能的話,在聲明一個光標(cursor)時,ecpg將不接受一個 FOR READ ONLY子句 。ORDER BY子句甚至沒被實現(xiàn)。我遇見的問題大都ecpg預(yù)處理器有關(guān)。Postgres有一個 C API(不管怎么說,ESQL需要被編譯進一些東西),它可能是優(yōu)秀的,但是我沒使用它(這就是生活)。當有ESQL時,我準備使用ESQL。 這是摘自postgres-client.pgc的list_books()函數(shù): void list_books(void) EXEC SQL BEGIN DECLARE SECTION; int article_no; char au

36、thor_first_names30; char author_last_names30; char title30; char isbn14; int wholesale_price; int retail_price; int copies_available; EXEC SQL END DECLARE SECTION; EXEC SQL DECLARE book_cursor CURSOR FOR SELECT ARTICLE_NO, AUTHOR_FIRST_NAMES, AUTHOR_LAST_NAMES, TITLE, ISBN, WHOLESALE_PRICE, RETAIL_P

37、RICE, COPIES_AVAILABLE FROM BOOK; EXEC SQL OPEN book_cursor; while (1) EXEC SQL FETCH NEXT FROM book_cursor INTO :article_no, :author_first_names, :author_last_names, :title, :isbn, :wholesale_price, :retail_price, :copies_available; if (sqlca.sqlcode = 100) /* 100 = NOT FOUND */ break; /* bail out

38、*/ printf(nArticle no. %dn, article_no); printf(%s, %s:n, author_last_names, author_first_names); printf( %s (%s)n, title, isbn); printf(Bought at %d; selling at %d; %d copies availablenn, wholesale_price, retail_price, copies_available); ; EXEC SQL CLOSE book_cursor; 代碼是相當直觀。它聲明一些宿主變量,在一個BEGIN/END

39、DECLARE SECTION構(gòu)造中包裝聲明,打開一個SELECT光標查詢,并且然后一行一行地取到宿主變量中,光標然后關(guān)閉。 我使用了更舊的, 遭到一致反對的sqlcode變量而不是更現(xiàn)代的sqlstate,因為這種方式更容易檢查一個NOT FOUND情形。 把客戶帶入MySQL的生活 Mysql的C API是相當易用的。核心元素是包含有關(guān)數(shù)據(jù)庫連接的信息和其狀態(tài)的結(jié)構(gòu),它通過連接MySQL服務(wù)器進行初始化。該結(jié)構(gòu)的一根指針必須被傳遞給所有的 MySQL 客戶函數(shù)。 查詢以字符串提交;這意味著一個人必須處理 C 字符串變換功能,包含空字節(jié)(0) 的數(shù)據(jù)應(yīng)該能使用,情況變得更復(fù)雜了,因為隨后傳遞

40、了一個計數(shù)字符串而不是一個 C字符串。 為了獲取查詢結(jié)果,一個指向MYSQL_RES結(jié)構(gòu)的指針和一個數(shù)值變量用適當?shù)?API 函數(shù)初始化,然后將一行取進一個MYSQL_ROW變量,它是一個字符串數(shù)組,直接將結(jié)果放進整數(shù)變量,就像Postgresql的ESQL的實現(xiàn)能做的那樣,但這是不可能的,結(jié)果緩沖區(qū)隨后被釋放。只要你能理解,語義幾乎與在ESQL使用光標相同。 list_books(void) int count; MYSQL_RES *result; mysql_query(&bookstore, SELECT ARTICLE_NO, AUTHOR_FIRST_NAMES,AUTHOR_LA

41、ST_NAMES, TITLE, ISBN, WHOLESALE_PRICE, RETAIL_PRICE,COPIES_AVAILABLE FROM BOOK); result = mysql_store_result(&bookstore); for(count = mysql_num_rows(result); count 0; count-) MYSQL_ROW record; record = mysql_fetch_row(result); printf(nArticle no. %sn, record0); printf(%s, %s:n, record2, record1); p

42、rintf( %s (%s)n, record3, record4); printf(Bought at %s; selling at %s; %s copies availablenn, record5, record6, record7); ; mysql_free_result(result); mysql_free_result ( 結(jié)果 ); API函數(shù)簡明扼要,但足夠了, Texinfo格式的文檔作為Mysql文檔的主要來源。把客戶帶入mSQL的mSQL和Mysql C API 之間的差別非常非常小。這樣, 甚至可能有一個自動變換器。主要的差別是: mSQL 不存儲連接數(shù)據(jù)塊, 僅

43、存一個數(shù)字(int bookstore) 一些 mSQL 函數(shù)不拿連接作為一個參數(shù) mSQL 函數(shù)名字是Pascal風(fēng)格(他們使用大寫首字符而不是下劃線) 方便的MONEY數(shù)據(jù)類型是一個有2個的十進制位的固定精度小數(shù)類型。為了使mSQL正確地在MONEY列中將分幣(cent)存入整數(shù)數(shù)字里,我需要轉(zhuǎn)換他們,強制到float,分離他們并且在add_new_book()函數(shù)中的sprintf語句格式化他們。 這是list_books(), 移植到 mSQL : void list_books(void) int count; m_result *result; msqlQuery(bookstor

44、e, SELECT ARTICLE_NO, AUTHOR_FIRST_NAMES,AUTHOR_LAST_NAMES, TITLE, ISBN, WHOLESALE_PRICE, RETAIL_PRICE,COPIES_AVAILABLE FROM BOOK); result = msqlStoreResult(); for(count = msqlNumRows(result); count 0; count-) m_row record; record = msqlFetchRow(result); printf(nArticle no. %sn, record0); printf(%s,

45、 %s:n, record2, record1); printf( %s (%s)n, record3, record4); printf(Bought at %s; selling at %s; %s copies availablenn, record5, record6, record7); ; msqlFreeResult(result); mSQL的 C API文檔可以在mSQL 手冊里找到,它以PostScript和一個大的HTML文件與mSQL一起發(fā)行。 一些早期結(jié)論 所有這3個討論的數(shù)據(jù)庫系統(tǒng)是相當容易安裝、設(shè)置和編程。實現(xiàn)C API的客戶庫是很小的;與現(xiàn)今的比如GUI工具箱,

46、他們的大小是可以忽略的,并且在客戶程序的二進制大小或存儲器足跡(footprint)沒有太大的差別。 Postgresql的ESQL API的不斷增加的冗長和更長的準備時間通過少花些精力在轉(zhuǎn)換字符串到非字符串后反過來進行彌補。 到目前為止, 我沒有說過任何關(guān)于性能的事情。我將在這個系列的下一部分做深入研究。 評估大量因素 我們將要在中途改變方向。在這部分,我將涉及與性能無關(guān)的話題。在下一個并且是最后一部分,我將全面研究基準測試并以最終結(jié)論結(jié)束。 一般差別 不同于PostgreSQL,MySQL和mSQL不是真正的關(guān)系數(shù)據(jù)庫管理系統(tǒng)。我看到有人在新聞組里把MySQL稱為“只是一個快速存儲工具”,并且mSQL甚至被稱為了一個玩具-不敢恭維。至少mSQL實現(xiàn)了部分一個完整的SQL DBM應(yīng)該提供的功能。 如果一個人需要一個真實的RDBMS,三者中唯一可行的選擇是PostgreSQL。如果計算原始的性能表現(xiàn),特別是如果對數(shù)據(jù)庫所做的存取并不復(fù)雜并且大多數(shù)是自動的,一個更小的系統(tǒng)可能更好一些。因此,mSQL和MySQL被宣傳為網(wǎng)數(shù)據(jù)庫系統(tǒng)。 許可證PostgreSQL以一個B

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論