Archive for ◊ 9月, 2009 ◊

25 9月 2009 Ubuntu php + GD2
 |  分類: 資訊科技  | 我要留言

這幾天幫家人寫網站程式時發現了一個問題,那就是 Ubuntu 預設的 PHP 並沒辦法使用到 GD library 的 imagefilter 等處理圖片的 function,儘管我明明有安裝了 php5-gd 套件了。

上了官方的討論區後發現,imagefilter 等處理圖片的function 並沒有在預設的套件中被啟用。 怎麼辦?

就這麼辦!!!

apt-get install build-essential debhelper fakeroot
cd /usr/src
apt-get source php5
apt-get build-dep php5
cd php5-5.2.6.dfsg.1

vim ./debian/rules

“–with-gd=shared,/usr –enable-gd-native-ttf \”
改為
“–with-gd=shared –enable-gd-native-ttf \”

dpkg-buildpackage -rfakeroot  #會讓你等30分鐘!!

cd ..
dpkg -i php5-gd_5.2.6.dfsg.1-3ubuntu4.2_i386.deb

/etc/init.d/apache2 restart

15 9月 2009 MySQL 效能調校(二)
 |  分類: 資訊科技  | 一則留言

經過了幾天的記錄,系統中會多出了一個好幾 MB 的檔案,檔案內容就是大量的 MySQL 語法,執行時間等數據。
那不是給人看的,我們還是要將檔案整理成方便閱讀的格式。

slow-log 檔案 = log-slow-queries.log
要輸出的檔案 = slow.log

mysqldumpslow ./log-slow-queries.log > ./slow.log

這樣子就會得到一份經過處理的龜速 query 列表了。 以下為一個範例。

Count: 9  Time=0.29s (2s)  Lock=0.00s (0s)  Rows=1.0 (9), cyberlar[cyberlar]@localhost
SELECT post_modified_gmt FROM wp_posts WHERE post_status = ‘S’ ORDER BY post_modified_gmt DESC LIMIT N

其中 Count: 9 代表這段語法在這段期間共被執行了 9 次。
Time = 0.29s (2s) 代表平均每次執行 0.29 秒,這九次共花費了2秒的時間。
Lock = 0.00 代表語法在執行時將 table lock 起來不讓別的 query 使用的時間。
Rows=1.0 代表這語法平均每次執行後所輸出的資料筆數。
接下來的就是 SQL 語法了。 mysqldumpslow 會將字串以 S 代替,數字以 N 代替。

從這些資訊中我們就可以看出為什麼會慢了。
從範例中我們可以確定語法本身是沒問題的,因為這是很常見的查尋語法了。
且執行時間也才 0.29秒,那為什麼還是會被 log 下來呢?
因為當初我在設定時有讓 MySQL 同時將沒有使用到 index 的查尋也都 log 起來。
也許您會覺得這 0.3 秒的時間根本查覺不出來。 但是如果一個頁面必須要經過 10 中不同的 query 來抓取資料的話!
那麼要 load 這一頁,使用者就必須等待 3 秒。 每一頁都等3秒,等幾秒。 這種差別是很大的。

我在一個擁有 177849 筆資料的資料庫中做一個搜尋的動作,在被搜尋的資料表還沒加入 index 前,要找尋資料的速度為 0.1635 秒。 將該資料表加入 index 後搜尋的時間進步為0.0036 秒。 這種效能的進步是感覺的出來且有根據的。

另外,有許多語法寫的並不是很好的比方說 select 裡面還包了個 select。 這一類的語法一般最少都會要執行個 0.5 秒 1 秒的,就要更改程式對 mysql 做查尋時的方式來增加效能。
雖然將經常要做查尋或比對 join 的資料表做 index 會增加效能,但是一眛的亂加是會產生反效果的,除了會浪費過多的記憶體資源,當資料在做 update 時還會造成 index 重讀,讓效能變的更差。

09 9月 2009 MySQL 效能調校(一)
 |  分類: 資訊科技  | 我要留言

許多資料量/流量大的網站因為都有將使用者資料或網站內容以資料庫做儲存,除了方便管理之外,抓取資料更為有效率也安全。
但是許多使用者一定會發現網站的資料量越來越大,更新越來越頻繁後開始會有效能降低的現象。 有的人會去重開資料庫,有的會去 OPTIMIZE TABLE,但做了這些動作後發現速度並沒有真正的改善。 我們要看的是真正有根據的數據,而不光光是要那個"感覺"

在預設的情況下,MySQL 並不會告訴你他做了甚麼事情,花了多久的時間。 我們必須設定 my.cnf 以讓 MySQL 知道要幫我們把速度慢的不正常的 query 給 log 起來。 設定的方法很容易,直接去編輯 my.cnf 並在 [mysqld] 中加入如下的設定。

set-variable    = log-slow-queries=log-slow-queries.log
set-variable    = long_query_time=2
set-variable    = log-queries-not-using-indexes

第一行的設定就是告訴 MySQL 要開啟記錄慢速 query 的功能,後面可設定檔名或是完整的 path 都可以。
第二行的設定是定義 “慢” 的時間長度,設定 2 代表超過兩秒的 query 都會被 log 起來。
第三行的設定會直接記錄所有沒有使用到 index 的內容搜尋 query,不管他 select 時間是不是只有 0.0001秒。

設定完成後再 reload 一下 mysql 就可以開始記錄,計錄時間越久越有可看性。 就放著給他跑個幾天吧。

下一篇會再告訴大家得到這個記錄檔後能做甚麼事。