1. 程式人生 > >大白話關係型資料庫:索引,事務,鎖

大白話關係型資料庫:索引,事務,鎖

感謝閱讀。也歡迎大家可以去看《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

這種方式如果資料太多,而陣列長度過小,那麼陣列元素後面的鏈就越來越長了,那麼查詢的意義就越來越慢了。

所以有了