前我們講過利用數據庫的讀寫分離提升數據庫的讀寫性能,今天我們再來聊一聊數據庫優化的另外一個重量級武器,分庫分表。
我們先來想想這樣的一個業務場景,我們有一個數據庫,存放著用戶的訂單數據,隨著我們的業務的發展,訂單的數據越來越多,由此會引來一系列的問題。
首先,單庫的數據量會變得越來越大,占據大量的磁盤空間,在進行數據遷移、備份、恢複所需要的時間都會越來越長。
其次,系統的容災性將變差,沒有萬無一失的系統,也沒有萬無一失的機器,更沒有萬無一失的運維工程師與程序員,一旦我們的數據庫遭遇到破壞,將會牽連所有的業務與用戶。
最後,是系統的性能會大大降低,讀寫速度會變慢,即便是我們使用了索引,也會發現讀寫的速度越來越慢,這是爲什麽呢?有兩個主要的原因,一是隨著數據量的增多,掃描數也會增多,一旦我們的索引不合理,或者沒有命中索引,將帶來災難性的結果,另外一個重要的原因,是索引會變得越來越大,每次變更索引的變更也會消耗時間,並且可能因爲索引過大,無法直接存放在內存,每次都需要從磁盤中加載索引,造成速度變慢。
從另外一個角度看,單台機器的性能都是有限的,即便我們可以使用多個從庫,但也會造成數據的冗余與浪費。分庫分表,可以幫我們非常好的解決這個問題。分庫分表,顧名思義,就是把數據分散存儲在不同的數據庫與數據表中。我們有兩種常見的分庫分表方法:
垂直切分,垂直切分,既按照不同的功能,將不同業務的數據,存放到不同的數據庫中,我們仍然以電商系統爲例,我們可以將用戶性別、收貨地址、賬號等存放在用戶庫中,將商品的圖片、描述、詳情存放在商品數據庫中,將用戶的訂單數據存放在交易數據庫中,不同的數據庫之間可以互相隔離,互補影響,這樣子,可以做到一方出故障的時候,對其他影響最小。
水平切分,水平切分,即同一個功能按照一定的維度切割,將他們放到不同的表中。我以阿裏巴巴的淘寶天貓數據爲例,不同用戶之間的交易數據,一般都是不互通的,也少有需要跨表查詢場景,于是可以用戶的ID哈希,將其分布在不同的數據庫數據表中,商品的數據,最常見的場景,便是一個店鋪下所有的商品,我們極少需要跨店鋪去查詢商品的數據(搜索頁、推薦頁等的不算,這種場景一般也不是走數據庫查詢),所以通常是以商家ID進行分表的。
通過分庫分表,我們可以讓數據庫每一張表的數據都比較可控,從而提高數據庫的效率。當然,分庫分表也並非十全十美,也會帶來一些問題,例如,在某些業務場景,我們可能需要查詢跨表的數據,將會變得非常麻煩。同時,如果數據庫需要一些連接操作,也會變得箱單麻煩。想要知道如何解決這些問題的麽?歡迎大家關注我,共同學習,共同進步。大家的支持是我繼續唠嗑的動力。同名公衆號(沙茶敏碎碎念)