目錄
不知道什麼是更好的
您永遠不會忘記您的第一次CRUD應用
你也永遠不會忘記你的第一個搜尋系統
我學到的
演算法真的很重要
表現也很重要
你認為寫系統很複雜嗎?
在現實世界中,它必須被操作
答案通常是「視情況而定」
程式設計遺願清單
首頁 後端開發 Golang Go rqlite作者告訴你:開發資料庫軟體,演算法多重要!

Go rqlite作者告訴你:開發資料庫軟體,演算法多重要!

Jan 22, 2022 am 09:19 AM
go golang

本文由golang教學專欄跟大家介紹關於《Go rqlite作者告訴你:開發資料庫軟體,演算法多重要! 》,希望對需要的朋友有幫助!

撰寫資料庫程式中迷人的作品。在過去的兩年裡,我一直深入參與開源資料庫的開發,而資料庫程式設計可能是作為一個軟體開發者所能完成的最具啟發性的專案了。

然而,真正令人震驚的是, 在過去的 6 年裡,我對資料庫的態度發生了很大的變化。從一開始不感興趣的狀態,到現在我開始認為資料庫系統是軟體工程的巔峰。

不知道什麼是更好的

在我的職業生涯的大部分時間裡, 我對資料庫的唯一經驗就是閱讀有關它們的資料。通常是在想當枯燥的背景下 — 打開任何一本有關資料庫的本科教科書,就能明白我的意思。通常你會看到如下表格,作為關係型資料庫的典型使用案例:

##LASTTITLEDEPARTMENT#1Robert23

你能再多讀些無聊的東西嗎?如果這些都是關於資料庫的,我不想和它們有任何關係。重點是什麼?軟體比這酷多了,對吧?所以我在很長一段時間裡完全避免了與資料庫有關的任何事情

您永遠不會忘記您的第一次CRUD應用

2009年,經過多年的寫作 嵌入式軟體, Linux 設備驅動程式, 和 網路軟體, 我發現自己領導的團隊需要建立一個基於web的系統。你看,這個 AWS 雲端運算已經到來,基於雲端運算的授權技術 MAC 位址 不再有效。我的團隊必須建立一個 許可入口網站 用於我們新的基於EC2的軟體設備。因為我們在這方面有很多經驗 Python, 我們選擇了 Django, 運行在 MySQL. 發生了一些新的事情。實際上,我是從資料庫開始工作的。

隨著我國平原地區的發展CRUD應用程式繼續運行,我開始意識到資料庫是多麼重要——它對我們的系統是多麼重要。如果我們遺失了資料庫,我們的軟體開發就白費了。如果資料庫損壞了數據,我們客戶的設備可能會未經許可,他們的網路將停止運作。如果資料庫不能正常運行,成千上萬的人將同時受到影響。但這些事情都沒有發生過。資料庫始終工作。它從不讓我們失望。我印象深刻。
後來我發現了外鍵約束,唯一約束,引用完整性,索引,(記住,在這個時候我什麼都不知道關於這些事情)-數據庫可以通過各種方式幫助我構建一個更健壯的系統。我終於意識到現代資料庫是驚人的-資料庫是世界上最無聊的東西直到你真的必須用它們來建立一個系統

你也永遠不會忘記你的第一個搜尋系統

到2012年,我領導了一個團隊,建立了一個大型索引和搜尋系統基礎上的大型鍵值資料庫,帶有彈性搜尋在其核心。看看elasticsearch這樣的系統能做什麼 —— 一個建立在世界級索引這項技術——即使其下有TB級的日誌數據,也讓人大開眼界。
到目前為止,我甚至看到資料庫和搜尋系統也失敗了,但我被資料庫技術迷住了。到2014年,我加入了一個小型專門團隊,開發[開源時間序列資料庫]的核心(github.com/influxdata/influxdb).

我學到的

演算法真的很重要

只有在資料庫開發中才有大O分析真的活過來了。資料庫是程式設計師仍然需要循環、排序和過濾數百萬物件的少數應用程式之一。這是少數幾個在CS課上學到的很多枯燥材料都很重要的地方之一。

其他許多軟體開發都不是這樣。寫入啟動ROM韌體?不,演算法對我來說從來都不重要。調諧器設備驅動程式? 不,沒關係。網路設備管理軟體? CRUD應用程式?幾乎不所有這些學科都需要不同的技能和知識。大多數時候,我只是在面試中討論了運行時的複雜性。
但隨著資料庫的發展,這一切都改變了。實際上看到一個系統返回正確的結果,但是由於演算法的改變,只在以前的一小部分時間內,看到它發生在您的程式碼中,在您構建的系統中,這是一件美妙的事情。

表現也很重要

軟體中有一個老故事是這樣的:程式設計師所寫的一些程式碼的運行速度比以前的版本快十倍。他展示了它,但有人指出,它產生的數據與正確的數據略有不同。 「但是速度快了十倍。」程式設計師指出。 “好吧,如果它不需要是正確的,我可以製作一個完全不佔用空間、運行速度無限快的版本”,另一個回答說。
這個道德故事一直對我影響很大。正確總是比什麼都重要。這是真的。但這也讓我相信,專案之所以有價值,只是因為它們產生了正確的結果。

對於資料庫,情況並非如此。
效能不僅僅是一項功能。這是一個要求。那些願意為資料庫掏錢的人經常這樣做,因為他們擁有大量的數據。如果資料庫在這種情況下不能很好地執行—如果它不能快速有效地傳回結果—那麼它可能根本不工作。

你認為寫系統很複雜嗎?

我認為開發資料庫最讓我震驚的是查詢引擎變得如此複雜。我有很多建置系統的經驗,可以將資料寫入並儲存到磁碟。使這些系統運作良好可能是一項重大挑戰。
但這種複雜性通常比查詢引擎的複雜性小得多。一個靈活的查詢系統——有效地建立一個系統來回答問題,當你不知道問題會是什麼的時候——需要認真的設計想法。查詢計劃器必須有效。查詢系統必須支援許多正交需求——按某些維度過濾,按其他維度分組,連接來自不同表的資料——有時還支援來自外部來源的資料。最後,查詢系統必須有效率且效能良好。這導致了設計和實現中抽象和優化之間的緊張關係,這需要真正的技巧才能很好地管理。

在現實世界中,它必須被操作

任何重要的資料庫都必須支援備份、復原、碎片管理和監視等基本操作。
如果我,作為一個嚴肅的操作員,不能備份你的資料庫,我不能使用它,就這麼簡單。資料庫接受寫入操作的速度有多快並不重要。在查詢過程中,它的記憶體佔用有多小並不重要。如果我無法保護資料庫中的資料不受資料庫建立者您無法控制的故障的影響,我將永遠無法舒適地運行它。
當然,有很多方法可以備份資料庫,而不需要資料庫的合作。但內建方法通常是最好的。這也是我向 rqlite v2.0.如果我想讓任何人認真地使用rqlite,我必須解決現實世界中的問題,即係統可能完全失敗,並將數據拖得很長時間。

因此,在設計和實作資料庫時,從一開始就要建立操作支援。將其作為設計的基本部分。您的用戶將為此感謝您。

答案通常是「視情況而定」

當您第一次開始使用資料庫時,尤其是作為一名操作員,您經常會問這樣的問題:系統可以以什麼速率索引?它對查詢的回應速度有多快?我需要多少磁碟空間?一塊碎片能有多大,而且還能正常運作?我怎樣才能加快速度?所有人都毫無保留地問。我過去常常自己做。
也許你可以和資料庫程式設計師談談,問他們這些問題。而你經常——也許永遠——得到的答案是:這取決於你。你必須基準,你必須衡量。聽到這個消息可能會很惱火,而且可能看起來像是在逃避責任。

但事實並非如此。
現在,當我聽到這樣的問題時,我會微笑。太天真了。
索引率可能取決於資料的大小,而不僅僅是文件或資料點的數量。這可能取決於批次、資料的基數、資料庫是否群集、資料中的哪些欄位和欄位被​​索引、是新資料或對現有資料的更新、運行資料庫的機器、RAM、IO效能以及使用的複製。
控制性能的變數永遠不會結束。
對於查詢,可能取決於時間序列資料的時間範圍。它取決於命中的記錄數、查詢的欄位數、是否涉及範圍掃描、資料是否為索引、使用的索引類型、可能存取的碎片數、資料是否為本機資料。以及機器的特點。它有貨嗎?它正在進行維護嗎?網路忙嗎?

所以答案總是, 視情況而定。資料庫設計者是誠實的。他們可以知道他們建立的系統的一切, 但仍然不知道您的問題的答案。

程式設計遺願清單

如果給那些希望提高程式設計能力的開發人員一條建議的話,那就是加入資料庫開發團隊。因為資料庫開發,我的程式設計技能大大提高了——這是一次美妙的編碼體驗。

原文網址:https://www.philipotoole.com/what-i-learned-from-programming-a-database/

翻譯網址:https://learnku .com/go/t/64605

ID FIRST
##Kelly Director Marketing
Tom #Burke Representative Sales
John Smith #Vice President #Sales

以上是Go rqlite作者告訴你:開發資料庫軟體,演算法多重要!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用 Golang 安全地讀取和寫入檔案? 如何使用 Golang 安全地讀取和寫入檔案? Jun 06, 2024 pm 05:14 PM

在Go中安全地讀取和寫入檔案至關重要。指南包括:檢查檔案權限使用defer關閉檔案驗證檔案路徑使用上下文逾時遵循這些準則可確保資料的安全性和應用程式的健全性。

如何為 Golang 資料庫連線配置連線池? 如何為 Golang 資料庫連線配置連線池? Jun 06, 2024 am 11:21 AM

如何為Go資料庫連線配置連線池?使用database/sql包中的DB類型建立資料庫連線;設定MaxOpenConns以控制最大並發連線數;設定MaxIdleConns以設定最大空閒連線數;設定ConnMaxLifetime以控制連線的最大生命週期。

如何在 Golang 中將 JSON 資料保存到資料庫中? 如何在 Golang 中將 JSON 資料保存到資料庫中? Jun 06, 2024 am 11:24 AM

可以透過使用gjson函式庫或json.Unmarshal函數將JSON資料儲存到MySQL資料庫中。 gjson函式庫提供了方便的方法來解析JSON字段,而json.Unmarshal函數需要一個目標類型指標來解組JSON資料。這兩種方法都需要準備SQL語句和執行插入操作來將資料持久化到資料庫中。

Golang框架與Go框架:內部架構與外部特性對比 Golang框架與Go框架:內部架構與外部特性對比 Jun 06, 2024 pm 12:37 PM

GoLang框架與Go框架的差異體現在內部架構與外部特性。 GoLang框架基於Go標準函式庫,擴充其功能,而Go框架由獨立函式庫組成,以實現特定目的。 GoLang框架更靈活,Go框架更容易上手。 GoLang框架在效能上稍有優勢,Go框架的可擴充性更高。案例:gin-gonic(Go框架)用於建立RESTAPI,而Echo(GoLang框架)用於建立Web應用程式。

從前端轉型後端開發,學習Java還是Golang更有前景? 從前端轉型後端開發,學習Java還是Golang更有前景? Apr 02, 2025 am 09:12 AM

後端學習路徑:從前端轉型到後端的探索之旅作為一名從前端開發轉型的後端初學者,你已經有了nodejs的基礎,...

如何找出 Golang 正規表示式符合的第一個子字串? 如何找出 Golang 正規表示式符合的第一個子字串? Jun 06, 2024 am 10:51 AM

FindStringSubmatch函數可找出正規表示式匹配的第一個子字串:此函數傳回包含匹配子字串的切片,第一個元素為整個匹配字串,後續元素為各個子字串。程式碼範例:regexp.FindStringSubmatch(text,pattern)傳回符合子字串的切片。實戰案例:可用於匹配電子郵件地址中的域名,例如:email:="user@example.com",pattern:=@([^\s]+)$獲取域名match[1]。

golang框架開發實戰教學:常見疑問解答 golang框架開發實戰教學:常見疑問解答 Jun 06, 2024 am 11:02 AM

Go框架開發常見問題:框架選擇:取決於應用需求和開發者偏好,如Gin(API)、Echo(可擴展)、Beego(ORM)、Iris(效能)。安裝和使用:使用gomod指令安裝,導入框架並使用。資料庫互動:使用ORM庫,如gorm,建立資料庫連線和操作。身份驗證和授權:使用會話管理和身份驗證中間件,如gin-contrib/sessions。實戰案例:使用Gin框架建立一個簡單的部落格API,提供POST、GET等功能。

如何用 Golang 使用預先定義時區? 如何用 Golang 使用預先定義時區? Jun 06, 2024 pm 01:02 PM

Go語言中使用預先定義時區包含下列步驟:匯入"time"套件。透過LoadLocation函數載入特定時區。在建立Time物件、解析時間字串等操作中使用已載入的時區,進行日期和時間轉換。使用不同時區的日期進行比較,以說明預先定義時區功能的應用。

See all articles