45 年前,兩名年輕的 IBM 研究員将一門關系型語言帶到了資料庫領域,旨在使用聲明性的方式來操作資料。從 Don Chamberlin 和 Ramond Boyce 發表“SEQUEL:一門結構化的英語查詢語言”以來,關系型模型和 SQL 已經得到了廣泛擴充,并被用在大量的技術中,如 OLTP、OLAP、對象資料庫、對象關系型資料庫,甚至是 NoSQL 資料庫。SQL 也為非關系型資料庫帶去了設計靈感,比如用于對象資料庫的 SQL、用于對象關系的 SQL、用于 XML 的 SQL、用于空間資料的 SQL、用于搜尋的 SQL、用于 JSON 的 SQL、用于時序資料的 SQL、用于流的 SQL,等等。各種與資料打交道的 BI 工具也使用了 SQL。事實上,SQL 是最成功的第四代語言。
SQL 之是以神秘,是因為它的強大。
SQL 以關系代數為基礎,目标是提供一種接近英語的查詢語言:
- 具有聲明性;
- 可以通過組合的方式寫出複雜的查詢;
- 可以利用由 Edger F Codd 開發的關系型模型。
大資料試圖在資料倉庫領域補足或替換關系型系統,但它們仍然使用了 SQL。Hive、Impala、drill、BigSQL 都使用了基于 SQL 的語言、優化器,并使用了與 SQL 相似的大規模并行處理。它們還時不時地增加新的 SQL 特性。SQL 中的資料存儲格式、資料模型和查詢處理的分離帶來了一些非常重要的好處。在 SQL 誕生以來的 45 年當中,很多資料庫來了又去。NoSQL 運動浪潮甚至在無意中暗示了 SQL 和 SQL 資料庫即将死掉。但 SQL 陣營很坦然地面對這個問題,Don Chamberlin 最近表示:“當一門語言被廣泛認可,以至于其他語言開始标榜自己不同于這一門語言時,說明這門語言一定表現得很好”。
另一個資料庫陣營是 NoSQL。雖然現在對 NoSQL 的定義是“Not Only SQL”,但其實 NoSQL 在最開始想要遠離 SQL,并嘗試使用其他語言和架構,比如 map-reduce。但在十年之後,幾乎每一個流行的 NoSQL 資料庫都有了 SQL 變種:Couchbase 的 N1QL、Cassandra 的 CQL 和 Elasticsearch 的 ElasticSearch SQL。你可能會說:“MongoDB 并沒有 SQL”。但我敢肯定地說:“它将會有一個非常簡單的 SQL 實作”。
關系型模型已經非常成功了,不過資料庫還支援其他各種資料模型:JSON、圖、XML、時序、空間、長列、列式、文檔,等等。這些資料庫當中大部分都有自己的 SQL 實作版本,即使是 NoSQL 資料庫也實作了 SQL 或者受 SQL 啟發的查詢語言。即使是在最性感的“資料科學”領域,SQL 仍然是一項非常被看重的技能。
現在,NoSQL 資料庫中的 SQL 項目比 SQL 資料庫中的 SQL 項目還要多。
為什麼 SQL 會如此成功?
- 可聲明性:你隻要聲明好要輸出什麼,查詢引擎會為你找到最優化的方式來執行查詢。Pat Seliner 等人在 1979 年發明的基于成本的優化器一直在持續地提升 SQL 的查詢速度。這也提高了其他新進者的準入門檻。最近的一篇Apache Hive 論文解釋了優化器的複雜性。
- SQL 不隻是被用在“查詢”方面,它也被用來更新資料,而存儲過程、UDF(使用者自定義函數)通過結合過程語言和聲明性的 SQL 擴充了 SQL 的能力。
- SQL 具有非常好的可延展性。SQL 标準經過多次擴充,每次都加入了很多新特性、新文法和新的關鍵字。可以肯定的是,并不是所有 SQL 标準都是一樣的。即使是 RDBMS 的傳統 SQL 實作也不會完全相容,除非在寫 SQL 時非常小心地考慮相容性問題。除了這些之外,SQL 的精髓都是一樣的。SQL++ 是 SQL 進化的一個很好的例子。Don Chamberlin 和 Mike Carey 就 SQL 是否需要支援複雜的資料模型進行過讨論,以便讓使用者和開發人員可以友善地通路 JSON 格式的資料。Don 撰寫的“SQL++ For SQL User: A Tutorial”一書介紹了 SQL++ 的發展情況,SQL++ 是一門被設計用來處理 JSON 資料模型的語言,同時與 SQL 相容。
- SQL 為我們帶來了新的想法,擴充了新的資料類型、通路方式和應用場景。
- SQL 本身與資料表示是分離的,可以被用在非關系型資料上,比如 CSV、JSON 以及其他所有的大資料格式。有些人認為關系型模型表示非常死闆,是以認為 SQL 也是死闆的。但事實上,對于給定的 schema,SQL 可以實作任意資料格式的 SELECT、連接配接、分組、聚合。
SQL 的支援情況
既然 SQL 現在已經無處不在,我們就有必要對 SQL 的支援情況進行一番了解。
- 了解每種工作負載的特點和目标。例如,是互動式的應用程式還是互動式分析?抑或是批次分析或 BI?
- SQL 所支援的語句反應了運維能力。
- 在表達式(标量、聚合、布爾值)、連接配接(内連接配接、左 / 右 / 全連接配接)、子查詢、視圖、排序、分頁(LIMIT/OFFSET)方面的能力。
- 索引:沒有索引的 SQL 隻是一個圖靈機原型。
- 優化器:查詢重寫、選擇正确的通路路徑、建立最優的查詢執行路徑讓 SQL 成為最成功的第四代語言。有一些帶有基于規則的優化器,有一些則帶有基于成本的優化器,有一些二者兼而有之。優化器是非常重要的一個因素,一般的測試基準(如 TPC-C、TPC-DS、YCSB、YCSB-JSON)在這方面幫不上什麼忙。
- 有句話是這麼說的:“性能、性能和性能是資料庫最重要的三件東西”。對工作負載進行性能方面的測試是非常關鍵的,YCSB 和它的擴充 YCSB-JSON 可以在這方面幫上忙。
- SDK:豐富的 SDK 和語言支援可以加快開發速度。
- BI 工具支援:對于大型的資料分析來說,BI 工具的支援是非常重要的。
N1QL 作者 Gerald Sangudi 曾經表示,SQL 是非常成功的,因為它代表了資料處理的基本操作。SQL 支援一組豐富的操作,SELECT、連接配接、嵌套、分組、聚合、HAVING、WINDOW、排序、分頁,等等。在談到資料操作時,這些就是我們要考慮的所有東西嗎?這個問題還有待觀察,不過我們可以肯定的是,其他語言(比如 Python 和 Java)正在為這些資料操作添加運算符。或許其他的語言也會跟風。SQL 已經走到了關系型模型沒能走到的地方。
擷取以上Java進階架構最新視訊,歡迎
加入Java進階架構交流群:734066324。直接點選連結加入群聊【Java進階架構師】:https://jq.qq.com/?_wv=1027&k=5Fbnv8G