原创 數據庫內核雜談(八):數據庫優化器(下)

在上一篇文章中,我們介紹了優化器的大概並且講解了一系列通過語句重寫來對查詢進行優化的方法。文末也留了一個坑:當語句中涉及到多個表的join時,優化器該如何決定join的順序(join ordering)來找到最優解呢?這期,我們接着這個話題

原创 數據庫內核雜談(七):數據庫優化器(上)

在上一篇文章中,我們挖了一個坑:在大部分情況下,HashJoin都是表現最優的,那爲什麼還需要去支持其他Join比如SortMergeJoin或者NestLoopJoin的算子實現呢?因爲不同表的大小,是否有索引支持,以及查詢語句是否對某些

原创 數據庫內核雜談(六):表的JOIN(連接)

在上篇文章中,我們主要介紹了排序和聚合的實現,覆蓋了單個表的大部分操作。但數據庫強大的地方在於,它能夠把現實中的某一塊業務,映射地表達成一系列的表的集合,並且其查詢語句SQL支持多個表相關聯的查詢操作。這種連接多表的查詢使得數據庫的功能得到

原创 數據庫內核雜談(五):如何實現排序和聚合

上篇文章中,我們着重介紹了對於一個SQL語句,數據庫是怎麼生成一個執行計劃,並根據這個執行計劃,一步一步地讀取,計算並獲得最後結果的。這一期,我們來聊一下兩個非常重要的算子(operator, 上一期我把operator翻譯成操作符,後來讀

原创 數據庫內核雜談(四):執行模式

在之前的文章中,我們通過存儲和索引,瞭解瞭如何把數據存儲在文件系統裏,然後根據不同的查詢語句,通過建立索引來提速讀取。今天,我們來聊一下當數據讀進內存後,數據庫怎麼繼續執行查詢。之前系列文章都是以自底向上的線索來介紹數據庫內核。但在介紹具體

原创 數據庫內核雜談(三):索引優化

在上一篇文章的末尾,我們留了一個坑。雖然通過列存,能夠避免讀取不必要的數據(沒使用的列)來提高查詢速度,但是對於下面這類點查詢(point query),還能不能進一步優化呢?SELECT * FROM titanic_survivor W

原创 數據庫內核雜談(二):存儲“演化論”

數據庫是用來存儲海量數據的。存儲如此大量的數據,自然而然想到的就是以文件的形式存儲在硬盤(HDD或SSD)中。當然,一些商用數據庫爲了追求性能,是將數據優先存儲在內存中(比如SAP的HANA和MemSQL)來獲得更高速的讀寫。本文主要涉及的

原创 數據庫內核雜談(一):一小時實現一個基本功能的數據庫

數據庫內核博大精深,很多子系統的設計初看不知所云,但是細讀就會發現其已經做到了極致。但是市面上很少有類似的資源或者課程把數據庫內容的精髓講解出來,因此Facebook 現任 Tech Lead 顧仲賢撰寫了《數據庫內核雜談》的系列文章。