加快數(shù)據(jù)庫性能的八項(xiàng)技術(shù)
幾乎所有用于最終用戶的Web服務(wù)都需要存儲(chǔ)數(shù)據(jù)。它們幾乎所有人都將它們存儲(chǔ)在數(shù)據(jù)庫中。很多很多使用PostgreSQL,MySQL / MariaDB或MSSQL等關(guān)系數(shù)據(jù)庫。數(shù)據(jù)庫系統(tǒng)非常令人敬畏,因?yàn)槟梢酝浰鼈?。他們只是為了處理你的?shù)據(jù)持久性……直到他們變慢。
在本文中,您將學(xué)習(xí)垂直和水平分區(qū),分片,復(fù)制等的區(qū)別,以及加快數(shù)據(jù)庫的其他方式。我們走吧!
我們關(guān)心什么?
對于數(shù)據(jù)庫系統(tǒng),我們關(guān)心一致的一致性和可用性。我們還需要一個(gè)用于交換破損設(shè)備和連續(xù)備份的工作解決方案。
一旦滿足最低要求,我們可能有幾個(gè)性能指標(biāo):
- 讀取簡單查詢的性能
- 讀取復(fù)雜查詢的性能
- 插入/更新性能
不同應(yīng)用程序的工作量以重要方式不同。許多Web應(yīng)用程序僅使用CRUD,偶爾一次,非常簡單的連接。他們需要快速讀取和相對快速的寫入。他們有大量的小交易。他們有一個(gè)OLTP風(fēng)格的工作量。
分析團(tuán)隊(duì)相比之下需要更復(fù)雜的疑問。如果這些查詢需要更多時(shí)間,它也是可以接受的。它們具有少量復(fù)雜的選擇查詢。他們有一個(gè)OLAP風(fēng)格的工作量。
找到單個(gè)慢查詢的一個(gè)工具正在記錄慢查詢(MySQL,PostgreSQL,MSSQL)。
算法改進(jìn)
在許多情況下,在生產(chǎn)中運(yùn)行的代碼只是恰好工作的第一件事。對于非開發(fā)人員來說,想想你寫的最后幾塊電子郵件。很可能,至少有一個(gè)在哪里你沒有花太多時(shí)間來改善你的溝通方式。這是一個(gè)代碼的故事。在好公司中,至少第二個(gè)人在代碼中快速瀏覽。但是,當(dāng)它看起來合理時(shí),我們的開發(fā)人員不會(huì)詳細(xì)介紹每一條線。這意味著總會(huì)有改進(jìn)的空間。
對于數(shù)據(jù)庫,有兩種常見的方法可以改進(jìn):添加合理的索引和查詢優(yōu)化。
1. 索引
索引允許數(shù)據(jù)庫通過維護(hù)有效的搜索數(shù)據(jù)結(jié)構(gòu)(例如,B樹)更快地查找相關(guān)行。這是按表完成的。添加索引可以計(jì)算地昂貴,必須在生產(chǎn)系統(tǒng)上執(zhí)行,因此通常不經(jīng)常完成。
通過SQL創(chuàng)建索引(MySQL,PostgreSQL)很容易:
- CREATE INDEX arbitrary_index_name
- ON your_table_name(column1, column2);
添加索引可以加速數(shù)據(jù)庫中的搜索,但慢下來更新/插入/刪除語句,除非“在”部分“部分成本耗時(shí)。
2. 查詢優(yōu)化
查詢優(yōu)化由每個(gè)查詢的數(shù)據(jù)庫用戶完成。查詢可以用幾種不同的方式編寫,其中一些可以比其他方式更有效。您可能希望在數(shù)據(jù)上嘗試不同的查詢版本并使用Explate語句。
一個(gè)提及的工具是sqlcheck。它檢查常見的SQL查詢反模式,例如在一列中具有多個(gè)值而不是使用交叉表或通配符選擇。
查詢優(yōu)化主題的略微不同的子類別是n + 1問題/寫入循環(huán)以發(fā)送多個(gè)查詢,而不是對數(shù)據(jù)進(jìn)行一個(gè)查詢。
3. 業(yè)務(wù)變更和分區(qū)
當(dāng)您正在營業(yè)時(shí),您想取悅您的客戶。如果他們要求一個(gè)小型功能,您會(huì)嘗試包含它。這可能導(dǎo)致功能蠕變。UNIX哲學(xué)表明這是一個(gè)很多問題的問題:
做一件事并做得好。” - Doug McIlroy. |
同樣,可以通過用戶組拆分Web服務(wù)數(shù)據(jù)。也許將它們分成區(qū)域是有意義的?我在AWS和安全的代碼戰(zhàn)士上看到過。也許你可以將其分成“私人客戶”,“小型企業(yè)客戶”或“大型商業(yè)客戶”?也許應(yīng)用程序的一部分實(shí)際上可以與自己的數(shù)據(jù)庫有自己的服務(wù)?
4. 復(fù)制
> Image by Martin Thoma
如果讀是問題,復(fù)制是一個(gè)簡單的解決方案,如果更新的一點(diǎn)時(shí)間延遲并不大。復(fù)制將數(shù)據(jù)庫連續(xù)復(fù)制到另一臺計(jì)算機(jī)。它加速了讀取并充當(dāng)故障轉(zhuǎn)移機(jī)制。
該想法是擁有一個(gè)主服務(wù)器和多個(gè)復(fù)制服務(wù)器,該服務(wù)器以前在其他名稱下已知。主服務(wù)器處理數(shù)據(jù)的任何更改,而Replication Server只會(huì)復(fù)制主服務(wù)器。還有其他拓?fù)?,例如環(huán)或星形設(shè)置。
另請參閱:MySQL文檔,PostgreSQL文檔,MSSQL文檔
5. 水平分區(qū)
鑒于一個(gè)巨大的表,我們可以在另一臺機(jī)器上存儲(chǔ)一些行和其他機(jī)器。按行拆分?jǐn)?shù)據(jù)的想法稱為水平分區(qū)。
圖像解釋了多個(gè)單詞:
> Conceptual example for horizontal partitioning. Image by Martin Thoma.
僅在MySQL / MariaDB中的ID簡單地分區(qū):
- ALTER TABLE shopping_carts
- PARTITION BY RANGE(id)
- ( Partition p0 VALUES LESS THAN (1234),
- Partition p1 VALUES LESS THAN (4567),
- Partition p2 VALUES LESS THAN MAXVALUE);
您希望數(shù)據(jù)庫系統(tǒng)的用戶仍然能夠使用典型查詢查詢數(shù)據(jù)庫,或許使用以下內(nèi)容:
- SELECT * FROM shopping_carts WHERE cart_id = 3
這里有一個(gè)重要的事情:水平分區(qū)完全無關(guān)與水平縮放!
6. 垂直分區(qū)
我們可以根據(jù)行劃分大數(shù)據(jù)庫,而是可以按列劃分。這可能會(huì)給你一種不安的感覺,因?yàn)槟阍诖髮W(xué)學(xué)習(xí)了一個(gè)正?;瘮?shù)據(jù)庫是一個(gè)好主意。這里要注意的重要事項(xiàng)是我們正在談?wù)摂?shù)據(jù)庫設(shè)計(jì)中的不同階段。各種數(shù)據(jù)庫正常形式與邏輯設(shè)計(jì)有關(guān)。在這個(gè)階段,我們照顧了物理設(shè)計(jì)。
應(yīng)用程序的不同部分可能不需要行的大多數(shù)列。出于這個(gè)原因,可以將它們分開。因此,垂直分區(qū)也稱為行分離。
一個(gè)常用的實(shí)踐是從內(nèi)容中拆分元數(shù)據(jù)。這是一個(gè)圖片:
> Image by Martin Thoma
這里有一個(gè)重要的事情:垂直分區(qū)與垂直縮放完全無關(guān)!
當(dāng)您避免隱私或監(jiān)管問題時(shí),垂直分區(qū)可能很有用。想想信用卡信息。這可以符合其他信息符合良好,但大多數(shù)應(yīng)用程序都不需要它。您甚至可能將其放在完全不同的數(shù)據(jù)庫中,并將其隱藏在私人微服務(wù)后面。
分片 - 以下一級分配
您已經(jīng)看到數(shù)據(jù)可以以兩種不同的方式分組。它可能已經(jīng)有意義地分區(qū)同一臺計(jì)算機(jī)以幫助數(shù)據(jù)庫更快地執(zhí)行常見查詢。但如果數(shù)據(jù)庫最大限度地熄滅CPU或RAM,則使用不同的機(jī)器可能有意義。
分片正在劃分單個(gè)邏輯數(shù)據(jù)集并將其分發(fā)在不同的機(jī)器上。
正如您可能猜到的那樣,這有很多問題 - 因此應(yīng)該只應(yīng)該是你最后的出路。例如,由于2010年10月(來源)的分配問題,F(xiàn)ourSquare已下降了11小時(shí)。到目前為止,我一直很幸運(yùn),我不必處理分片。
第一個(gè)明顯的問題是您的應(yīng)用程序需要知道哪些碎片包含您正在尋找的數(shù)據(jù)。因此,您的應(yīng)用程序邏輯受到影響,可能在所有地方受到影響。
第二個(gè)大問題是橫跨碎片加入。
第三個(gè)問題是如何定義分片。要真正可擴(kuò)展,您想要進(jìn)行動(dòng)態(tài)定義分片。擁有分層結(jié)構(gòu)可以幫助實(shí)現(xiàn)這一目標(biāo)。
8. 數(shù)據(jù)庫群集
在看Vitess時(shí),我只會(huì)遇到這個(gè)術(shù)語。這個(gè)想法似乎隱藏了碎片的問題,也是在引擎蓋下使用復(fù)制:
WintgreSQL還有文檔,MySQL群集是另一種產(chǎn)品。
獎(jiǎng)金:查詢緩存
如果您有一些沉重的查詢,該查詢是對很少發(fā)生更改的數(shù)據(jù),您可以嘗試緩存查詢。我不確定默認(rèn)情況下的數(shù)據(jù)庫提供了什么,但您可以簡單地將鍵值存儲(chǔ)置于該查詢的位置。您可以直接向數(shù)據(jù)庫發(fā)送查詢,而不是將查詢發(fā)送到在鍵值存儲(chǔ)中查找它的微服務(wù)。如果它不存在或無效,則會(huì)查詢真實(shí)數(shù)據(jù)庫。
缺點(diǎn)是您不知道您獲得的數(shù)據(jù)是否是最近的數(shù)據(jù)。
讓我們總結(jié)一下!
下一步是什么?
一些主題對于發(fā)展至關(guān)重要,但不是日常工作或計(jì)算機(jī)科學(xué)課程的一部分。在我們專業(yè)的軟件開發(fā)系列中,您可以了解更多主題。
原文鏈接:https://betterprogramming.pub/8-techniques-to-speed-up-your-database-292754ff7739