大家好,這個系列會介紹一些資料庫相關知識與內容,目前主要會偏向架構與一些應用上的知識為主,畢竟我不是 DBA 相關的工具,因此太過詳細的細節與內容會省略。好的,那麼第一節就來介紹一下資料庫的種類,以及主要的兩種儲存引擎吧[註1]!
根據資料之間的緊密、關聯程度,我們可以選擇使用關聯式或是非關聯式資料庫。
關聯式資料庫,資料都放在一個個資料表( table )中,而資料表與資料表間通常會有某些關聯,例如 A 資料表的 a 欄位與 B 資料表的 b 欄位數值相同,那麼我們就能藉由這種關聯性去篩選出我們在不同情境下所需要的資料。截至目前為止,由於這種關聯的特性,關聯式資料庫仍舊是最常使用的,而關聯式資料庫中應用最廣的則是 MySQL 。
非關聯式資料庫,資料則存放在一個個文件( document )中,而每筆資料則是用 json 的方式記錄在裡面。相比之下,由於非關聯式資料庫的文件之間無特定關聯,因此在建立上十分方便,也不需要指定輸入的欄位[註2],因此通常用於新創公司或是新業務拓展等,這些還不確定需要哪些資料的情況,或是用於紀錄 log 這種時間到就可以刪除的資料。
MyISAM,是改良自傳統的 ISAM ( Indexed Sequential Access Method ),也是 MySQL 最早的 Engine,它的主要優勢在於查詢的效能以及大容量的儲存空間。
由於 MyISAM 只管理索引並 cache ,因此比起同時管理索引與資料的 InnoDB 來的快上許多。然而 MyISAM 有兩個(對現代主流來說)嚴重的缺點, 就是不支援事務處理( Transaction )[註3]以及不支援外鍵( FK )[註4]。
此外,在清空資料( Drop )以及增長資料( Auto_Increment )這件事情上,MyISAM 比 InnoDB 快上許多,因此總結來說 MyISAM 本身比較適合處理高併發的情況。
InnoDB 是不同於 MyISAM 的另一種類型引擎,強調的是小而巧的功能。每張表的容量上限相對較低,但是能夠操作的功能更加細緻化,例如 Transaction 以及支援 FK。
此外, InnoDB 支援行級鎖( Row-level Lock ),代表不需要再跟之前的 MyISAM 一樣將整張表鎖起來進行操作,因此在處理 Select 以外的操作也快上許多。
目前 MySQL 的預設資料庫引擎已經改為使用 InnoDB ,因此若沒有特別調整的話都是直接使用目前偏主流的 InnoDB 囉~
[註1] 資料庫引擎有非常多種,以 MySQL 為例,只要輸入 SHOW ENGINES;
就可以看到長長一排它所支援使用的引擎。
[註2] 非關聯式資料庫依舊可以設定必須填入欄位,只是並不像關聯式資料庫一樣是必須的設定。
[註3] Transaction 多用於同時處理多張表的資料,或是一次性處理同張表內大量資料時,為了確保這些資料們都能成功處理的一種方式。
[註4] FK 算是關聯式資料庫在設計時的核心,連接資料表與資料表。