淺談MySQL、PostgreSQL、Oracle使用的三種 join 演算法
工作中前前後後也接觸過了 MySQL、PostgreSQL、Oracle 三種資料庫。每次寫完 SQL 習慣性用 explain 看一下執行計劃,久了之後注意到一件有趣的事,雖然三家 DB 的語法和輸出格式各有不同,但 join 的執行計劃翻來覆去都圍繞著類似的幾個關鍵字。稍微研究後才發現,這背後其實大概可以歸納為三種 join 演算法。
因此本篇想來聊聊在各大 DB 常見使用的三種 join 演算法。
工作中前前後後也接觸過了 MySQL、PostgreSQL、Oracle 三種資料庫。每次寫完 SQL 習慣性用 explain 看一下執行計劃,久了之後注意到一件有趣的事,雖然三家 DB 的語法和輸出格式各有不同,但 join 的執行計劃翻來覆去都圍繞著類似的幾個關鍵字。稍微研究後才發現,這背後其實大概可以歸納為三種 join 演算法。
因此本篇想來聊聊在各大 DB 常見使用的三種 join 演算法。
公司的Node.js專案在經過好幾年的需求迭代後多少會出現些bad smells,為了解決這些bad smells於是又誕生了一些偏門的寫法,但卻也換來目前開發上很難確認眾多變數中哪些變數會是undefined(對,我們的專案已經寫到連eslint的一些rule都認不得了)。因此最近在研究如何為專案的eslint增加客製化的rule,補上讓eslint去抓出偏門寫法中的undefined變數。
在做了些研究後,發現eslint在為某個檔案做靜態檢查時,會先將整份檔案的程式碼讀一遍,並且建立抽象語法樹(Abstract Syntax Tree),然後透過遍歷這棵樹的操作去抓出沒有符合rule的地方。
其實不只是eslint,所有編譯器、直譯器在拿到一份程式碼時第一步也是先建立抽象語法樹,所以今天這篇要來簡單介紹什麼是抽象語法樹(Abstract Syntax Tree),或簡稱AST。
公司目前的服務有幾隻API會提供用戶上傳檔案(KYC及回傳明細)用。而現有檔案上傳機制是將檔案以BLOB的形式存在資料庫的ATTACHMENT資料表內。
這種做法的好處是上傳檔案並且更改記錄狀態可以包成一包transaction,實現業務邏輯上資料的一致性(要嘛用戶的狀態為等待上傳並且屬於此用戶上傳的檔案還不存在、要嘛用戶的狀態為已上傳並且屬於此用戶上傳的檔案已歸檔)。
但是這樣做的壞處是DB那台機器對於操作下載檔案時會消耗一部分CPU與network io bandwidth,也就等於會拖慢DB處理關聯式資料CRUD的主業。隨著使用量的增加,團隊中最近開始考慮要將檔案上傳的功能拆出至DB以外的solution。
最近在工作上需要寫一隻圖片上傳的API,好讓使用者上傳證明用的圖片供後續人工審核用。身為一隻稱職的圖片上傳API,當收到使用者發過來的請求後第一步肯定要做參數檢查,驗證使用者上傳的檔案是不是真的是圖片檔,並將亂上傳的請求拒於門外。
但是今天使用者傳來的是檔案其實對API來說都是binary的形式,要怎麼檢驗它真的是圖片檔呢?如果用最直覺判斷副檔名的方式的話有可能會遇到使用者故意改副檔名,然後惡意上傳其它非影像的檔案,所以用副檔名擋肯定是不夠的。在survey了一下後,發現其實還有一招是可以從檔案內容中的magic number下手來判斷。
當服務在面對用戶量逐漸增加並且效能逼近單台的server極限時,身為技術團隊就必須想辦法為服務進行水平擴展,將服務拆分並且佈署至多台機器上形成分散式系統。
在畢業後在業界打滾幾年後,深深覺得學習分散式系統不能再用實務上看到一個坑才填一個坑的方式學習,因為坑實在太多了,而且職場上沒有那麼多機會及容忍度可以一個坑一個坑慢慢踩慢慢填。
於是就在某天跑完天瓏書局後就把《分散式系統主流框架實作指南》這本書也一起帶回家了,本篇將分享讀完這本書後的每章筆記,如果對於筆記內容覺得不錯的歡迎支持閱讀原作。

近期迴響