php高階之資料庫設計 選擇合適的表引擎

2021-08-01 22:59:56 字數 1893 閱讀 1131

什麼是表引擎

我們看到的表結構,它的本質是資料在硬碟中的儲存。根據不同的特性,資料的儲存方式不同。比如:對於每一條資料,在硬碟中它是怎麼儲存的,怎麼壓縮的,怎麼建立索引和優化的,它的讀取和寫入是怎麼實現的。這些完整的一條路徑,我們稱之為表引擎。

選擇的依據

選擇的依據,是我們的需求,我們的需求很大程度上決定我們的選擇。有的時候,我們的習慣決策著這個過程。這裡,我們關注一下方面:

併發性,同一時間支援的寫入和讀取特性;

安全性,物理儲存結構,異常發生時資料的是否可靠;

事務性,資料執行的顆粒,以及提供的定義原子操作的特性;

查詢優化,這裡我們指查詢快取和索引;

在開發上,我們主要關注:(1,3,4),在運維層面,我們關注(2)。

在表的選擇上,最常用的是如下:

myisam

innodb

memory(heap)

從案例開始

mysiam

在5.0的時代,這個表是使用得非常普遍的,我了解的discuz就是使用這種表。它的優勢:查詢速度,被很多人看重。我們看看它的一些特點:

理論上儲存無限制(與作業系統的檔案系統有關)

存在text/blob全文索引

索引快取

資料壓縮

低儲存空間和低記憶體占用

高速寫入

查詢快取

序列寫入時,全表鎖(讀和寫)

不支援事務

集群支援

b-tree索引

create table a_myisam (.....) engine = myisam;

以上特性,我們看到myisam主要是為查詢而設計的,也是最初大家做資料儲存時考慮的東西。

innodb 從5.1開始,innodb慢慢發展起來,並且成為重要資料的儲存引擎。它的特點如下:

有限制的儲存

索引快取

支援事務

查詢快取

寫入行鎖

b-tree索引

create table a_myisam (.....) engine = innodb;

innodb更加穩定和成熟,也為更多需求提供解決方案。

memory

查詢速度快

mysql重啟後丟失

b-tree和hash索引

僅僅是為了快,小量資料。

這意味著什麼?我們的寫入速度要夠快且寫入不影響讀取。或者,我們可以並行寫入。這種情況,如果我們選擇myisam,寫入量的增加會導致全表上鎖,以至於讀取時,要等待鎖的釋放;那麼,顯然,myisam會造成表效能瓶頸。這種情況,我們選擇innodb。理由如下:

innodb寫入時,鎖為行鎖;不影響其它寫入,影響少量讀(有可能大量);

innodb的查詢效能理論上比myisam稍差,但是非常小,可忽略;

這個時候,選擇myisam,沒有什麼問題。(讀/寫比較高)

查詢是否前10個

增加積分

如何實現?

一般情況下我們會增加乙個欄位來做標記,這個字段假設為:lock,那麼更新的時候保證這個中間是沒有其它操作的。我們稱之為事務。

start

select ... from table where lock = 0 for update;

update table set lock = 1;

commit

呵呵,這個不用說了,使用innodb和memory都可以。一般我們使用記憶體儲存,會把它當做k-v來使用,根據設計的情況來選擇。(不過,業內很少時候,記憶體的儲存一般都會選擇memcache和redis)。

總結一下

如果讀/寫 比很大的話,假設這個尺度為10,那麼,就使用myisam(寫入併發小的情況)

如果需要事務的支援,使用innodb

如果需要對併發性(寫入)有要求的話,使用innodb

其它情況,可以根據實際場景選擇

選擇合適的資料庫

這部分在nosql精粹這本書的混合持久化到選擇合適的資料庫,即第13章到第15章描述的非常好。推薦大家閱讀下。使用鍵值對資料庫來儲存購物車和會話資料,使用文件資料庫來儲存已完成的訂單 使用庫存及產品 來儲存關係型資料庫,關係型資料庫在事務處理上面的優勢是其他資料庫不可比擬的 使用它圖資料庫來儲存客戶...

php 資料庫高階操作

資料庫高階操作 1 獲取報錯資訊mysql error mysql errno string mysql error resource link identifier 返回上乙個mysql函式的錯誤文字,如果沒有出錯則返回空字串 int mysql errno resource link ident...

React 高階之選擇合適的元件型別

最近專案基本都是用 react,今天總結分享 react component 常見的幾種形式,如果你在寫 react 時經常不知道怎麼拆分 這篇文章或許對你有所幫助。為了更充分理解 react,先搞懂平時寫的 jsx 是什麼。初學的時候有比較大困惑,這是一門新語言嗎?大部分人是匆匆掃過文件就開始開發...