資料庫中介軟體為何不支援join

2021-08-13 03:25:29 字數 2712 閱讀 2852

**:     架構師之路

有網友對《

假如讓你來設計資料庫中介軟體

》一文中,資料庫中介軟體僅僅支援四類sql存有疑問:

這四類sql就能滿足公司業務的需求麼,這個結論是怎麼來的?

看來《假如讓你來設計資料庫中介軟體》的架構結論並不能讓刨根究底的網友們滿意,於是把13年底,需求調研的過程細節也說一說,作為乙個一線架構師,治學還是得嚴謹。

先說結論,通過初步的調研,發現58各業務線對有分庫需求的應用場景為:

大部分需求集中在前三條,排序+分頁的需求由於分布式實現困難,各業務線往往也採用了一些限制或者變通手段實現,例如:

調研結果顯示,各業務線暫沒有下列需求:

從搜尋研發部高階架構師@longc 處了解到,暫時沒有資料庫分庫需求。

畫外音:@龍神 做搜尋核心,壓根瞧不起我這個用mysql搞業務的人呀。

和@sunx 進行了溝通,幫幫技術部沒有水平分庫,只有水平分表,業務需求為常見需求中的「partition key上的普通查詢」。

對於58幫幫的「使用者登陸表」,資料量較大,目前分為32個表,以uid作為partition key,所有的查詢都會帶上partition key,故可以直接定位到資料所屬的partition。

如上例,假設58幫幫對某資料量較大的表以id為partition key分了3個表,上游的所有查詢都會帶上id=***這個查詢條件(當然,亦可以同時帶上其他查詢條件)。

畫外音:@玄姐 設計的系統,架構考慮得極其完善。

從@liunz 了解到,無線分庫使用場景和幫幫技術部類似,都是「partition key 上的普通查詢」。

從@liuzw 了解到,架構部在imc,umc等服務使用水平分庫,業務需求為常見需求中的「patition key 上的普通查詢」,「partition key上的in查詢」,「非partition key上的查詢」。

對於「partition key上的in查詢」,架構部採用的是將各個partition key定位到相關的庫,最後將查詢結果集彙總,再返回上游的方式來實現。

注意,如上圖所示,帶partition key的in查詢並不一定會遍歷所有的庫。

對於「非partition key上的查詢」,根據不同的業務,架構部有兩種處理方式:

方式一業務方不需要精確資料,隨機取乙個庫的資料

,即可滿足業務方要求,例如「查詢10個有頭像的使用者」

當業務方不需要關注結果集的精確性時,可以隨機取乙個庫查詢。

畫外音:這是乙個很好的設計,典型的「根據業務需求確定技術方案」的good case。

方式二業務方需要精確資料,就必須遍歷所有的庫

,例如「查詢使用者名為shenjian的使用者」。

畫外音:uid的生成沒有採用「基因法」,非常遺憾。關於「基因法」的方案詳見《單key業務,資料庫水平切分架構實踐 | 架構師之路》。

六、會員技術部調研

從@wangzt 了解到,會員技術部使用水平分庫,調研結論裡對分庫的四種sql需求在業務中都有用到。

對「非partition key上的查詢」,除了使用架構部使用的全庫查詢方案,會員技術部還是用了冗餘資料法來解決這個問題:

這種查詢方式使用冗餘資料來避免全庫查詢,缺點是可能存在資料一致性問題。

「誇庫分頁查詢」,會員技術部的處理方式是索引表

使用訂單分庫,買家的查詢查詢索引表,索引表的本質也是冗餘。

畫外音:關於「帖子業務的水平切分」的方案詳見《1對多業務,資料庫水平切分架構一次搞定 | 架構師之路》。

從@hudp 了解到,分庫的資料訪問,貨幣系統部所有的線上實時業務都必須攜帶partition key,故其訪問模式和即時通訊的資料訪問模式相同。

但對於支撐系統/統計需求,在分庫資料上,他們計畫引入cobar來解決他們的問題。

從@wangjk 了解到,前端業務部這邊,四種分庫sql都有,對於誇庫分頁

,前端業務部這邊的業務上要求必須帶上乙個特殊的id作為where欄位,以避免拉取大量的資料重新排序。

九、結論

58如果要做資料庫中介軟體,一期支援四類sql:

能夠滿足業務線絕大部分分庫的需求。

一切脫離業務的架構設計,都是耍流氓。

做技術要嚴謹,除了上述需求調研,也做了充分的技術調研: 《

資料庫中介軟體tddl調研筆記》

《資料庫中介軟體cobar調研筆記》

《資料庫中介軟體mysql-proxy調研筆記》

才有了後來的概要設計:

《假如讓你來設計資料庫中介軟體》

資料庫中介軟體為何不支援join

假如讓你來設計資料庫中介軟體 一文中,資料庫中介軟體僅僅支援四類sql存有疑問 partition key上的in查詢 非partition key上的查詢 有限功能的排序 分頁查詢 where key and partition key上的in查詢 where key in yyy and 非pa...

面試 資料庫 中介軟體

lru是redis唯一支援的 演算法 no eviction 不刪除策略 對於所有的key allkeys lru 刪除最近訪問頻率低的key allkeys random 隨機刪除一部分key 對於設定expire volatile lru 刪除最近訪問頻率低的key volatile rando...

SQLITE資料庫不支援遠端訪問

sqlite資料庫不支援遠端訪問 成功建立表 except print 建立失敗 def chaxun aab 查詢指定表 sql select from mydlax sql select from s aab result cur.execute sql result cur.execute s...