程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MYSQL性能調優

MYSQL性能調優

編輯:MySQL綜合教程

MYSQL性能調優


摘要

為了學習研究MySQL數據庫在工作原理,深刻理解MySQL在企業運用時如何保證其高效運行。分別從表結構的優化,SQL語句的優化,存儲引擎的選擇,索引的優化以及現今MySQL的發展與其他企業級數據庫的比較。介紹了從編碼選擇到數據類型的選擇以及從整體的角度設計表結構。在SQL語句的選擇和使用的介紹的時候,深入介紹了一些基本的使用原則以及在一般在使用過程中我們存在的誤區以及如何解決這些問題。著重介紹了MySQL的幾個存儲引擎MyISAM、InnoDB和NDBCluster的差異以及各自的適用范圍。有介紹了MySQL的索引的一些優化的建議以及高屋建瓴地闡述和比較了MySQL的優劣和發展態勢。

 

 

前言

 

 

數據庫作為應用作為廣泛,地位極為重要的中間件應用,學習和使用數據庫管理系統變得越來越重要。為了研究和總結對mysql數據庫的學習結果,特別從數據表結構、sql語句優化、存儲引擎的選擇、索引的應用、以及mysql的比較總結對mysql技術做了一個比較全面升入的介紹。使用mysql的過程中,如何更好地使用與優化越來越重要,在這篇文章中就闡述。

第一章 表結構的優化

數據表是數據庫的具體表現形式,設計優良的數據庫擁有良好的表結構,者不單單指數據庫的表需要滿足范式結構,為了更有利於具體操作,表結構還需要實際的可擴展性,以便於做增刪改查,又需要根據數據表的具體作用做出調節。在系統中被大量查詢的表的結構的設計會對系統性能產生極大的影響。如果說系統的和核心是數據庫的話,那麼設計數據庫的核心就是表結構的設計。

1.1 編碼的選擇

字符集直接決定了數據在MySQL中的存儲編碼方式,由於同樣的內容使用不同字符集表示所占用的空間大小會有較大的差異,所以通過使用合適的字符集,可以幫助我們盡可能減少數據量,進而減少IO操作次數。不要使用UTF-8或其他UNICODE字符類型,這樣可以節約大如果沒有需要使用多語言,那麼最好量的存儲空間。

比如中文就可以選擇GBK或者GB2313,而GBK是對GB2313的擴展,選擇的時候可視情況而定。

1.2 表的拆分

有些時候,我們可能會希望將一個完整的對象對應於一張數據庫表,這對於應用程序開發來說是很有好的,但是有些時候可能會在性能上帶來較大的問題。當我們的表中存在類似於TEXT或者是很大的VARCHAR類型的大字段的時候,如果我們大部分訪問這張表的時候都不需要這個字段,我們就該義無反顧的將其拆分到另外的獨立表中,以減少常用數據所占用的存儲空間。這樣做的一個明顯好處就是每個數據塊中可以存儲的數據條數可以大大增加,既減少物理IO次數,也能大大提高內存中的緩存命中率。

1.3 數據類型的選擇

數據庫操作中最為耗時的操作就是IO處理。據統計,數據庫操作90%以上的時間都花在了IO上面。所以盡可能減少IO量,可以在很大程度上提高數據庫操作的性能。

MySQL的數據類型可以精確到字段,所以當我們需要大型數據庫中存放多字節數據的時候,可以通過對不同表不同字段使用不同的數據類型來較大程度減小數據存儲量,進而降低IO操作次數並提高緩存命中率。數據類型選擇的核心思想很簡單,就是吝啬地選擇所占空間最小的數據類型。

下面的這些關於字段類型的優化建議主要適用於記錄條數較多,數據量較大的場景,因為精細化的數據類型設置可能帶來維護成本的提高,過度優化也可能會帶來其他的問題:

1.3.1 數字類型

盡量不要使用DOUBLE,不僅僅只是存儲長度的問題,同時還會存在精確性的問題。同樣,固定精度的小數,也不建議使用DECIMAL,可以乘以固定倍數轉換成整數存儲,可以大大節省存儲空間,且不會帶來任何附加維護成本。對於整數的存儲,在數據量較大的情況下,需要分開 TINYINT、INT和BIGINT的選擇,因為三者所占用的存儲空間也有很大的差別,能確定不會使用負數的字段,最好添加unsigned定義。

1.3.2 字符類型

盡量減少使用TEXT數據類型,因為它的性能要低於char或者是varchar類型的處理。定長字段,使用CHAR 類型,不定長字段使用VARCHAR,且僅僅設定適當的最大長度,而不是非常隨意的給一個很大的最大長度限定,因為不同的長度范圍,MySQL也會有不一樣的存儲處理。

1.3.3 時間類型

盡量使用TIMESTAMP類型,其存儲空間只需要 DATETIME類型的一半。對於只需要精確到某一天的數據類型,建議使用DATE類型,因為他的存儲空間只需要3個字節,比TIMESTAMP還少。

1.3.4 ENUM & SET

對於狀態字段,使用 ENUM 來存放,因為可以極大的降低存儲空間,而且即使需要增加新的類型,只要增加於末尾,修改結構也不需要重建表數據。如果是存放可預先定義的屬

性數據可以使用SET類型,即使存在多種屬性,同樣可以游刃有余,同時還可以節省不小的存儲空間。

1.3.5 LOB類型

盡量不要數據庫中存放 LOB 類型數據,對於這類大的數據類型,還是使用文件形式存儲。

1.4 適度冗余

以join操作為例,mysql每次join都會有一定的性能的要求,如果該操作需要大量的進行而所取到又是獨立的小字段,在這種情況下將該字段合並在一張表內能夠大大地降低IO,提高效率。不過,冗余的同時需要確保數據的一致性不會遭到破壞,確保更新的同時冗余字段也被更新。

另外就是NULL了,如果是一個組合索引,那麼這個NULL類型的字段會極大影響整個索引的效率。此外NULL在索引中的處理也是特殊的,也會占用額外的存放空間。很多人覺得 NULL 會節省一些空間,所以盡量讓NULL來達到節省IO的目的,但是大部分時候這會適得其反,雖然空間上可能確實有一定節省,倒是帶來了很多其他的優化問題,不但沒有將IO量省下來,反而加大了SQL的IO量。所以盡量確保默認值值不是 NULL,也是一個很好的表結構設計優化習慣。

 

 

 

 

第二章 SQL語句的優化

在進行SQL優化的時候,我們必須明確目的,也就是減少IO次數。

IO永遠是數據庫最容易瓶頸的地方,這是由數據庫的職責所決定的,大部分數據庫操作中超過90%的時間都是IO操作所占用的,減少IO次數是SQL優化中需要第一優先考慮。當然,也是收效最明顯的優化手段。另外就是降低CPU計算了,除了IO瓶頸之外,SQL優化中需要考慮的就是CPU運算量的優化了。order by, group by,distinct…都是最消耗CPU的,因為這些操作基本上都是CPU處理內存中的數據比較運算。當我們的IO優化做到一定階段之後,降低CPU計算也就成為了我們SQL優化的重要目標。

2.1 SQL優化原則

一般情況下,寫好SQL語句首先需要一個良好的思路,如何將幾張有用的表通過一個清晰的關系連接起來。往往思路越清晰得到的SQL的性能也就越好,要是本來簡單的關系通過繞了一圈得到了一個結果,可想而知計算機處理的時候也就要繞一大圈,自然降低了執行的性能。

2.1.1 盡量少join

MySQL的優勢在於簡單,但這在某些方面其實也是其劣勢。MySQL優化器效率高,但是由於其統計信息的量有限,優化器工作過程出現偏差的可能性也就更多。對於復雜的多表Join,一方面由於其優化器受限,再者在Join這方面所下的功夫還不夠,所以性能表現離Oracle等關系型數據庫前輩還是有一定距離。但如果是簡單的單表查詢,這一差距就會極小甚至在有些場景下要優於這些數據庫前輩。

2.1.2 盡量少排序

排序操作會消耗較多的CPU資源,所以減少排序可以在緩存命中率高等IO能力足夠的場景下會較大影響SQL的響應時間。對於MySQL來說,減少排序有多種辦法,比如:通過利用索引來排序的方式進行優化,減少參與排序的記錄條數,非必要不對數據進行排序.

2.1.3 盡量避免select *

一方面select *的性能不好,顯而易,它比select xx,yy from tt多花費的是獲得表中各屬性的性能。例外,我們在查詢一張表獲取一組數據的時候,大多數的時候並不需要這張表中的所有項,這時候簡單地使用select *就會造成獲得冗余的數據和浪費額外的IO。

2.1.4 盡量用join代替子查詢

我們剛才講到盡量少使用join,但是join在有的時候是必須要使用的,特別是幾張表一起處理的時候。而相對於join,子查詢更加消耗性能。這個也很容易理解,因為子查詢的時候會在內存中內子查詢的結果生成一張表然後再經過父查詢得出最終結構,相當於經歷了多次查詢而且浪費了一定的內存空間。

2.1.5 盡量少 or

因為很多時候使用 union all 或者是union(必要的時候)的方式來代替“or”會得到更好的效果。

2.1.6 盡量用 union all 代替 union

union 和 union all 的差異主要是前者需要將兩個(或者多個)結果集合並後再進行唯一性過濾操作,這就會涉及到排序,增加大量的CPU運算,加大資源消耗及延遲。所以當我們可以確認不可能出現重復結果集或者不在乎重復結果集的時候,盡量使用 union all 而不是 union。

2.1.7 盡量早過濾

這一優化策略其實最常見於索引的優化設計中,將過濾性更好的字段放得更靠前。在SQL編寫中同樣可以使用這一原則來優化一些Join的SQL。比如我們在多個表進行分頁數據查詢的時候,我們最好是能夠在一個表上先過濾好數據分好頁,然後再用分好頁的結果集與另外的表 Join,這樣可以盡可能多的減少不必要的 IO 操作,大大節省 IO 操作所消耗的時間。

2.1.8 避免類型轉換

這裡所說的“類型轉換”是指 where 子句中出現 column 字段的類型和傳入的參數類型不一致的時候發生的類型轉換:

人為在column_name 上通過轉換函數進行轉換,直接導致 MySQL(實際上其他數據庫也會有同樣的問題)無法使用索引,如果非要轉換,應該在傳入的參數上進行轉換,由數據庫自己進行轉換如果我們傳入的數據類型和字段類型不一致,同時我們又沒有做任何類型轉換處理,MySQL可能會自己對我們的數據進行類型轉換操作,也可能不進行處理而交由存儲引擎去處理,這樣一來,就會出現索引無法使用的情況而造成執行計劃問題。

2.1.9 優先優化高並發的 SQL

對於破壞性來說,高並發的 SQL 總是會比低頻率的來得大,因為高並發的 SQL 一旦出現問題,甚至不會給我們任何喘息的機會就會將系統壓跨。而對於一些雖然需要消耗大量IO而且響應很慢的SQL,由於頻率低,即使遇到,最多就是讓整個系統響應慢一點,但至少可能撐一會兒,讓我們有緩沖的機會。

2.1.10 從全局出發優化,而不是片面調整

SQL 優化不能是單獨針對某一個進行,而應充分考慮系統中所有的SQL,尤其是在通過調整索引優化SQL的執行計劃的時候,千萬不能顧此失彼,因小失大。盡可能對每一條運行在數據庫中的SQL進行explain。優化 SQL,需要做到心中有數,知道 SQL的執行計劃才能判斷是否有優化余地,才能判斷是否存在執行計劃問題。在對數據庫中運行的 SQL 進行了一段時間的優化之後,很明顯的問題 SQL 可能已經很少了,大多都需要去發掘,這時候就需要進行大量的 explain 操作收集執行計劃,並判斷是否需要進行優化。

2.2 SQL優化誤區

在我們生活中有很多我們想當然的事情,但是事實卻正好相反。在SQL優化的過程中也有這樣的誤區。

2.2.1 關於count() 的一些誤區

通常我們會認為count(1)和count(primary_key)要優於 count(*)。

很多人為了統計記錄條數,就使用 count(1) 和 count(primary_key) 而不是 count(*) ,他們認為這樣性能更好,其實這是一個誤區。對於有些場景,這樣做可能性能會更差,因為數據庫對 count(*) 計數操作做了一些特別的優化。

但是count(column) 和 count(*) 是一樣的嗎?

這個誤區甚至在很多的資深工程師或者是 DBA 中都普遍存在,很多人都會認為這是理所當然的。實際上,count(column)和 count(*) 是一個完全不一樣的操作,所代表的意義也完全不一樣。

count(column) 是表示結果集中有多少個column字段不為空的記錄。

count(*) 是表示整個結果集有多少條記錄。

2.2.2 關於select 的一些誤區

同樣一般我們會認為select a,b from … 比 select a,b,c from … 可以讓數據庫訪問更少的數據量,因而效率會更高。

這個誤區主要存在於大量的開發人員中,主要原因是對數據庫的存儲原理不是太了解。

實際上,大多數關系型數據庫都是按照行(row)的方式存儲,而數據存取操作都是以一個固定大小的IO單元(被稱作 block 或者 page)為單位,一般為4KB,8KB… 大多數時候,每個IO單元中存儲了多行,每行都是存儲了該行的所有字段(lob等特殊類型字段除外)。

所以,我們是取一個字段還是多個字段,實際上數據庫在表中需要訪問的數據量其實是一樣的。

當然,也有例外情況,那就是我們的這個查詢在索引中就可以完成,也就是說當只取 a,b兩個字段的時候,不需要回表,而c這個字段不在使用的索引中,需要回表取得其數據。在這樣的情況下,二者的IO量會有較大差異。

2.2.1 使用order by一定需要排序操作?

我們知道索引數據實際上是有序的,如果我們需要的數據和某個索引的順序一致,而且我們的查詢又通過這個索引來執行,那麼數據庫一般會省略排序操作,而直接將數據返回,因為數據庫知道數據已經滿足我們的排序需求了。

實際上,利用索引來優化有排序需求的 SQL,是一個非常重要的優化手段。

第三章 存儲引擎的優化

MySQL的存儲引擎是關系型數據庫產品中最具有特色的了,不僅可以同時使用多種存儲引擎,而且每種存儲引擎和MySQL之間使用插件方式這種非常松的耦合關系。在應對不同場景的處理的時候,選擇不同的存儲引擎能夠有效地提高存儲效率。

3.1 MyISAM

3.1.1 MyISAM的特性

MyISAM存儲引擎不支持事務,所以對事務有要求的業務場景不能使用。其鎖定機制是表級索引,這雖然可以讓鎖定的實現成本很小但是也同時大大降低了其並發性能。

不僅會在寫入的時候阻塞讀取,MyISAM還會在讀取的時候阻塞寫入,但讀本身並不會阻塞另外的讀。MyISAM可以通過key_buffer緩存以大大提高訪問性能減少磁盤IO,但是這個緩存區只會緩存索引,而不會緩存數據。

3.1.2 MyISAM的適用性

MyISAM適用於不需要事務支持、並發性相對較低、數據修改相對較少的場景下。一般這類的系統會以讀為主,對數據一致性要求不是很高。

在使用該引擎的時候,可以盡量利用其緩存機制使用索引。並且調整讀寫的優先級,根據實際需求確保重要操作更優先。在必要的時候啟用延遲插入改善大批量寫入性能。在進行插入操作的時候盡量順序操作讓insert數據都寫入到尾部,減少阻塞。同時,分解大的操作,降低單個操作的阻塞時間。並注意降低並發數,某些高並發場景通過應用來進行排隊機制。處理相對靜態的數據時,充分利用Query Cache可以極大的提高訪問效率。另外,MyISAM的Count只有在全表掃描的時候特別高效,帶有其他條件的count都需要進行實際的數據訪問。

3.2 InnoDB

3.2.1 InnoDB的特性

相對於MyISAM,InnoDB完全支持4個事務隔離級別,並支持多版本讀。通過索引實現了行級鎖定,但全表掃描仍然會是表鎖,使用的時候注意間隙鎖的影響。並且讀寫阻塞與事務隔離級別相關。具有非常高效的緩存特性:能緩存索引,也能緩存數據。整個表和主鍵以Cluster方式存儲,組成一顆平衡樹。所有Secondary Index都會保存主鍵信息。

3.2.2 InnoDB的適用性

InnoDB具有較好的事務特性,也就是需要事務支持。其行級鎖定機制對高並發有很好的適應能力,但需要確保查詢是通過索引完成。能夠很好地適用於數據更新較為頻繁的場景,但是對數據一致性要求較高。如果硬件設備內存較大,可以利用InnoDB較好的緩存能力來提高內存利用率,盡可能減少磁盤 IO。

使用InnoDB需要注意主鍵盡可能小,避免給Secondary index帶來過大的空間負擔;避免全表掃描,因為會使用表鎖;盡可能緩存所有的索引和數據,提高響應速度;在大批量小插入的時候,盡量自己控制事務而不要使用autocommit自動提交;合理設置innodb_flush_log_at_trx_commit參數值,不要過度追求安全性;避免主鍵更新,因為這會帶來大量的數據移動。

3.3 NDBCluster

3.3.1 NDBCluster的特性

NDBCluster對mysql的重要的貢獻就是將分布式的概念引人了進來。作為分布式存儲引擎,可以由多個NDBCluster存儲引擎組成集群分別存放整體數據的一部分。NDBCluster和Innodb一樣,也支持事務。可與mysqld不在一台主機,也就是可以和mysqld分開存在於獨立的主機上,然後通過網絡和mysqld通信交互。但是內存需求量巨大,索引以及被索引的數據必須存放在內存中。

3.3.2 NDBCluster的適用性

NDBCluster具有非常高的並發需求,對單個請求的響應並不是非常的及時。查詢簡單,過濾條件較為固定,每次請求數據量較少,又不希望自己進行水平分片。

在使用的時候盡可能讓查詢簡單,避免數據的跨節點傳輸;盡可能滿足SQL節點的計算性能,大一點的集群SQL節點會明顯多余Data節點。在各節點之間盡可能使用萬兆網絡環境互聯,以減少數據在網絡層傳輸過程中的延時。

 

第四章 MySQL索引的優化

索引是數據庫中常用來提高性能的的技術,如何用好索引成為數據庫實現性能最大化的很重要的一方面。

4.1 索引的概述

如何進行高質量的SQL編程,對索引的理解使用是關鍵的。正確地使用索引可以是SQL語句運行得更快,而錯誤的添加索引可能會帶來災難性的結果。

4.2 索引設計的原則

索引的設計可以遵循一些已有的原則,創建索引的時候先盡量考慮符合這些規則,便於提升索引的使用效率,更好更高效地使用索引。

搜索的索引列,不一定是所要選擇的列。換句話說,適合索引的列是出現在WHERE子語句中的列,或連接句中指定的列,而不是出現在SELECT關鍵字後的選擇列表中的列。

使用唯一的索引。考慮到類中值的分布。索引的列的基數越大,索引的效果越好。例如,存放出生日期的列具有不同的值,很容易區分各行。而用來記錄性別的列,只含有“M”和“F”,則對此列進行索引沒有多大的用處,因為不管搜索到哪個值,都會得出一個大約一半的行。使用短索引。

如果對字符串列進行索引,應該指定一個前綴的長度,只要有可能就應該這樣做。例如有一個CHAR(100)的列,如果前10或20 個CHAR內,多項值是唯一的,那麼就不要對整個列進行索引了。對前10貨20個CHAR的索引可以節約大量的縮影空間,也可能使查詢更快。而且較小的索引進行的IO更少,更短的值比起來消耗的CPU運算更少。更為重要的是對於更短的鍵值,索引高速緩存中的塊能夠容納更多地鍵值,因此內存中也就能放更對的值。這樣就增加了找到行而不是讀取索引中較多塊的可能。

利用最左前綴。在創建了n列索引是也就是創建了n個索引。多列索引可以起到幾個索引的作用。因為可以利用索引中最左的列集來匹配,也就是最左前綴。

不要過度使用索引。任何事物物極必反都是其固定的哲學定律。對於索引也是一樣。每個索引都會占有一定得磁盤空間降低讀寫操作的性能。在修改表的過程中索引必須重建或更新。也就是索引越多所需要花費的時間久更長。因此在創建索引的時候需要控制好索引的對象,不能盲目的添加隨意。

第五章 MySQL的發展與比較

5.1 MySQL與Oracle的比較

實際上在Oracle收購了sun之後MySQL一並變成了Oracle的一款產品,對於Oracle與MySQL的比較也就是相當與Oracle公司內部不同部門的比較,以及不同部門選擇的技術與策略的比較。其實MySQL的發展也越來越像是一個簡版的Oracle。

1、組函數的用法規則:

MySql中組函數在select語句中可以隨意使用,但Oracle中如果查詢語句中有組函數,那其他列名必須是組函數處理過的,或者groupby 子句中的列,負則會報錯。

2、自動增長的數據類型處理:

MySql有自動增長數據類(auto_increment),插入記錄是不用操作此字段,會自動獲得數據值,Oracle中沒有自動增長數據類型,需要使用Sequence序列號。

3、單引號的處理:

MySql裡可以用雙引號包其字符串,Oracle只可以用單引號。

4、翻頁的sql語句處理:

MySql翻頁的語句比較簡單,用Limit開始位置,記錄個數,Oracle處理翻頁的sql語句比較繁瑣,需要借助於NUMROW。

5、日期處理:

MySql日期字段分Date和time兩種,Oracle日期字段只有Date,包含年月日時分秒MySql存儲當前時間用now(),Oracle用sysdate,或者將字符串轉換成日期的函數TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)。

6、空字符的處理

MYSQL的非空字段也有空的內容,ORACLE裡定義了非空字段就不容許有空的內容。按MYSQL的NOT NULL來定義ORACLE表結構,導數據的時候會產生錯誤。因此導數據時要對空字符進行判斷,如果為NULL或空字符,需要把它改成一個空格的字符串。

8.字符串的模糊比較

MYSQL裡用字段名like%‘字符串%’,ORACLE裡也可以用字段名like%‘字符串%’但這種方法不能使用索引,速度不快,用字符串比較函數instr(字段名,‘字符串’)>0會得到更精確的查找結果。

5.2 MySQL與SQL Server的比較

可以說兩者最重要的區別是MySql是一個開發開源的系統,而SQLServer則是一個保守閉源的數據庫系統。SQLServer服務器的狹隘的,保守的存儲引擎與MySQL服務器的可擴展,開放的存儲引擎絕然不同。雖然SQLServer也有sybase引擎,但MySQL能夠提供更多種的選擇,如myisam, heap,innodb,and berkeley db。但MySQL不完全支持陌生的關鍵詞,所以它比SQLServer服務器要少一些相關的數據庫。同時,MySQL也缺乏一些存儲程序的功能,比如myisam引擎聯支持交換功能。
純粹就性能而言,MySQL是相當出色的,因為它包含一個缺省桌面格式myisam。myisam數據庫與磁盤非常地兼容而不占用過多的cpu和內存。MySQL可以運行於windows系統而不會發生沖突,在unix或類似unix系統上運行則更好。你還可以通過使用64位處理器來獲取額外的一些性能。因為MySQL在內部裡很多時候都使用64位的整數處理。這事很多知名網站都使用MySQL作為後台數據庫。
當提及軟件的性能,SQLServer服務器的穩定性要比它的競爭對手強很多。但是,這些特性也要付出代價的。比如,必須增加額外復雜操作,磁盤存儲,內存損耗等等。
MySQL有一個用於改變數據的二進制日志。因為它是二進制,這一日志能夠快速地從主機上復制數據到客戶機上。即使服務器崩潰,這一二進制日志也會保持完整,而且復制的部分也不會受到損壞。在SQLServer服務器中,你也可以記錄SQLServer的有關查詢,但這需要付出很高的代價。
這兩個產品都有自己完整的安全機制。只要你遵循這些安全機制,一般程序都不會出現什麼問題。
恢復性也是MySQL的一個特點,這主要表現在myisam配置中。這種方式有它固有的缺欠,如果你不慎損壞數據庫,結果可能會導致所有的數據丟失。然而,對於SQLServer服務器而言就表現得很穩鍵。SQLServer服務器能夠時刻監測數據交換點並能夠把數據庫損壞的過程保存下來。
對於這兩種數據庫,如果非要讓我說出到底哪一種更加出色,也許我會讓你失望。以我的觀點,任一對你的工作有幫助的數據庫都是很好的數據庫,沒有哪一個數據庫是絕對的出色,也沒有哪一個數據庫是絕對的差勁。我想要告訴你的是你應該多從你自己的需要出發,即你要完成什麼樣的任務?而不要單純地從軟件的功能出發。
如果你想建立一個.net服務器體系,這一體系可以從多個不同平台訪問數據,參與數據庫的管理,那麼你可以選用SQLServer服務器。如果你想建立一個第三方站點,這一站點可以從一些客戶端讀取數據,那麼MySQL將是最好的選擇。

5.3 MySQL的發展

學習一門技術,始終會去想這門技術今後的發展前景是怎麼樣的,未來時候還能夠有活力的存在。作為一個成熟的數據庫管理系統,要滿足各種各樣的商業需求,功能肯定是會被列入重點參考對象的。MySQL的早期版本功能非常簡單,只能做一些很基礎的結構化數據存取操作,但是經過多年的改進和完善之後,現在它已經基本具備了所有通用數據庫管理系統需要的相關功能。

雖然在功能方面MySQL數據庫作為一個通用的數據庫管理系統暫時還無法和PostgreSQL相比,但是其功能完全可以滿足我們的通用商業需求,提供足夠強大的服務。而且不管是哪一種數據庫在功能方面都不敢聲稱自己比其他任何一款商用數據庫管理系統都強,甚至都不敢聲稱能夠擁有某類數據庫產品的所有功能。因為每一款數據庫管理系統都有自身的優勢,也有自身的局限,這都說明每一款產品重點服務的方向不一樣。

性能高一直是MySQL引以自豪的一個特點。在權威的第三方評測機構多次測試比較各種數據庫TPCC值的過程中,MySQL一直都有非常優異的表現,而且在其他所有商用的通用數據庫管理系統中,僅僅有Oracle數據庫能夠與其一較高下。

MySQL一直以來奉行一個原則,那就是在保證足夠穩定性的前提下,盡可能地提高自身的處理能力。也就是說,在性能和功能方面,MySQL第一考慮的要素主要還是性能,MySQL希望能夠在滿足客戶99%的需求的前提下,將剩余的所有精力都用來努力提高系統性能,而不希望自己是一個比其他任何數據庫的功能都要強大的產品。

總體來說,MySQL數據庫在發展過程中一直追求三項原則:簡單、高效、可靠。從上面簡單的比較重也可以看出,MySQL在這三項原則上面,沒有哪一項是做的不好的。而且,雖然功能並不是MySQL自身追求的原則之一,但是考慮到當前用戶量急劇增長,用戶需求越來越多樣化,MySQL也不得不在功能方面做出大量的努力,以不斷滿足客戶的新需求。

 

結論

隨著IT技術的發展,數據庫技術依然沒有改變其核心的功能,即使是各種NOSQL不斷湧現的今天,MySQL這類的關系型數據庫還是擁有著重要的地位。學好MySQL這類的開源數據庫系統進一步可深入探索行業發展的本質,退一步也可以利用MySQL這個平台提高自己的技術。本文所介紹的MySQL的一些基本知識可能只是冰山一角,在技術不斷發展的今天對MySQL的研究還會不斷地深入。特別是國內,在阿裡巴巴發動的“去IOE”的大潮下,對開源系統的推動越來越大,作為數據庫領域開源系統的頭牌,對MySQL的深度定制便成為各大互聯網巨頭的一個研究方向。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved