補「MySQL 在 Mtron SSD 上的測試」這篇的說明。
價位上,Mtron SSD Pro 7000 系列 32GB 的單顆進價大約在 $40K (含稅),兩顆就 $80K 了,相較 15K RPM 73GB SCSI 硬碟四顆只要 $40K 的價錢偏高不少。
效率上,MyISAM 的 real data 測試發現不論是 Mtron SSD 32GB*2 跑 RAID0,還是 15K RPM 73GB SCSI*4 跑 RAID10,都是 CPU 先到瓶頸,I/O 都沒有問題。至於 InnoDB 的結果在 Kevin Burton 的 Blog 上可以看到不少 real data 的資訊。
不過,如果你的資料庫遇到 I/O 瓶頸的話 (用 RAID 1+0 都還解決不了) 可以考慮用多顆 Mtron SSD RAID 把效率換出來,不過比較治本的方法應該是改寫程式,想辦法 partition。另外看看是不是因為大量的 Table scan 造成效率低落…
對了,Mtron SSD 硬碟台灣有代理商了,曜紅科技。
在 MySQL Proxy 作者的 Blog 上看到一些關於 transaction 時有趣的用法:
話說回來,最近 lighttpd 又有一陣子沒什麼動作了,看起來心力都花在 MySQL 上面了…
InnoDB Barracuda (InnoDB Plugin 提供的新格式) 有測試結果了,在「Testing InnoDB “Barracuda” format with compression」這篇裡面以一個 30GB 的 mysqldump 檔案測試 (看他文章的內容,應該是 real data),在裡面提到幾個重點:
- 目前的 MySQL 有個與 UTF-8 有關的 bug 會影響測試結果 (「mysql_alter_table() unnecessarily does full table copy」),所以測試時以 latin1 測試。
- 為了測試 fast index,他用兩種不同的方式測試。第一種是把所有 DB scheme 與 index 都建立好,再將資料匯入;第二種是只先建立 primary key,等到匯入資料後再下 index。測試的結果發現,後者的總時間遠遠超越前者。
- 如果使用壓縮格式,匯入的速度會慢 30% ~ 50%,但是檔案大小只有原來的 1/3,讀取的速度不在這次測試的範圍裡,不過 comment 有人期待對於偏 I/O 的 query 效能會有提昇。
好幾天沒寫 Blog 了,主要是星期五六日去員工旅遊 (參考「員工旅遊 (2008/04/18~20) 」這邊),然後星期日晚上與星期一狂看 Bloglines 與新番,於是就好幾天沒寫 Blog 了…
說變天的原因是因為很多單位在 MySQL Conference & Expo 2008 這段時間發表了一堆東西,就管理與政策面來看,這是 Sun 買下 MySQL AB 後第一次的 MySQL Conference,很多人都在看 Sun 對於 MySQL 這套 Open Source Software 到底會有什麼大計畫。
另外一方面 (技術上),Oracle 推出的 InnoDB Plugin 所列出的優點讓人相當驚豔,解決了不少問題,不過可惜在目前最新版 5.1.24-rc 上無法運作。
再來是 Kickfire 用硬體的方式大幅增加 transaction 的速度,站上 Non-cluster 100GB data 的王座,實際上機器也很便宜,才 USD$35K。(如果你真的需要用到這麼快的 transaction 速度,百萬台幣應該不是什麼問題)
結果玩回來後發現一堆計畫都要再重新思考…
The 2008 MySQL Conference & Expo 幾個比較大的消息:
其他比較小的消息還包括了 MySQL 6.0、MySQL 5.1 Maria 之類的新聞,不過上面這兩個消息丟出來就讓人感覺很兇暴,其他的新聞就… (Kickfire 的 C/P 表現相當漂亮,在 100GB 的地方徹底殲滅 HP 與 Dell)
照 Manual 所列出來的功能,Zend_Db 似乎沒有提供 INSERT … ON DUPLICATE KEY UPDATE 的功能,所以就得自己做了。
正常的作法是自己寫 SQL query 處理,但我想到的方法就是先 ->insert(),如果失敗再 ->update()。拆開來的這兩個動作會使得 MySQL 多花不少 CPU resource,但我暫時不想自己寫 SQL Query (主要是因為嫌 escape 麻煩),先放個 XXX 等以後再 tune。
問題在 ->insert() 後如果遇到 Duplicate 會丟出 Exception,用 try-catch 的方法我不是很喜歡,但稍微翻過 Zend_Db 的 code,似乎沒辦法改成 return status,所以就只好用 try-catch 處理。這應該是跟底層的 PDO_MYSQL 有關,Zend_Db 只是在中間的介面。
如果還有遇到其他問題就繼續寫…
Zend_Db::factory() 可以吃兩種語法,第一種是用兩個參數指定所有的資訊,像這樣:
$params = array('host' => 'localhost', 'username' => 'my_username', 'password' => 'my_password', 'dbname' => 'my_database');
$db = Zend_Db::factory('pdo_mysql', $params);
第二種是吃一個參數,Zend_Config (或者繼承他的 class):
$conf = Zend_Config_Ini('filename.ini');
$db = Zend_Db::factory($conf);
如果想把資料庫設定放在檔案裡,再用 Zend_Config 讀進來傳給 Zend_Db,目前官方有 Zend_Config_Ini 與 Zend_Config_Xml 兩種方法,不過這兩種方法我都不喜歡,用 Google 找 “Zend_Config_Yaml”,沒有什麼人在研究這個 (在這裡是有看到一份,不過沒看到其他人用的心得)。
於是退而求其次,用 Zend_Json 讀進來後用第一種方式傳進去。