【摘要】隨著計算機技術(shù)和數(shù)據(jù)處理技術(shù)的發(fā)展,數(shù)據(jù)庫管理軟件得到了越來越廣泛的應用。其中Oracle和MySql都是現(xiàn)在廣泛被應用的數(shù)據(jù)庫管理軟件,兩者在SQL語法操作方面幾乎相同,但是在語法的執(zhí)行過程中實現(xiàn)的原理有所差別,最近筆者在一個項目中將數(shù)據(jù)庫由Oracle變?yōu)榱薓ySql,結(jié)果原來的幾個聯(lián)合查詢語句的執(zhí)行效率急劇下降,甚至有時導致內(nèi)存溢出,這說明兩個數(shù)據(jù)庫在執(zhí)行SQL的原理方面有所差異。本文僅就聯(lián)合查詢討論兩者差異。
【關(guān)鍵詞】OracleMySql執(zhí)行原理聯(lián)合查詢差異
Oracle和MySql都是目前得到廣泛應用的數(shù)據(jù)庫,兩者在SQL語句語法方面大致相同,但是在SQL的解析執(zhí)行機制上卻有比較明顯的差異,開發(fā)人員在項目的數(shù)據(jù)庫需要在兩者間變換的時候要注意這些差異,以免給工作帶來不必要的麻煩。本文僅結(jié)合筆者不久前的工作經(jīng)歷簡單討論下兩者連表查詢過程中的差異。
一、Oracle和MySql簡介
Oracle數(shù)據(jù)庫系統(tǒng)是美國ORACLE公司(甲骨文)提供的以分布式數(shù)據(jù)庫為核心的一組軟件產(chǎn)品,是目前最流行的C/S(客戶端/服務器)或B/S(瀏覽器/服務器)體系結(jié)構(gòu)的數(shù)據(jù)庫之一。ORACLE數(shù)據(jù)庫是目前世界上使用最為廣泛的數(shù)據(jù)庫管理系統(tǒng),作為一個通用的數(shù)據(jù)庫系統(tǒng),它具有完整的數(shù)據(jù)管理功能;作為一個關(guān)系數(shù)據(jù)庫,它是一個完備關(guān)系的產(chǎn)品;作為分布式數(shù)據(jù)庫它實現(xiàn)了分布式處理功能。
MySQL是一個小型關(guān)系型數(shù)據(jù)庫管理系統(tǒng),開發(fā)者為瑞典MySQL AB公司。在2008年1月16號被Sun公司收購。而2009年,SUN又被Oracle收購。MySQL是一種關(guān)聯(lián)數(shù)據(jù)庫管理系統(tǒng),關(guān)聯(lián)數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個大倉庫內(nèi)。這樣就增加了速度并提高了靈活性。MySQL軟件采用了GPL(GNU通用公共許可證)。由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,許多中小型網(wǎng)站為了降低網(wǎng)站總體擁有成本而選擇了MySQL作為網(wǎng)站數(shù)據(jù)庫。
Oracle和MySql都支持SQL(結(jié)構(gòu)化查詢語言)。SQL是用于訪問數(shù)據(jù)庫的最常用標準化語言。
二、問題的出現(xiàn)
由于某些原因,一個項目的數(shù)據(jù)庫由oracle更換為了MySql,數(shù)據(jù)庫變化后項目的大部分功能都正常,但是原來的幾個聯(lián)合查詢語句的執(zhí)行效率急劇下降,甚至有時導致內(nèi)存溢出。
三、問題的模擬和分析
為了分析上述問題,分別在Oracle和MySql數(shù)據(jù)庫中建立完全相同的兩個表:city表;(字段:id,cityname)person表(字段:id,name,cityid)。City表中有100條記錄,然后通過逐漸增加person表中記錄,觀察并記錄在此過程中執(zhí)行聯(lián)合查詢兩者的差異。
當person表中記錄比較少的時候,兩者的執(zhí)行速度沒有明顯差異,很值MySql還占有微弱的優(yōu)勢,這表明作為一款開源數(shù)據(jù)庫軟件,其性能還是相當優(yōu)越的。
當person表中的記錄數(shù)增加到幾十萬條的時候,兩者的執(zhí)行效率開始出現(xiàn)差別,MySql的執(zhí)行速度開始下降。
當person表中的記錄數(shù)到達100萬的時候,oracle仍然可以正常執(zhí)行聯(lián)合查詢的操作;而MySql的報出了內(nèi)存溢出的錯誤。
由上述實驗過程可知:對于完全相同的一條聯(lián)合查詢的SQL語句,盡管表面上看來兩個數(shù)據(jù)庫都在進行同樣的查詢操作,但是在實現(xiàn)的原理和機制上是不同的。
在MySQL performance tunning的課程當中,老師曾經(jīng)指出:MySql對聯(lián)合查詢的支持并不完善,只是簡單的做了笛卡爾乘積而沒有進行適當?shù)膬?yōu)化操作。當數(shù)據(jù)量小的時候,還感覺不出來這個不足,但是當數(shù)據(jù)量大的時候,這個缺點就變得相當突出,甚至成為系統(tǒng)效率的最大瓶頸。
對比之下,Oracle數(shù)據(jù)庫對聯(lián)合查詢操作進行了優(yōu)化處理,因此在上面的實驗只可以順利的執(zhí)行完百萬條記錄的聯(lián)合查詢操作。
四、問題解決方法
通過上面的實驗和對相關(guān)資料的查詢和分析,問題的原因已經(jīng)發(fā)現(xiàn),需要在應用MySql數(shù)據(jù)庫的條件下采取正確的聯(lián)合查詢解決方案。
MySql官方對于上述問題給出的推薦解決方案是:對于大數(shù)量的多表數(shù)據(jù)提取,不要在SQL語句中進行聯(lián)合查詢操作,推薦在軟件中進行數(shù)據(jù)的分別查詢和拼接處理操作,即變聯(lián)合查詢操作為兩次或者多次的單表查詢操作和一次或者多次的數(shù)據(jù)拼接操作。
按照上述推薦方案,變兩個表的聯(lián)合查詢操作為兩次單表查詢操作和一次數(shù)據(jù)拼接操作,這些操作都在軟件中實現(xiàn),經(jīng)測試可以正常運行。
至此,問題解決。
五、結(jié)束語
本文中所探討的只是兩款數(shù)據(jù)庫軟件的差異之一,當然兩者之間還存在著很多的差別,其中有些無足輕重,有的卻非常重要,值得引起程序員和開發(fā)者的高度重視,因為這些差異會在系統(tǒng)進行數(shù)據(jù)庫變換和用多種數(shù)據(jù)庫進行開發(fā)工作時嚴重影響系統(tǒng)的性能,甚至導致系統(tǒng)癱瘓。
學習和掌握這些差異將避免給工作帶來不必要的麻煩并達到事半功倍的效果,對提高工作效率和工作質(zhì)量起到一定作用。