為了實現這些核心功能,通常數據庫會包括以下核心組件:
a. 存儲管理
數據用什么樣的方式來組織、存儲,是 key-value 還是關系型,是按行存還是按列存,支不支持壓縮,支不支持刪除和修改,支持什么樣的數據類型和存儲接口,POSIX 還是對象存儲。是否要支持計算存儲分離,是否要支持分布式存儲,是否支持事物處理,是否支持多副本,采用什么算法來加速數據的檢索(索引)等等。存儲管理是數據庫的核心組件,解決了存儲管理問題,數據庫的問題就解決了一半了。

b. 查詢優化器
要提高數據查詢的效率,數據庫必須找到一條最優化的執行路徑,比如,查詢時是否需要使用索引,如果有多個索引,應該選擇哪一個,如果數據分布在不同的存儲單元(表、集合等)里,應該按照什么順序來訪問效率最高等等。優化器面對的問題可能是一個極其復雜的路徑規划問題,它需要在很短的時間里計算出最優路徑,需要大量核心優化算法,屬於數據庫中復雜程度最高的部分。鄭州哪家醫院看心理咨詢好http://www.hyde8871.com/
舉個例子,你要帶着全家人,包括老人、小孩一起從上海去海南旅行,要制作一個性價比最好、家人滿意度最高的計划,那么在計划時需要考慮哪些因素呢?首先,怎么去,是開車去,還是火車去,還是飛機去。開車,路上要花多久,中間需要休息幾次,你和太太有沒有時間,老人孩子是不是受得了,汽油費用,過路費用;飛機,怎么去機場,行李有多少,帶不帶得下,機票有沒有打折,下了飛機怎么辦等等。住什么酒店,去什么景點,老人喜歡去人多的人文景觀,太太喜歡安靜的地方和方便購物的地方,小孩喜歡有游樂場的地方,要不要酒店 + 景點一起訂,會不會有優惠,要不要租車,租什么車......說到這里,是不是可以體會一個查詢優化器需要考慮的問題有多少?

當然,這部分工作可以有相對簡單的實現(基於規則),比如太太說了,時間確定、飛機來回、五星酒店、帶私人沙灘,這樣計划就會簡單很多。然而,這份工作也可能復雜到難以想象(基於機器學習、基於實際開銷等等),比如太太說你全權負責,具體時間不確定,大概在 8月 - 9月,要少花錢多辦事,多做調研,找一個最優方案。那么做這個計划就會非常復雜,需要的支持決策信息就會非常多。這樣做出來的決策大概率相對會優化,比基於規則實現的計划能適應更多場景。
c. 執行模塊
優化器做好了執行計划后,接下來就會有執行的模塊按照執行計划對數據進行相關的計算,包括數據的存取、常規的加減乘除、排序、平均值、哈希,也會包括一些機器學習的算法,數據的壓縮/解壓縮,最后將計算完成的結果返回給客戶端。

d. 內部管理和調度
數據庫要正常地工作,還會需要一些內部協調管理的模塊,比如內存和存儲同步,存儲空間整理,元數據管理,集群狀態檢測,容錯和故障恢復等。
e. 管理工具和接口
為了提高易用性,數據庫都需要提供一套管理工具,比如備份/恢復、狀態檢測、運行時監控、資源隔離、權限管理、安全審計、自定義接口、各種數據訪問接口等。