MySQL優化20條經驗(三)

16.垂直分割mysql

    「垂直分割」就是將一張表的數據按照列變成幾張表的形式。sql

     使用場景: 數據庫

    1.一些不經常使用的字段,能夠分割成新的表;apache

    2.一些須要被頻繁刷新的字段:例如:有個叫「last_login」的字段,用戶在每次登錄的時候他都會被更新。可是,每次更新的時候都致使該表的查詢緩存被清空。因此,你須要幫這個字段放到另一張表中,這樣就不會影響其餘字段的讀取了。緩存

   注意,被分離出去的造成的表,不要常常去Join他們,否則,他們的性能比不分割時還要差,並且,會是極數極降低。服務器

 

17.拆分大的DELETE或INSERT語句app

     若是你的一個在線網站的去執行去執行一個很大的DELETE或者INSERT查詢,你須要很是當心,要避免網站中止響應。由於這些操做是會鎖邊的,表一鎖住了,別的表就進步來了。性能

     Apache會有不少的子進程或者線程。因此,工做起來是很是有效率的,而咱們的服務器也不但願有太多的子進程,線程和數據庫鏈接,這是極大的佔用服務器的資源,尤爲是內存。網站

    若是你把表鎖上一段時間,好比30秒,那麼對於一個有很高訪問量的站點來講,這30秒所積累的訪問進程/線程,數據庫鏈接,打開的文件數,可能不只僅是讓你的WEB服務Crash,還有可能讓你的整臺服務器掛了。線程

    因此,若是你有一個大的處理,請必定將其拆分,使用Limit條件是一個好的方法。如:

    while(1){

           //每次只刪掉1000條記錄

           mysql_query("DELETE FROM logs WHERE log_date <= '2009-11-01' LIMIT 1000");

           if(mysql_affected_rows()==0){

                   //沒的可刪了,退出!

                   break;

           }

           usleep(6000);  

   }

 

18.越小的列會越快

     對於大多數的數據庫引擎來講,硬盤的操做多是最重大的瓶頸。因此,將數據變得緊湊對這種狀況很是有幫助,由於這減小了對硬盤的訪問。

     若是一張表只有幾列(如:字典表、配置表),那麼,咱們就沒有理由使用INT作主鍵,使用MEDIUMINT,SAMLLINT或者更新的TINYINT會更經濟一些。若是不記錄時間,使用DATE類型會比使用DATETIME好的多。

    固然,你也要留有足夠的空間,否則,你往後幹這件事會死的很難看。

 

19.使用正確的存儲引擎

     MySQL中有兩個引擎:MyISAM和InnoDB,每一個引擎都個有利弊。

     MyISAM使用一個大量查詢的應用,但對於大量的寫操做並非很友好。甚至只是update一個字段,整張表都會被鎖起來,而別的進程,就算是讀進程都沒法操做之到寫操做完成。另外,MyISam對於SELECT COUNT(*) 這類的計算是超快無比的。

    InnoDB的趨勢會是一個很是複雜的存儲引擎,對於一些小的應用,他會比MyISAM還慢。他是支持「行鎖」,因而他在寫操做比較多的時候,會更優秀。並且,他還支持跟多高級應用,好比:事務。

 

20.使用一個對象關係映射器(Object Relation Mapper)

    使用ORM你可以得到可靠的性能增加。一個ORM能夠作到事情,也能被手動編寫出來。可是這須要一個高級專家。

    ORM最重要的是"Lazy Loading",即:須要取值的時候纔會去正真的去作。可是這種機制的反作用是:可能會由於要建立不少很小的查詢反而會下降性能。

   ORM還會把你的SQL語句打成一個包,這樣比單獨查詢要快不少。

   目前,我的最喜歡的PHP的ORM是:Doctrine。  

 

21.當心「永久連接」

     「永久連接」的目的是用來減小重現建立MySQL連接的次數。當一個連接被建立了,他會永久處於連接的狀態,即便數據庫操做已經結束。

    PHP手冊:mysql_pconnect()

    這個貌似聽起來不錯,但因爲你只有有限的連接數、內存、文件句柄數等,因此他也製造了很多的麻煩;並且,apache運行在階段環境中,會建立不少的子進程。

相關文章
相關標籤/搜索