2012年12月25日 星期二

MySQL鎖表(Lock Table)Table-level與Row-level比較

沒有留言:

定義

鎖表(Lock Table)

在要更新資料表的資料時,MySQL會將表資料鎖定無法讀取,直到資料異動完畢,MyISAM預設支援Table-level lock,而InnoDB預設支援Row-level lock

Table-level lock

資料表資料異動時,將「整個資料表(Table)」都鎖定住無法讀取

Row-level lock

資料表資料異動時,將「要更新的資料列(row)」都鎖定住無法讀取


注意事項

在使用Row-level lock時必需要明確指定要異動資料的主鍵(Primary Key),否則將會改用Table-level lock去做資料表的異動

範例

假設有user資料表,裡面有id與name的欄位,id是主鍵

SQL Table lock Row lock No lock 備註
SELECT *
FROM user
WHERE id='1'
FOR UPDATE;

v

明確指定主鍵,並且有此筆資料,row lock
SELECT *
FROM user
WHERE id='-1'
FOR UPDATE;

v
明確指定主鍵,若查無此筆資料,無 lock
SELECT *
FROM user
WHERE name='KeJyun'
FOR UPDATE;
v


無主鍵,table lock
SELECT *
FROM user
WHERE id<>'1'
FOR UPDATE;
v


主鍵不明確,table lock
SELECT *
FROM user
WHERE id LIKE '3'
FOR UPDATE;
v


主鍵不明確,table lock

備註

FOR UPDATE 僅適用於 InnoDB,且必須在交易區塊(BEGIN/COMMIT)中才能生效。

參考資料

提高存取MySQL效率小技巧

沒有留言:
資料庫的存取效率,永遠是網站存取速度很重要的瓶頸,所以能在資料庫存取時提高效率,可以讓網站的存取速度增加很多,在這裡紀錄一下一些常用的小技巧





2012年12月24日 星期一

Node.js學習資源與套件

沒有留言:

文字文章


初階

影片





套件


測試除錯

node-inspector

  • 安裝
npm -g install node-inspector
  • 開啟指令
C:\>node-inspector
  • Debug JS檔案
C:\>node --debug-brk debug.js

2012年12月22日 星期六

在MySQL中MyISAM與InnoDB資料庫引擎比較

沒有留言:

定義

MyISAM:MySQL Indexed Sequential Access Method(有索引的順序存取方法)
InnoDB

比較表


項目/資料表類型 MyISAM InnoDB 備註
效能 較佳 較差
  • InnoDB需要處理資料異動時的交易紀錄檔(Transaction Log),每次有交易產生時,仍至少須寫入硬碟一次,因此對於某些硬碟或磁碟陣列,會造成每秒200次的交易處理上限。若希望達到更高的效能且保持交易的完整性,就必使用軟碟快取與電池備援。當然 InnoDB 也提供數種對效能衝擊較低的模式,但相對的也會降低交易的完整性。
  • MyISAM不需要處理資料異動時的交易紀錄檔,所以在資料異動及存取上速度會較InnoDB快,且無磁碟存取問題,但這並非因為它比較先進,這只是因為MyISAM不支援交易。。
交易
(Transaction)
X(不支援)O(支援) InnoDB在進行連續的資料異動(交易),如果發生錯誤的話可以還原至錯誤交易發生前的正常狀態,MyISAM因不支援交易,所以沒辦法進行還原
錯誤處理 較差 較佳
  • MyISAM則必需要重新「完整」掃描後才能重新建立索引,所以修復的時間與資料亮多寡成正比
  • InnoDB可以藉由交易紀錄檔快速恢復成未出錯前的資料,修復時間大略固定
穩定性 較差 較佳 因為InnoDB發生錯誤時的處理較MyISAM好,所以穩定性較佳
讀/寫/快取 較差 較佳 InnoDB有自己的讀寫快取管理機制,MyISAM則必須依靠作業系統來管理讀取與寫入的快取
記憶體使用 較佳 較差 InnoDB目前並不支援MyISAM所提供的壓縮與 terse row formats,所以對硬碟與快取記憶體的使用量較大。因此MySQL從5.0版開始,提供另一個負載較輕的格式,他可減少約略 20% 的系統負載,而壓縮功能已計畫於未來的新版中推出。
外來鍵
(Foreign Key)
X(不支援) O(支援) 無
主鍵
(Primary Key)
依需求 必須要有 InnoDB如果沒有設定主鍵或者非空唯一索引,就會自動生成一個6字元的主鍵(不可見)
count(*)
(From All Table)
較佳 較差
  • MyISAM撈取預存的總行數
  • InnoDB重新撈取整個表做計算
  • 若有加WHERE條件則,兩者從取效率相同
全文檢索
(Full Text Search)
O(支援) 5.6.4+支援 無
DELETE FROM Table 較佳 較差
  • MyISAM會丟掉原本的表後,重新建立一個新的表
  • InnoDB會一筆一筆的刪資料,可以使用TRUNCATE Table去進行所有資料的刪除(要有Drop權限)
索引保存 表格名稱.MYI的檔案 與資料一起保存 無
鎖表
(Lock Table)
Tabel-level Row-level
  • MyISAM
    • 當資料表有寫入時,其他人無法讀取 (有少數例外,像是 bulk insert)
  • InnoDB
    • 只有「明確」的指定主鍵,MySQL 才會執行 Row lock (只鎖住被選取的資料例) ,否則 MySQL 將會執行 Table Lock (將整個資料表單給鎖住),還是有很大機會還是可以讀取。
1 1 1 1
建議 搜尋資料 異動資料
  • MyISAM
    • 大量SELECT與INSERT
    • 資料量小
    • 全文檢索
  • InnoDB
    • 大量UPDATE與INSERT
    • 需要使用Foreign Key
    • 資料量大
    • 交易
    • InnoDB預設是開啟自動提交(Auto Commit)的,如果你按照MyISAM的方法來編寫程式不會存在錯誤,只是性能會很低,可以使用Begin及Commit將多個異動語法綁在同一個交易中。
  • 共同
    • 有使用WHERE的欄位要使用索引


參考資料

MySQL效率調校

沒有留言:

索引(index)

語法(SQL)

2012年12月20日 星期四

在MySQL使用Explain做SQL SELECT語法效能測試

沒有留言:

在MySQL我們在使用SELECT做撈取資料的時候,有時候常常會效能低落,撈取資料需要很長的時間,有時候是SQL語法下得不好導致沒有使用到正確的索引去撈資料,我們這個時候就必須要檢查我們下的SQL語法到底有哪些地方需要改善,我建立的comment的資料表並新增幾筆假資料去做示範





解釋MySQL語法效能:撈取留言資料





解釋MySQL語法效能:撈取留言資料







2012年12月18日 星期二

在Sublime使用Node.js及時編譯執行JS檔案

沒有留言:
在開發JavaScript時,總是要把JS程式在瀏覽器Run,才能看到執行的結果,有一些程式其實我們只是想要看他跑的資料流程有沒有正確,而沒有動到整個DOM文件或是需要跟Server存取資料,這樣的話我們可以用Sublime的Build System結合Node.js去執行我們的JS檔案就可以了

效果如下:



ADS