什么是數(shù)據(jù)庫設計 如何理解數(shù)據(jù)庫表設計的時候字段冗余?
如何理解數(shù)據(jù)庫表設計的時候字段冗余?提高效率。單表查詢比關聯(lián)查詢快。經(jīng)常訪問的字段可以冗余地存儲在兩個表中,而無需關聯(lián)。當數(shù)據(jù)庫扼住系統(tǒng)性能咽喉,直接分庫分表能解決嗎?子數(shù)據(jù)庫和子表是一種相對落后的優(yōu)
如何理解數(shù)據(jù)庫表設計的時候字段冗余?
提高效率。
單表查詢比關聯(lián)查詢快。
經(jīng)常訪問的字段可以冗余地存儲在兩個表中,而無需關聯(lián)。
當數(shù)據(jù)庫扼住系統(tǒng)性能咽喉,直接分庫分表能解決嗎?
子數(shù)據(jù)庫和子表是一種相對落后的優(yōu)化方法,因為成本相對較高。
遇到數(shù)據(jù)庫瓶頸:
-首先考慮SQL優(yōu)化,這是最簡單的方法。對現(xiàn)有系統(tǒng)沒有影響。
-第二個是考慮數(shù)據(jù)庫讀寫分離,這也是一個相對簡單的方法。在數(shù)據(jù)庫級配置中,系統(tǒng)級只需要調(diào)整獲取數(shù)據(jù)庫連接的邏輯即可。讀取數(shù)據(jù)時,可以同時獲得主庫和從庫連接。寫入數(shù)據(jù)時,僅獲取主庫連接。
-考慮添加緩存層。數(shù)據(jù)緩存在緩存中,再次訪問時不再從數(shù)據(jù)庫檢索。通常,緩存層對系統(tǒng)是透明的,對系統(tǒng)本身沒有影響。但是,cache的引入也引入了相應的需要考慮的問題,如雪崩、命中率、分布式cache等]-還有一種非技術手段,就是改變需求。性能問題的原因是否不合理?還是要求太復雜?需求可以簡化嗎?這種方法對系統(tǒng)的影響相對較小。
-最后,考慮子數(shù)據(jù)庫和子表。優(yōu)先考慮子數(shù)據(jù)庫,因為它比子表簡單。將相應的表移動到新的數(shù)據(jù)庫中,并調(diào)整系統(tǒng)的邏輯以獲得數(shù)據(jù)庫連接。在這里,我們需要考慮移動哪些表。在提高性能的前提下,我們首先嘗試避免分布式事務。
-最后,考慮子表。子表的主要原因是單個表中的數(shù)據(jù)量很大。子表分為縱斷面和橫斷面。垂直剪切是按列剪切的,例如用戶表。常用信息為基本信息表,其他信息為明細表。橫切是按行切割。例如,一個有1億數(shù)據(jù)的表被分成10個有1000萬數(shù)據(jù)的表。這涉及到數(shù)據(jù)應該存儲在哪個表中或從哪個表中獲取。在表被劃分之后,可以對數(shù)據(jù)庫進行進一步的優(yōu)化。
-如果涉及分布式事務,應考慮如何保證分布式事務。理論上,2個,3個,帕克斯,帽子,底座。相應中間件的使用。
系統(tǒng)的設計和優(yōu)化不是模仿的問題,而是需要根據(jù)實際場景進行處理。
支撐日活百萬用戶的高并發(fā)系統(tǒng),應該如何設計其數(shù)據(jù)庫架構? ?
以MySQL為列:
1:要支持高并發(fā)系統(tǒng),必須涉及事務,所以數(shù)據(jù)庫引擎必須選擇InnoDB。InnoDB支持事務,事務級別取決于業(yè)務。如果業(yè)務數(shù)據(jù)一致性要求非常高,事務將開啟序列化級別,這將完全隔離事務,但會導致對鎖資源的競爭加劇。MySQL的性能在一定程度上降低了。
2:數(shù)據(jù)庫分為主數(shù)據(jù)庫和從數(shù)據(jù)庫。主數(shù)據(jù)庫負責寫入數(shù)據(jù),集群數(shù)據(jù)庫負責讀取數(shù)據(jù)。注意主從數(shù)據(jù)庫的數(shù)據(jù)一致性。
3:冷熱數(shù)據(jù)分離,美團、饑餓部分設計采用冷熱數(shù)據(jù)分離。以訂單為例,出庫單的主要業(yè)務場景是查詢。數(shù)據(jù)查詢越向前,概率越低。這是冷數(shù)據(jù)。正在交易的訂單是熱點數(shù)據(jù),需要隨時查詢和更新。冷數(shù)據(jù)可以放入redis緩存。這將提高查詢效率。
4:數(shù)據(jù)表設計,充分利用索引查詢。businesssql避免返回無用的行和列,禁止使用select*query,在查詢時增加限制,并盡可能返回滿足要求的行。對于復雜的SQL,請考慮拆分SQL。拆分SQL有一個優(yōu)點。對于重復查詢SQL,將第二次查詢放入MySQL緩沖區(qū),避免重復磁盤操作,提高訪問性能。
5:子數(shù)據(jù)庫和子表。例如,業(yè)務數(shù)據(jù)按月份分類。在一定程度上,增加、刪除、修改和檢查的壓力將得到緩解。
希望對您有所幫助。謝謝您。