大白話關係型資料庫:索引,事務,鎖
感謝閱讀。也歡迎大家可以去看《MySQL技術內幕》和橘黃色的《演算法》。
前言
資料庫是軟體開發的核心,因為一個軟體如果要有狀態,也就是它記得你什麼時候操作過什麼,那麼資料要持久化,總要儲存在某些地方,這些地方也就是資料庫。當然,計算機上面的資料夾,檔案,你也可以把它當成資料庫,也就是檔案資料庫,現在很火的hadoop
大資料系統其實就是一個分散式檔案資料庫。
在沒有計算機的年代,記賬相關的財務都是用紙來記錄的,叫賬本。而現在,我們有了計算機,有了程式語言,有了資料庫系統,所以我們可以程式設計,將資料插入資料庫,查找出資料庫中的資料。
歷史的選擇,關係型資料庫因為很符合人的直覺,所以使用的範圍最廣。顧名思義,關係型資料庫,就是資料之間是有關係約束。在這篇文章中,關係型資料庫
關係型資料庫管理系統
指的是操縱這些資料組織形式綜合體的軟體組合。一個是資料本身,一個是操縱資料軟體本身。
大白話
關係型資料庫,可以包含很多個二維化的資料結構,叫做表,有行列之分,就像棋盤一樣。列是欄位,比如性別,年齡,姓名,行是一行行記錄:
表1: 人口登記表
編號 性別 年齡 姓名
1 男 22 大大
2 女 34 次奧
非常的直觀。
每一行記錄可以有個主鍵,不可重複,比如編號,用以區分這行記錄。還可以多個表之間有關係約束,叫做外來鍵:
表2: 資產表 編號 資產數額 所屬人編號 1 20000 表1的編號1 2 10000 表1的編號2
這裡的所屬人編號關聯到了表1,這時發生了關係約束,如果你刪除了表1中的編號1,那麼表2的編號1就查不到這個人,所以不允許刪除。
這種關係約束避免了混亂,把相關的資料以強有力的關係模式進行繫結,防止人為失誤導致資料丟失或矛盾。
關係型資料庫的產生,非常直觀地體現了現實世界的各種業務邏輯。
SQL
結構化查詢語言SQL
(Structured Query Language)是對資料庫進行操作的一種形式化計算機語言,這裡的資料庫,指的是資料,而不是軟體。
SQL
語句經過資料庫管理系統的分詞,語義化,可以將資料插入資料庫,或者將資料以一定形式查詢出來,也可以刪除資料。比如:
INSERT INTO `user`(`id`,`age`,`sex`,`name`) VALUES (1,22,"男","大大")
表示將一條資料插入使用者表裡面,id
,age
,sex
,name
是列欄位,後面的1,22,"男","大大"
是這條資料庫記錄。
上面這種樣子,很好,很強大。
比較有名的資料庫管理軟體就是人人都用的 MySQL
資料庫,這裡的資料庫指的是資料庫軟體,而不是資料。MySQL
可以將SQL
進行解析,然後以一定的形式儲存起來。
MySQL/索引和事務
索引
資料庫存放的是資料,如何查詢資料查得快,那麼查詢演算法就派上用場了。索引,也就是類似於我們中文字典目錄中的那些拼音字母,通過字母可以迅速定位到詞。
主要的查詢演算法有拉鍊法,也就是陣列連結串列,這種實現的方式也可叫雜湊索引。
另外一種是樹,有B
樹,以及其衍生的B+
樹。
拉鍊法,陣列的連結串列:
0 -> 資料1 -> 資料2
1 -> 資料1 -> 資料2
2 -> 資料1 -> 資料2
3 -> 資料1 -> 資料2
4 -> 資料1 -> 資料2
5 -> 資料1 -> 資料2
豎下來的第一列是一個數組,總共有6個數組元素位置,每一個數組元素後面有一條長長的鏈。
插入資料時,比如資料主鍵是8(每一行資料庫表記錄,主鍵欄位就是索引,因為比較重要,所以叫主鍵,主要的鍵),那麼8除以6餘2,那麼將這個資料鏈接在第二個陣列元素的連結串列中。因為做這個計算公式很快,而定位到這個陣列位置更快了,直接用陣列的記憶體位置+陣列偏移量*指標位數就可以了。所以用空間換了時間。
0 -> 資料1 -> 資料2
1 -> 資料1 -> 資料2 -> 主鍵8所在的資料
2 -> 資料1 -> 資料2
3 -> 資料1 -> 資料2
4 -> 資料1 -> 資料2
5 -> 資料1 -> 資料2
這種方式如果資料太多,而陣列長度過小,那麼陣列元素後面的鏈就越來越長了,那麼查詢的意義就越來越慢了。
所以有了