作為伺服器開發者,資料庫管理是後端服務關鍵的一部分、同時也是最容易被忽視的一部分;
工作好些年、發現很多開發者對資料庫拿來就用、對資料庫的思考少之又少、或是永遠千篇一律、總到了專案快速增長期才花大量的成本去做最基礎的修改,而現實往往是殘酷的、是改不動的,甚至是需要修改專案原始碼進行配合重構的…
為了減少這樣的情況發生,本文希望對剛接觸資料庫、或準備接觸資料庫的開發者對資料庫有一個全新的、基礎性的認知。
一. 資料庫是怎麼來的?
資料庫的概念其實不難理解,你可以試想:如果有人告訴你一串資訊,你為了不輕易忘記,最簡單地,你可以新建一個txt檔案,然後把資訊完好的存起來,等下次誰要了解的時候,再去開啟文字進行檢視;其實這樣的一個行為就是簡單的資料操作,我們把這樣有著一定規律和特徵的資料集中儲存起來,就構成了我們需要的資料庫(可以是txt、excel、mysql、sqlserver等等);
二. 為什麼需要專業的資料庫軟體?
那麼可能就人會問,既然這麼簡單,為什麼還需要專門的資料庫軟體呢?
- 更好地分類
資料庫軟體通過分庫、分表、建立欄位,將存在著一定規則的資料進行分類儲存,並對欄位進行描述、以便對資料進行合理地空間分配、同時進行一定地約束;(你可以理解為你有一個圖書館、為了方便管理,你放置了多排書架、每一個書架都有一定的規則,比如1、2、3排放歷史,4、5放人文,6、7放科學)
- 簡潔高效的資料庫指令
有了物理儲存之後,緊接著面對的難題就是:如何運算元據?
最基本的運算元據有四種,就是俗稱的CURD【代表建立(Create)、更新(Update)、讀取(Retrieve)和刪除(Delete)操作】
1)建立 Create:存入一本書(INSERT)
2)更新 Update:替換一本書(UPDATE)
3)讀取 Retrieve:查詢一本書(SELECT)
4)刪除 Delete:拿走/銷燬一本書(DELETE)
在這種約定下,當我們向資料庫傳送CURD指令時,它相當於幫我們封裝好一行命令,然後對我們的儲存介質進行資料操作;比如SELECT:
(舉例)CAT mydatabase | grep on
SELECT * FROM mydatabase WHERE fields = 'on';
- 更高效的查詢
在這裡就要引入索引的概念了,因為索引用得好事半功倍;用得不好,簡直是災難性的負擔;因為索引可以提高查詢效率,但同時它的維護是需要代價的;
當我們的圖書館執行一段時間後,發現書本上架並不難,難的是如何在海量的書架裡,快速地找出一本書,這個時候有個簡單的做法,就是給每一列書架標記一個記號,比如根據開頭字母(a/b/c..),我們在計算機裡稱之為索引。
索引(index)是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定資訊。
有了這樣的規則,假設當有人來找《埃及1840》這本歷史書,我們可以快速鎖定到歷史書籍中的1列1、2行,而其餘的書架子我們都可以不用全部翻查,這就是索引的最基本實現;
學習到後面,你會發現索引其實十分有趣!
不同的資料庫引擎所支援的索引結構是不一樣的,常見的索引資料結構有(B+TREE、HASH、紅黑樹等等),他們的目的基本是在“維護”和“查詢”儘可能地實現高效,具體選擇哪種需要開發者對他們有一定的瞭解,而不是永遠地盲目使用一種索引型別;
索引除了進一步的分類,他還被有組織有規律地加入到一種資料結構中(比如BTREE——限制了每個節點最多隻有兩個葉子節點、右邊節點比左邊“大”等等,通過不同的資料結構演算法來提高查詢的效率,以達到節省計算機查詢資料的記憶體以及時間上開銷)
當然建立索引是需要代價的,除了額外建立的.MYI索引檔案需要暫用的磁碟空間,在我們每一次地新增、修改、刪除,索引檔案都是需要同步發生變化的,這一點有這個意識就可以了,後續在專門寫索引的文章裡,我們再細究,這裡只是為了讓開發者都有一個基礎的認知。
三、開啟資料庫的探索之門
通過了解資料庫的儲存介質、操作方式、以及查詢優化的原理,我們明白資料庫的操作是即簡單又十分不易的;
試想如果沒有這些資料庫軟體、需要我們自己去實現一個資料庫的服務、自己去儲存資料、運算元據、查詢資料、構建索引、事務、優化引擎等等,你還捨得這樣漫不經心地設計你的庫表嗎?
所以希望各位資料庫開發者,都能且用且珍惜,不要輕視資料庫的操作,不要隨意操作一些自己都不知道會發生什麼後果的行為,可能你無意地一個設計,已經帶來了不斷地、無意義的伺服器壓力,輕者浪費資源,重者只能帶來無止境地優化~
如有不對的地方歡迎指正、有存疑的地方歡迎來找我探討,謝謝~
本作品採用《CC 協議》,轉載必須註明作者和本文連結