01 資料庫介紹
資料庫簡介
資料庫概述
資料庫從字面上的理解就是資料的倉庫,其實我們平時說的資料庫是指資料庫管理系統(Database Management System),它是一種操縱和管理資料庫的大型軟體,用於建立、使用和維護資料庫,簡稱DBMS。嚴格來說資料庫是資料庫管理系統的例項,一個數據庫管理系統可以有多個數據庫例項。
資料庫系統(Database System),是由資料庫及其管理軟體組成的系統。
資料庫系統是為適應資料處理的需要而發展起來的一種較為理想的資料處理系統,也是一個為實際可執行的儲存、維護和應用系統提供資料的軟體系統,是儲存介質 、處理物件和管理系統的集合體。
基本定義
資料庫系統有大小之分,大型資料庫系統有SQL Server、Oracle、DB2等,中小型資料庫系統有Foxpro、Access、MySQL。
資料庫構成
資料庫系統一般由4部分組成:
1.資料庫(database,DB)是指長期儲存在
2.硬體:構成計算機系統的各種物理裝置,包括儲存所需的外部裝置。硬體的配置應滿足整個資料庫系統的需要。
3.軟體:包括作業系統、資料庫管理系統及應用程式。資料庫管理系統(database management system,DBMS)是資料庫系統的核心軟體,是在作業系統的支援下工作,解決如何科學地組織和儲存資料,如何高效獲取和維護資料的系統軟體。其主要功能包括:資料定義功能、資料操縱功能、資料庫的執行管理和資料庫的建立與維護。
4.人員:主要有4類。第一類為
資料庫特點
資料的結構化
資料的共享性好
資料的獨立性好
資料儲存粒度小
資料庫管理系統為使用者提供了友好的介面
資料庫系統的核心和基礎,是資料模型,現有的資料庫系統均是基於某種資料模型的。
也可以說,資料庫系統的核心就是資料庫管理系統。
資料庫分類
關鍵詞
MySQL:The world's most popular open source database(全世界最流行的開源資料庫)
postgresql: The World's Most Advanced Open Source Relational Database(全世界最先進的開源資料庫)
熱度排行
資料庫種類很多,我們平時接觸最多的恐怕就是Oracle資料庫,或者MySQL資料。兩者是應用最廣泛的關係型資料。如圖1是2020年12月份使用情況排名,從排名也可以看出上述兩個資料庫分別排第一名和第二名。
https://db-engines.com/en/ranking
資料庫分類
如果仔細看圖1的排名就可以看到,資料庫不僅僅有我們平時學到的關係型資料庫,還有鍵值(Key-Value)資料庫、列儲存資料庫、文件資料庫和搜尋引擎等型別。下面本文將簡單介紹一下各種型別的資料。
關係型資料庫:
這種型別的資料庫是最古老的資料庫型別,關係型資料庫模型是把複雜的資料結構歸結為簡單的二元關係(即二維表格形式), 如圖2是一個二維表的例項。通常該表第一行為欄位名稱,描述該欄位的作用,下面是具體的資料。在定義該表時需要指定欄位的名稱及型別。
在關係型資料庫中,對資料的操作幾乎全部建立在一個或多個關係表格上。在大型系統中通常有多個表,且表之間有各種關係。實際使用就是通過對這些關聯的表格分類、合併、連線或選取等運算來實現資料庫的管理。
鍵值儲存資料庫:
鍵值資料庫是一種非關係資料庫,它使用簡單的鍵值方法來儲存資料。鍵值資料庫將資料儲存為鍵值對集合,其中鍵作為唯一識別符號。
3
如圖是某公有云的鍵值儲存示意圖,其中鍵包含分割槽鍵和排序鍵,而值包含更多的實際資訊。比如實際使用是可以以學號為鍵,姓名、性別、年齡和班級等資訊為值進行儲存。實際儲存形式很靈活,是業務需求自行定義即可。
列儲存資料庫:
列式儲存(column-based)是相對於傳統關係型資料庫的行式儲存(Row-basedstorage)來說的。簡單來說兩者的區別就是對錶中資料的儲存形式的差異。
圖3 列儲存資料庫
如圖是傳統行資料庫和列資料庫表中資料在磁碟上的儲存形式的差異對比。對於行儲存資料庫,表中的資料是以行為單位逐行儲存在磁碟上的;而對於列儲存資料庫,表中的資料則是以列為單位逐列儲存在磁碟中。
列儲存解決的主要問題是資料查詢問題。我們知道,平時的查詢大部分都是條件查詢,通常是返回某些欄位(列)的資料。對於行儲存資料,資料讀取時通常將一行資料完全讀出,如果只需要其中幾列資料的情況,就會存在冗餘列,出於縮短處理時間的考量,消除冗餘列的過程通常是在記憶體中進行的。而列儲存,每次讀取的資料是集合的一段或者全部,不存在冗餘性問題。這樣,通過這種儲存方式的調整,使得查詢效能得到極大的提升。
面向文件資料庫:
此類資料庫可存放並獲取文件,可以是XML、JSON、BSON等格式,這些文件具備可述性(self-describing),呈現分層的樹狀結構(hierarchical tree data structure),可以包含對映表、集合和純量值。資料庫中的文件彼此相似,但不必完全相同。文件資料庫所存放的文件,就相當於鍵值資料庫所存放的“值”。文件資料庫可視為其值可查的鍵值資料庫。
圖形資料庫:
圖形資料庫顧名思義,就是一種儲存圖形關係的資料庫。圖形資料庫是NoSQL資料庫的一種型別,它應用圖形理論儲存實體之間的關係資訊。關係型資料用於儲存明確關係的資料,但對於複雜關係的資料儲存卻有些力不從心。如圖這種人物之間的關係,如果用關係型資料庫則非常複雜,用圖形資料庫將非常簡單。
圖4 圖形資料庫示例
搜尋引擎儲存:
搜尋引擎資料庫是應用在搜尋引擎領域的資料儲存形式,由於搜尋引擎會爬取大量的資料,並以特定的格式進行儲存,這樣在檢索的時候才能保證效能最優。
不同型別資料庫常用軟體
關係型資料庫:
關係型資料庫最為經典的開源軟體就是MySQL,它是最流行的開源關係型資料庫管理系統,在 WEB 應用方面 MySQL 是最好的 RDBMS(Relational Database Management System:關係資料庫管理系統)應用軟體之一。
SUN被甲骨文收購後,MySQL 的原創人員有拉出另外一個分支,命名MariaDB 。該資料庫被維基百科,Facebook 甚至 Google 等技術巨頭使用。 MariaDB 是一種可為 MySQL 提供外掛替換功能的資料庫伺服器。開發人員的首要關注點是安全性,在每個版本釋出時,開發人員還會合並所有 MySQL 的安全修補程式,並在需要時對其進行增強。
除此之外,還有很多開源的關係型資料庫,比如經典的檔案資料庫SQLite和針對Web服務進行優化的CUBRID 等。
鍵值儲存資料庫:
鍵值資料庫目前應用最多的應該是Redis,Redis是一個開源的使用ANSI C語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。Redis通常最為普通關係型資料庫的快取層,用於降低資料庫的訪問壓力,提升系統性能。
列儲存資料庫:
列儲存資料庫中最為出名的恐怕就是HBase了,HBase是 BigTable 的開源 java 版本。是建立在 HDFS 之上,提供高可靠性、高效能、列儲存、 可伸縮、實時讀寫 NoSQL 的資料庫系統。
面向文件資料庫:
文件資料庫種類繁多,包括MongoDB、CouchDB、 Terrastore、RavenDB和OrientDB等多大十幾個。其中MongoDB是目前最為流行的文件資料庫,其介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。其最大的特點是分散式部署,可以隨著負載的增大動態擴容,從而滿足企業業務增長的需求。
圖形資料庫:
圖形種類很多,比如Neo4J、ArangoDB、OrientDB、FlockDB、GraphDB、InfiniteGraph、Titan和Cayley等。其中Neo4j 是目前最流行的圖形資料庫,支援完整的事務,在屬性圖中,圖是由頂點(Vertex),邊(Edge)和屬性(Property)組成的,頂點和邊都可以設定屬性,頂點也稱作節點,邊也稱作關係,每個節點和關係都可以由一個或多個屬性。Neo4j建立的圖是用頂點和邊構建一個有向圖,其查詢語言cypher已經成為事實上的標準。
搜尋引擎儲存:
搜尋引擎資料庫最近比較火的包括Solr和Elasticsearch等。Solr是Apache 的一個開源專案,基於業界大名鼎鼎的java開源搜尋引擎Lucene。在過去的十年裡,solr發展壯大,擁有廣泛的使用者群體。solr提供分散式索引、分片、副本集、負載均衡和自動故障轉移和恢復功能。如果正確部署,良好管理,solr就能夠成為一個高可靠、可擴充套件和高容錯的搜尋引擎。
Elasticsearch構建在Apache Lucene庫之上,同是開源搜尋引擎。Elasticsearch在Solr推出幾年後才面世的,通過REST和schema-free的JSON文件提供分散式、多租戶全文搜尋引擎。並且官方提供Java,Groovy,PHP,Ruby,Perl,Python,.NET和Javascript客戶端。目前Elasticsearch與Logstash和Kibana配合,部署成日誌採集和分析,簡稱ELK,它們都是開源軟體。最近新增了一個FileBeat,它是一個輕量級的日誌收集處理工具(Agent),Filebeat佔用資源少,適合於在各個伺服器上搜集日誌後傳輸給Logstash。
不同型別資料庫的區別以及特點
MySQL和Redis的對比
1)從資料儲存格式上:
例如學生資訊:
張三 性別:男 年齡:23 籍貫:上海 手機:1234567890
mysql儲存格式:
uid 姓名 sex age home phone
001 張三 男 23 上海 1234567890
Redis儲存格式:
name001:zhangsan
sex001:男
age001:23
home001:上海
phone001:1234567890
2)從分類上
MySQL是關係型資料庫,主要用於存放持久化資料,將資料儲存在硬碟中,讀取速度較慢。
Redis是NOSQL,即非關係型資料庫,也是快取資料庫,即將資料儲存在快取中,快取的讀取速度快,能夠大大的提高執行效率,但是儲存時間有限。
3)從執行機制上
mysql作為持久化儲存的關係型資料庫,相對薄弱的地方在於每次請求訪問資料庫時,都存在著I/O操作,如果反覆頻繁的訪問資料庫。第一:會在反覆連結資料庫上花費大量時間,從而導致執行效率過慢;第二:反覆的訪問資料庫也會導致資料庫的負載過高,那麼此時快取的概念就衍生了出來。
快取就是資料交換的緩衝區(cache),當瀏覽器執行請求時,首先會對在快取中進行查詢,如果存在,就獲取;否則就訪問資料庫。快取的好處就是讀取速度快。
redis資料庫就是一款快取資料庫,用於儲存使用頻繁的資料,這樣減少訪問資料庫的次數,提高執行效率。
4)從儲存介質上
mysql用於持久化的儲存資料到硬碟,功能強大,但是速度較慢。
redis用於儲存使用較為頻繁的資料到快取中,讀取速度快。
5)需求上
MySQL和Redis因為需求的不同,一般都是配合使用。
Redis儲存在記憶體中,如果儲存在記憶體中,儲存容量肯定要比磁碟少很多,那麼要儲存大量資料,只能花更多的錢去購買記憶體,造成在一些不需要高效能的地方是相對比較浪費的,所以目前基本都是MySQL(主) + Redis(輔),在需要效能的地方使用Redis,在不需要高效能的地方使用MySQL,好鋼用在刀刃上。
MySQL支援sql查詢,可以實現一些關聯的查詢以及統計.
Redis對記憶體要求比較高,在有限的條件下不能把所有資料都放在Redis.
MySQL偏向於存資料,Redis偏向於快速取資料,但Redis查詢複雜的表關係時不如MySQL,所以可以把熱門的資料放Redis,MySQL存基本資料。
MySQL與mongdb對比
MySQL與MongoDB都是開源的常用資料庫,但是MySQL是傳統的關係型資料庫,MongoDB則是非關係型資料庫,也叫文件型資料庫,是一種NoSQL的資料庫。它們各有各的優點,關鍵是看用在什麼地方。所以我們所熟知的那些SQL語句就不適用於MongoDB了,因為SQL語句是關係型資料庫的標準語言。
(一)關係型資料庫-MySQL
1、在不同的引擎上有不同的儲存方式。
2、查詢語句是使用傳統的sql語句,擁有較為成熟的體系,成熟度很高。
3、開源資料庫的份額在不斷增加,mysql的份額也在持續增長。
4、缺點就是在海量資料處理的時候效率會顯著變慢。
(二)非關係型資料庫-MongoDB
非關係型資料庫(nosql ),屬於文件型資料庫。先解釋一下文件的資料庫,即可以存放xml、json、bson型別系的資料。這些資料具備自述性,呈現分層的樹狀資料結構。資料結構由鍵值(key=>value)對組成。
1、儲存方式:虛擬記憶體+持久化。
2、查詢語句:是獨特的MongoDB的查詢方式。
3、適合場景:事件的記錄,內容管理或者部落格平臺等等。
4、架構特點:可以通過副本集,以及分片來實現高可用。
5、資料處理:資料是儲存在硬碟上的,只不過需要經常讀取的資料會被載入到記憶體中,將資料儲存在實體記憶體中,從而達到高速讀寫。
6、成熟度與廣泛度:新興資料庫,成熟度較低,Nosql資料庫中最為接近關係型資料庫,比較完善的DB之一,適用人群不斷在增長。
(三)MongoDB優勢與劣勢
優勢:
1、在適量級的記憶體的MongoDB的效能是非常迅速的,它將熱資料儲存在實體記憶體中,使得熱資料的讀寫變得十分快。
2、MongoDB的高可用和叢集架構擁有十分高的擴充套件性。
3、在副本集中,當主庫遇到問題,無法繼續提供服務的時候,副本集將選舉一個新的主庫繼續提供服務。
4、MongoDB的Bson和JSon格式的資料十分適合文件格式的儲存與查詢。
劣勢:
1、 不支援事務操作。MongoDB本身沒有自帶事務機制,若需要在MongoDB中實現事務機制,需通過一個額外的表,從邏輯上自行實現事務。
2、 應用經驗少,由於NoSQL興起時間短,應用經驗相比關係型資料庫較少。
3、MongoDB佔用空間過大。
(四)對比
資料庫 | MongoDB | MySQL |
---|---|---|
資料庫模型 | 非關係型 | 關係型 |
儲存方式 | 以類JSON的文件的格式儲存 | 不同引擎有不同的儲存方式 |
查詢語句 | MongoDB查詢方式(類似JavaScript的函式) | SQL語句 |
資料處理方式 | 基於記憶體,將熱資料存放在實體記憶體中,從而達到高速讀寫 | 不同引擎有自己的特點 |
成熟度 | 新興資料庫,成熟度較低 | 成熟度高 |
廣泛度 | NoSQL資料庫中,比較完善且開源,使用人數在不斷增長 | 開源資料庫,市場份額不斷增長 |
事務性 | 僅支援單文件事務操作,弱一致性 | 支援事務操作 |
佔用空間 | 佔用空間大 | 佔用空間小 |
join操作 | MongoDB沒有join | MySQL支援join |
(五)企業選型
關係型資料庫適合儲存結構化資料,如使用者的帳號、地址:
1)這些資料通常需要做結構化查詢,比如join,這時候,關係型資料庫就要勝出一籌
2)這些資料的規模、增長的速度通常是可以預期的
3)事務性、一致性
NoSQL適合儲存非結構化資料,如文章、評論:
1)這些資料通常用於模糊處理,如全文搜尋、機器學習
2)這些資料是海量的,而且增長的速度是難以預期的,
3)根據資料的特點,NoSQL資料庫通常具有無限(至少接近)伸縮性
4)按key獲取資料效率很高,但是對join或其他結構化查詢的支援就比較差
DBA介紹
資料庫管理員(Database Administrator,簡稱DBA),是從事管理和維護資料庫管理系統(DBMS)的相關工作人員的統稱,屬於運維工程師的一個分支,主要負責業務資料庫從設計、測試到部署交付的全生命週期管理。
DBA的核心目標是保證資料庫管理系統的穩定性、安全性、完整性和高效能。
主要職責
據庫管理員的主要職責有以下幾個方面:
1.設計:
資料庫設計,包括欄位、表和關鍵欄位;資源在輔助儲存裝置上是怎樣使用的,怎樣增加和刪除檔案及記錄,以及怎樣發現和補救損失。
2.監控
監控資料庫的警告日誌,定期做備份刪除。
3.備份
對資料庫的備份監控和管理資料庫的備份至關重要,對資料庫的備份策略要根據實際要求進行更改,資料的日常備份情況進行監控。
4.SQL語句
對SQL語句的書寫規範的要求一個SQL語句,如果寫得不理想,對資料庫的影響是很大的。所以,每一個程式設計師或相應的工作人員在寫相應的SQL語句時,應該嚴格按照《SQL書寫規範》一文,最後要有DBA檢查才可以正式執行。
5.終端使用者服務和協調
資料庫管理員規定使用者訪問許可權和為不同使用者組分配資源。如果不同使用者之間互相牴觸,資料庫管理員應該能夠協呼叫戶以最優化安排。
6.資料庫安全
資料庫管理員能夠為不同的資料庫管理系統使用者規定不同的訪問許可權,以保護資料庫不被未經授權的訪問和破壞。例如,允許一類使用者只能檢索資料,而另一類使用者可能擁有更新資料和刪除記錄的許可權。