MySQL Basic Tunning

環境說明:目前我用的是 64bit Intel 4 核心 2.4GHz CPU 的機器加上 8 GB 的 RAM ,硬碟選用一般的 SATA 介面,我的資料庫每小時會執行大概 30 萬個查詢 ( 295.73 k ),大約每秒 (80) 個查詢,每天 1000 萬次查詢,目前暫時沒有 Replication 機制 (想增加)。
Continue reading “MySQL Basic Tunning”

MySQL 大量刪除資料的問題

    url_detail_history 資料表
    +--------------+---------------------+------+
    | Field        | Type                | Null |
    +--------------+---------------------+------+
    | id           | bigint(11) unsigned | NO   |  -> 有 Auto_increment
    | url_id       | int(11)             | NO   |
    | visitor_ip   | varchar(15)         | NO   |
    | visitor_fqdn | varchar(100)        | NO   |
    | visitor_time | timestamp           | NO   |  -> CURRENT_TIMESTAMP
    +--------------+---------------------+------+

現在裡面有許多筆資料,可以用

得知每個 url_id 有幾筆資料。

我前幾天寫錯了一個地方,導致資料表裡面長了大概一百萬筆資料。由於我 SQL 很弱,所以想知道有沒有辦法直接用 SQL 語法執行刪除,條件是:每個 url_id 只要總數超過 N 筆資料就刪除到只剩下 N 筆為止, 當然, id 越大代表資料越新,必須能從小的 id 開始刪起。

我有寫一段程式來跑但是效能不彰,系統 loading 飆到 100 多,拉牛上樹慘不忍睹..(以下是虛擬碼)

這樣作法效能很差,不想這麼暴力解這個問題… 😥

MySQL 資料庫儲存引擎的選用

最近在工作上遇到一個資料庫的問題,主要是 MySQL 儲存引擎的選用。但我對各種儲存引擎其實不甚瞭解,在應用上往往也是用預設值,現在面臨了嚴重的問題,只好查資料來幫我釐清觀念。

這篇文章主要討論 Memory, MyISAM, InnoDB 三種儲存引擎,因為我只選用這三種。首先,先看個我做了很久的表格吧!
Continue reading “MySQL 資料庫儲存引擎的選用”

mysqldump 的一些注意事項

最近在工作上常常遇到一些以前古人建立的資料庫編碼混亂的問題,通常都發生在 MySQL 資料庫新舊轉換上面。 MySQL 預設的語系是 latin1 ,但是以現在的情況而言,非英語系國家最適合的當然是 utf8 。

Continue reading “mysqldump 的一些注意事項”

MySQL 驚魂記

其實我很久沒去動伺服器了,前幾天放假時心血來潮,下幾個指令看看硬碟的狀況,不看還好,一看吐血…

roga@Lab3:~$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/md0              229G   62G  168G  27% /
tmpfs                 507M     0  507M   0% /lib/init/rw
udev                   10M   44K   10M   1% /dev
tmpfs                 507M     0  507M   0% /dev/shm
roga@Lab3:~$

我明明硬碟上什麼都沒放,怎麼會活生生被吃掉 62G 呢!?

用指令 root@Lab3:/# du -ckhs /* 一層一層慢慢查才發現原來 /var/log/mysql 裡面有一大堆 mysql-bin.0000XX ,原來這些都是 MySQL 的 Binary Log ,讓你在 MySQL 爛掉的時候可以用 Binary Log 救回來。由於我都直接 dump 每日備份,所以這個 Replay 用的 Binary Log 當然這就用不到啦!上網找了方法,只要在 my.cnf 裡面找到以下兩行設定:

expire_logs_days = 10
max_binlog_size = 100M

把 size 和保留天數調整一下就可以了。之後重新啟動 MySQL 即可見效,如果試了很多次 MySQL 都再起不能的話,直接把 /var/log/mysql 裡面的 binary 檔都移掉,這樣就可以正常重新啟動了。

注意:執行這個作法之前,請確定資料庫備份方案足夠完善,以免哪天 crash 沒有東西可以備份還原。