學習足跡

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的欄位要使用索引


參考資料

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檔案就可以了

效果如下:



2012年12月17日 星期一

JavaScript正規表示式整理

常用JavaScript正規表示式整理

引用後使用RegCheck.METHOD()即可檢測



2012年12月13日 星期四

Facebook PHP SDK在Windows發生SSL certificate problem解決方式

在Windows環境使用Facebook PHP SDK的時候,會發現找不到SSL Cert的問題,Facebook的API有設定如果找不到的話會再重讀一次SSL Cert,可是還是沒有什麼用

Fatal error: Uncaught CurlException: 60: SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed thrown in D:\xampp\htdocs\facebook_api\facebook-php-sdk\src\base_facebook.php on line 823

所以索性我就把SSL驗證的功能關掉,在src/base_facebook.php找到判斷SSL Cert的地方,照下面將before改成after這樣就可以了,畢竟在Linux環境底下還是可以正常使用SSL Cert,所以在找不到Cert的時候再關掉驗證比較好


參考資料


facebook api(php)使用預設範例時,出現伺服器錯誤解決方式

在使用facebook api提供的facebook-php-sdk內建的範例的時候,在丟到Ubuntu去執行的時候發現,一直跑出「伺服器錯誤」的訊息,也沒有出現什麼錯誤訊息,我也不曉得到底是哪一個環節出錯



一直trace整個examples範例的時候,發現它跑到base_facebook.php中的判斷curl函式不存在的if判斷式裡面了(function_exists('curl_init')),它裡面也有丟出例外(throw new Exception('Facebook needs the CURL PHP extension.');),可是就是沒有看到錯誤訊息,搞了好久原來是我沒有安裝curl的lib

所以使用指令apt-get install curl libcurl3 libcurl3-dev php5-curl去安裝curl的lib,之後就可以正常運作了


參考連結


在PHP使用Google API(V3)取得使用者的Gmail通訊錄清單

在新網站上線的時候,常常會需要使用者幫忙推廣網站給他的朋友,而在Google最常取用的就是使用者在Gmail的通訊錄清單,讓使用者通知他通訊錄清單的朋友有關網站的資訊,達到推廣的效果,所以我們就需要透過Google  API提供的功能去達到我們要完成的效果。









2012年12月11日 星期二

日劇Change第5集總理的話觸動人心


影片為日劇Change第5集影片片段

我以前是做小學老師的,去年還負責小學五年級,總之他們就是經常吵架,當然其中有些陰暗的東西,也有欺負的事件,遇到這些問題的時候,我就會像這樣給孩子們說教,你們好好思考思考,既然都是同學,有看不過去的地方,不能苟同的地方的話,就把自己想說的好好告訴給對方,好好聽對方想說的,然後都好好的去思考,這樣做的話就會注意到對方和自己的不同之處,正因為都視對方為同樣的人,即使是稍稍被否定,也會很生氣,如果有誰單獨行動,就會想那傢伙算什麼啊,這樣就開始吵架欺凌,但是世界上是不存在同樣的人的,大家都是思維方式情況各不相同的人,所以我希望孩子們理解自己和對方是不同的,在這基礎上才能考慮使用什麼樣的語言,能把自己的心意傳達給對方,怎樣才能說服對方,我一直在教育他們思考這一點,我認為外交也是一樣,正如剛剛賓加姆先生所說,我們是同盟國,但是日本和美國畢竟還是有所不同的,所以賓加姆先生所想的,有什麼想說的請全部說出來,我也會這樣做的

看完這一段類似訓話的東西 ,真的是狠狠地敲醒了我的腦袋,每個人每個團體彼此之間都是不同的,在遇到有不同意見的時候,要能夠好好了解彼此的說出這段話的緣由,而不是像腦神經斷裂似的,霹靂啪啦的一直說對方的不是,了解事情的來龍去脈之後,才會知道彼此的立足點是多麼的不同,才知道彼此為什麼要這樣的思考,如果大家都能夠冷靜的理解彼此,相信在遇到有不同意見時,也能夠找到對彼此都能夠接受的解決方式,世界就會少了很多衝突的怒氣,多了很多理解的笑容了。

在Win7右鍵選單加入使用Sublime Text開啟的功能

Sublime編輯器很好用,但是如果能夠在想要用Sublime開啟的檔案案右鍵就能直接用Sublime開啟的話那就更好了,所以拜讀了Google大神一下,搜尋到一篇簡體的「win7下將Sublime Text2 加入右鍵菜單」文章,但有些名詞跟繁體的Win7有點不同,所以我就將步驟用繁體Win7版本看得懂的字在這裡做紀錄一下

  • 在開始功能表下方輸入regedit(登錄檔編輯器)搜尋,在regedit.ext上面點右鍵,選取以系統管理者身份執行




  • 在regedit中選取路徑電腦 > HKEY_CLASSES_ROOT > * > shell,在shell上面點選右鍵新增 > 機碼,輸入SublimeText的機碼(這裡可以隨意命名你要的名稱)




  • 一樣在剛剛新增的機碼SublimeText上按右鍵新增 > 機碼,輸入Command的機碼(這裡一定要輸入Command的機碼名稱)




  • Command中的機碼中點選預設的字串值(預設值),點選右鍵修改它




  • 在數值資料裡面輸入你Sublime Text執行檔放置的路徑,並在後面加上%1(在這裡是D:\Sublime Text 2.0.1 x64\sublime_text.exe %1),根據「win7下將Sublime Text2 加入右鍵菜單」這篇的說法,%1代表是用tab的方式開啟文件,我在這邊試過不加的話好像沒辦法正常開啟,修改好後按下確定




  • 好了之後就可以隨便找一個文件點選右鍵來試看看,就會看到你剛剛新增的SublimeText的機碼,點選後就可以使用Sublime開啟這份文件摟




2012年12月3日 星期一

產品規劃注意事項

產品設計的原則


  • 從舊有的經驗出發:創業公司很忌諱處在「尋找問題」的階段,不要去憑空設想一個問題,想想過去你曾經思考過的,在這些領域你有更多的了解。
  • 知道自己有什麼不同之處:明白自己的創業公司跟別人有什麼不同,弄清為什麼現在是一個特殊的機會。
  • 先畫草圖再寫程式:Instagram的另一名創始人Systrom經常會拿著iPhone設計紙板,去咖啡館坐著,然後一起討論哪些功能要保留、哪些要刪掉。也許你會浪費掉幾張設計紙板,但是不會浪費幾週時間去寫代碼。
  • 每週進步一點:我們一直在問自己這些問題,「使用者會喜歡行動分享照片嗎?我們可以做出一些看起來不錯的濾鏡嗎?」花上一周時間調查,週五有了結論之後,下週繼續。
  • 在日常生活場景中驗證功能:Krieger稱之為「酒吧檢測」,將某個功能解釋給酒吧裡的陌生人聽,如果對方聽不懂,那就表明需要簡化。不要只是找你周圍的技術咖測試新功能。
  • 知道何時應該轉型:雖然現在Pivot(轉型)已經不是什麼好詞了,但是當你發現已經沒有什麼問題可以解決,那就是該轉型的時候到了。
  • 社群原型測試:沒必要一開始就寫出所有的程式,你可以隱藏在幕後做人工測試。Instagram的早期版本中曾考慮加入這樣的一個功能:當你的朋友加入時給你提醒。Krieger沒有直接把這個功能做出來然後測試,而是用人工方式手動給使用者發送通知,結果會員的反應不理想,於是這個功能就沒有做了。「我們一行程式都沒寫,所以一行程式也不用刪了。」
  • 與你的使用者保持順暢的溝通:不要用幾個月時間埋頭做產品,卻不知道這個功能到底是不是使用者需要的。

即時同步git repository資料到網頁資料夾(DocumentRoot)

為了能夠開發比較方便,在我將程式碼push到git server時候,能夠同時將我的程式碼,同步到Apache預設網頁讀取的資料夾(DocumentRoot:/var/www),這樣就不用一直需要到伺服器的網頁資料夾一直使用git pull origin master去讓程式碼保持在最新的版本,這樣不僅浪費自己的時間,也降低自己在開發上的效率。

PS:這個辦法在權限上沒有考慮較詳盡,在正式要上線的伺服器,建議不要這樣做,避免伺服器安全出現漏洞


首先在git server自己的repository(這裡以kejyun.git為例)中,開啟config的檔案,將設定值改成下面的範例,主要是bare設定為falseworktree設定為你要同步的資料夾(/var/www),denycurrentbranch設為ignore



如下圖