laravel多表聯(lián)合查詢 當(dāng)數(shù)據(jù)庫扼住系統(tǒng)性能咽喉,直接分庫分表能解決嗎?
當(dāng)數(shù)據(jù)庫扼住系統(tǒng)性能咽喉,直接分庫分表能解決嗎?子庫和子表是一種相對(duì)落后的優(yōu)化方法,因?yàn)槌杀鞠鄬?duì)較高。遇到數(shù)據(jù)庫瓶頸:-首先考慮SQL優(yōu)化,這是最簡單的方法。對(duì)現(xiàn)有系統(tǒng)沒有影響。-第二個(gè)是考慮數(shù)據(jù)庫讀
當(dāng)數(shù)據(jù)庫扼住系統(tǒng)性能咽喉,直接分庫分表能解決嗎?
子庫和子表是一種相對(duì)落后的優(yōu)化方法,因?yàn)槌杀鞠鄬?duì)較高。
遇到數(shù)據(jù)庫瓶頸:
-首先考慮SQL優(yōu)化,這是最簡單的方法。對(duì)現(xiàn)有系統(tǒng)沒有影響。
-第二個(gè)是考慮數(shù)據(jù)庫讀寫分離,這也是一個(gè)相對(duì)簡單的方法。在數(shù)據(jù)庫級(jí)配置中,系統(tǒng)級(jí)只需要調(diào)整獲取數(shù)據(jù)庫連接的邏輯即可。讀取數(shù)據(jù)時(shí),可以同時(shí)獲得主庫和從庫連接。寫入數(shù)據(jù)時(shí),僅獲取主庫連接。
-考慮添加緩存層。數(shù)據(jù)緩存在緩存中,再次訪問時(shí)不再從數(shù)據(jù)庫檢索。通常,緩存層對(duì)系統(tǒng)是透明的,對(duì)系統(tǒng)本身沒有影響。但是,cache的引入也引入了相應(yīng)的需要考慮的問題,如雪崩、命中率、分布式cache等]-還有一種非技術(shù)手段,就是改變需求。性能問題的原因是否不合理?還是要求太復(fù)雜?需求可以簡化嗎?這種方法對(duì)系統(tǒng)的影響相對(duì)較小。
-最后,考慮子數(shù)據(jù)庫和子表。優(yōu)先考慮子數(shù)據(jù)庫,因?yàn)樗茸颖砗唵?。將相?yīng)的表移動(dòng)到新的數(shù)據(jù)庫中,并調(diào)整系統(tǒng)的邏輯以獲得數(shù)據(jù)庫連接。在這里,我們需要考慮移動(dòng)哪些表。在提高性能的前提下,我們首先嘗試避免分布式事務(wù)。
-最后,考慮子表。子表的主要原因是單個(gè)表中的數(shù)據(jù)量很大。子表分為縱斷面和橫斷面。垂直剪切是按列剪切的,例如用戶表。常用信息為基本信息表,其他信息為明細(xì)表。橫切是按行切割。例如,一個(gè)有1億數(shù)據(jù)的表被分成10個(gè)有1000萬數(shù)據(jù)的表。這涉及到數(shù)據(jù)應(yīng)該存儲(chǔ)在哪個(gè)表中或從哪個(gè)表中獲取。在表被劃分之后,可以對(duì)數(shù)據(jù)庫進(jìn)行進(jìn)一步的優(yōu)化。
-如果涉及分布式事務(wù),應(yīng)考慮如何保證分布式事務(wù)。理論上,2個(gè),3個(gè),帕克斯,帽子,底座。相應(yīng)中間件的使用。
系統(tǒng)的設(shè)計(jì)和優(yōu)化不是模仿的問題,而是需要根據(jù)實(shí)際場景進(jìn)行處理。
mysql表數(shù)據(jù)量太大,達(dá)到了1億多條數(shù)據(jù),除了分庫分表之外,還有沒有其他的解決方式?
在正常配置下,MySQL只能承載2000萬數(shù)據(jù)(同時(shí)讀寫,表中有大文本字段,單服務(wù)器)?,F(xiàn)在已經(jīng)超過1億,而且還在增加,建議按以下方式處理:
1子表。它可以按時(shí)間或一定的規(guī)則進(jìn)行拆分,以便盡可能地查詢子表中的數(shù)據(jù)庫。這是最有效的方法。特別是寫,放入一個(gè)新表,并定期同步。如果記錄不斷更新,最好將寫入的數(shù)據(jù)放在redis中,并定期同步表3的大文本字段,將它們分隔成一個(gè)新的獨(dú)立表。對(duì)于較大的文本字段,可以使用NoSQL數(shù)據(jù)庫
4優(yōu)化體系結(jié)構(gòu),或者優(yōu)化SQL查詢,避免聯(lián)合表查詢,盡量不要使用count(*)、in、recursion等性能消耗語句
5使用內(nèi)存緩存,或者在前端讀取時(shí)增加緩存數(shù)據(jù)庫。重復(fù)讀取時(shí),直接從緩存中讀取。
以上是一種低成本的管理方法,基本上幾個(gè)服務(wù)器就可以做到,但是管理起來有點(diǎn)麻煩。
當(dāng)然,如果總體數(shù)據(jù)量特別大,而且您不關(guān)心投資成本,請(qǐng)使用cluster,使用tidb
垂直表:垂直表在日常開發(fā)和設(shè)計(jì)中更為常見。流行的術(shù)語是“大表拆分小表”,它基于關(guān)系數(shù)據(jù)庫中的“列”(字段)。通常,表中有許多字段。您可以創(chuàng)建一個(gè)新的“擴(kuò)展表”,將不常用或長度較大的字段拆分為“擴(kuò)展表”。
分庫分表的六種玩法?
我們還需要分析具體問題。一般來說,這里提供了關(guān)于子表的兩個(gè)想法供參考。實(shí)際上,子數(shù)據(jù)庫也有類似的想法。
(1)垂直子表:這是最基本的游戲方式。說白了,就是“大桌分小桌”。它主要用于表中有許多字段時(shí)。它將不常用或長度較大的字段拆分成相應(yīng)的“擴(kuò)展表”,以提高主表的讀寫效率。其實(shí),當(dāng)規(guī)模不是很大的時(shí)候,我們使用指數(shù)也是基于類似的考慮。
(2)橫向評(píng)分表:我想這可能是你想問的問題,也就是說,如何評(píng)分表后,大量的記錄。在這里,最重要的是要考慮兩點(diǎn):
針對(duì)當(dāng)前數(shù)據(jù)行的特點(diǎn),盡量將業(yè)務(wù)相關(guān)的數(shù)據(jù)行保存在一個(gè)表中,也就是說要建立一個(gè)合適的業(yè)務(wù)規(guī)模表策略。
如何確保主鍵的唯一性?顯然,如果不同表的主鍵仍然按照最常用的自增長模式,就會(huì)出現(xiàn)這種情況。在進(jìn)行跨表查詢時(shí),由于主鍵的重復(fù),業(yè)務(wù)會(huì)出錯(cuò)。因此,這里的關(guān)鍵是計(jì)劃一個(gè)新的主鍵生成方案,通常需要輸入主鍵或時(shí)間字段。對(duì)于拆分查詢,垂直拆分表沒有特殊的方面。對(duì)于水平拆分表,我們主要需要考慮諸如group by或order by之類的查詢。這方面有很多技巧,所以我們這里不重復(fù)。
分庫分表怎么做?
由于數(shù)據(jù)庫中的數(shù)據(jù)量不一定是可控的,沒有子數(shù)據(jù)庫和子表,隨著時(shí)間和業(yè)務(wù)的發(fā)展,數(shù)據(jù)庫中的表數(shù)會(huì)越來越多,表中的數(shù)據(jù)量也會(huì)越來越大。相應(yīng)地,數(shù)據(jù)操作、添加、刪除和修改的成本也將越來越大。另外,由于無法進(jìn)行分布式部署,服務(wù)器的資源(CP)會(huì)減少(U盤、內(nèi)存、IO等)有限,最終數(shù)據(jù)庫所能承載的數(shù)據(jù)量,數(shù)據(jù)處理能力會(huì)遇到瓶頸。
數(shù)據(jù)庫為什么要分庫分表?
在數(shù)據(jù)庫子表中,中間件相當(dāng)于適配器。在開發(fā)過程中,您不需要關(guān)心子數(shù)據(jù)庫子表是如何實(shí)現(xiàn)的,只需要正常操作即可。
例如,切分JDBC、MYCAT、dbproxy和atlas,它們是用于數(shù)據(jù)庫和表拆分的常見中間件,實(shí)際上可以進(jìn)行適配器工作。
我的上層業(yè)務(wù)不需要關(guān)心如何劃分?jǐn)?shù)據(jù)庫和表。我只需要配置規(guī)則。在編寫crud時(shí),我不需要指定具體的指示,就像操作數(shù)據(jù)庫表一樣。子數(shù)據(jù)庫和子表可以解決表數(shù)據(jù)太大的問題,但也存在很多問題,很多問題在中間難以解決。以簡單分頁為例。為了知道頁數(shù),您需要查詢?cè)S多表,然后分頁。更復(fù)雜的是連接運(yùn)算、統(tǒng)計(jì)運(yùn)算等?,F(xiàn)在很多中間件都不支持多表關(guān)聯(lián)。
從上面可以看出,子庫和子表中間件起到了自適應(yīng)的作用,不能支持太復(fù)雜的操作。簡而言之,它是“一個(gè)功能有待改進(jìn)的適配器”。