LifeType 中文開發論壇

支援 => 安裝與設定精華區 => 主題作者是: markwu 於 一月 18, 2005, 04:18:15 下午



主題: 對於 Mysql 的調教
作者: markwu一月 18, 2005, 04:18:15 下午
布大俠的來信:

引用
Dear Mark,

我是布大俠,近來在調整系統,發現plog在運行一陣子之後會在我的mysql中留下許多不會關閉的thread,一個晚上就多了三十幾條死在那邊,請問有麼辦法查出是哪裡的問題?
我裝的外掛都是你這邊幹來的,我想應該有很多人也有相同問題只是沒注意到而已,但因為背包客棧流量不小,我的mysql跑一天就會掛了....請幫忙.


pLog 其實對於 DB 是沒有怎麼在調整的,所以當量一大很容易出現 performance 的瓶頸。有下面幾個方式可以來調整 pLog 的 performance。

1. DB 效能不彰:為 DB 加上 Index。

程式碼:

ALTER TABLE plog_articles ADD INDEX (num_reads), ADD INDEX (category_id), ADD INDEX (blog_id), ADD INDEX (user_id);
ALTER TABLE plog_articles_categories ADD INDEX (blog_id);
ALTER TABLE plog_articles_comments ADD INDEX (parent_id), ADD INDEX (article_id);
ALTER TABLE plog_articles_notifications ADD INDEX (article_id), ADD INDEX (user_id), ADD INDEX (blog_id);
ALTER TABLE plog_bayesian_filter_info ADD INDEX (blog_id); ALTER TABLE plog_bayesian_tokens ADD INDEX (blog_id);
ALTER TABLE plog_blogs ADD INDEX (owner_id);
ALTER TABLE plog_filtered_content ADD INDEX (blog_id);
ALTER TABLE plog_gallery_albums ADD INDEX (parent_id), ADD INDEX (owner_id);
ALTER TABLE plog_gallery_resources ADD INDEX (album_id), ADD INDEX (owner_id);
ALTER TABLE plog_host_blocking_rules ADD INDEX (blog_id);
ALTER TABLE plog_mylinks ADD INDEX (blog_id), ADD INDEX (category_id);
ALTER TABLE plog_mylinks_categories ADD INDEX (blog_id);
ALTER TABLE plog_myrecent ADD INDEX (blog_id), ADD INDEX (category_id), ADD INDEX (user_id);
ALTER TABLE plog_myrecent_categories ADD INDEX (blog_id);
ALTER TABLE plog_referers ADD INDEX (blog_id), ADD INDEX (article_id);
ALTER TABLE plog_trackbacks ADD INDEX (article_id);
ALTER TABLE plog_users_permissions ADD INDEX (blog_id), ADD INDEX (user_id), ADD INDEX (permission_id);


2. 常發生 Too many connection:加大 Mysql 的 max_connection。

預設值為 50。請自行視情況加大,例如

程式碼:
set-variable = max_connections = 500


3. 常發生 mysql thread 沒被使用,佔據 connection:縮短 Mysql 的 interactive_timeout。

預設值為 28800(八小時)。請自行視情況縮短,例如

程式碼:
set-variable = interactive_timeout= 600


4. 虛擬主機商不准我用 pconnect:改為 non persistent connection。



程式碼:
define( "ADODB_NEVER_PERSIST", true );  


加到 index.php 與 admin.php 的最前面

還有沒有人有其他建議呢?


主題: 對於 Mysql 的調教
作者: brian一月 19, 2005, 07:53:06 上午
感謝Mark的協助,我已經採用縮短wait_timeout(interactive_timeout)的方式暫時解決了連線過多不會關閉的問題.不過這種作法好像有點治標不治本,希望有更好的解決方式.


主題: 對於 Mysql 的調教
作者: far一月 19, 2005, 12:22:38 下午
被MarkWu凹了一下..就來寫一點點針對plog 0.32的db來寫一點建議好了.:Q

    .32 最大的問題就是...db寫的真夠爛的.又沒加Index..:Q

    然後它裡面架構跟query根本就亂寫.所以下面的tips能造成的功效有限..

    最好的作法就是..去改寫plog底層..:Q

    1.0 雖然號稱改了很多啦..但是...我看了之後的結果是..

    是比.32好多了..但是還是有很明顯的問題阿.= =a

    plog_articles
     - topic 沒事設text是自找麻煩..VARCHAR(150) [150看你對topic覺得多長是極限]
     - user_id, blog_id 其實有必要設到INT(10)麼?= =a
       如果使用者(or blog)會小於250人(個)..設個TINYINT(3) unsigned就夠了
       60000人以內.SMALLINT(5) unsigned
       1000000人以內.INT(7) unsigned.
       INT(10) unsigned.....yahoo才有可能有這個量吧.:Q
       當然也不要設的太緊.以免overflow..~___~
       你動了這個值.其他table有相同的也要改.不然會變慢.
     - num_reads也是.INT(10)也太......INT(6) or INT(7)也綽綽有餘.
     - category_id, blog_id, user_id 加 INDEX
     - date 可加可不加.我試過只對前6位做INDEX.對於cal的速度有變快很多.
       但或許是因為我用mysql 5的關係..有時候出來的result怪怪的.:Q

    plog_articles_categories
    - blog_id 加 INDEX

    plog_articles_comments
    - topic VARCHAR(150) [150看你對topic覺得多長是極限]
    - article_id 加 INDEX

    plog_articles_notifications
    - 這整個db設計上就有問題.一篇文章只會有一個使用者去設定是否要
      notification.且一篇文章只會出現一次..基本上article_id他就可
      以是primary key.然後整個table只要剩article_id & user_id即可.
      甚至user_id也可以不要..
    - article_id 加 INDEX

    bayesian 系列我不管.因為基本上這只對判斷英文準確率才高才正確.
    對於中文來說根本是亂判..所以我是把它disable.:Q

    plog_blogs
    -  owner_id 加 INDEX

    plog_filtered_content
    -  blog_id 加 INDEX

    gallery系列因為我不使用.所以沒研究.

    plog_host_blocking_rules
    - blog_id 加 INDEX

    plog_mylinks
    - blog_id, category_id 加 INDEX

    plog_mylinks_categories
    - blog_id 加 INDEX

    plog_referers
    - blog_id, article_id 加 INDEX

    plog_trackbacks
    - article_id 加 INDEX

    plog_users_permissions
    - permission_id TINYINT(1)
    - (user_id, blog_id) 聯合加 INDEX


    mysql server的tuning.我只列出一些針對my.cnf的更動.


    skip-name-resolve   # 不去做反解.但是打開這個請注意你mysql這個db的
                        # 權限設定

    low-priority-updates # Table-modifying operations will have lower
                         # priority than selects.

    set-variable    = connect_timeout=30    # timeout設小一點
    set-variable    = join_buffer_size=16M  # 聽Mark說用到很多join..
    set-variable    = max_connections=1024
    set-variable    = wait_timeout=30
    query_cache_size = 128M


    其實還有很多可以設拉.以上mysql的數值是要看你的硬體去調整的..
    所以也不要照抄.:Q

==
懶的寫了...zzz..


主題: 對於 Mysql 的調教
作者: far一月 19, 2005, 12:39:40 下午
加注幾點..

加INDEX只是治標不治本.真正要改善這個問題要去改寫query.

加INDEX也不是通通都加就好.在Query裡面有Where or ORDER BY到的才會有效果.(但是也不是一定.要有某些性質才會有用)

加INDEX會造成(INSERT.UPDATE.DELETE)變慢,但是SELECT變快,所以怎麼斟酌就看個人需求了.

建議要加INDEX的話.去看看他query怎麼寫.大多都是WHERE OR ORDER BY什麼.效果才會明顯.

還有阿..Mysql的Cache一定要開.差很多的...


主題: 對於 Mysql 的調教
作者: brian一月 21, 2005, 01:14:58 下午
程式碼:
define( "ADODB_NEVER_PERSIST", true );


回報一下,這個方法似乎沒有用,我的mysql的errorlog裡面仍然有很多被強迫關閉的connection.