MySQL優化20條經驗(二)

11.儘量使用NOT NULLmysql

    除非必要,不然儘量保持字段NIOT NULL;程序員

    NULL須要額外的空間,而且在比較的時候程序會更復雜。sql

 

12.使用Prepared Statements緩存

   Prepared Statements很想存儲過程,是一箇中運行在後臺的SQL語句集合。安全

   好處:在安全性方面,他能夠檢查一下你綁定好的變量,這樣能夠保護程序不受到"SQL注入式"攻擊(程序員很容易忘記去手動檢查);在性能方面,當使用一個相同的查詢的時候,你能夠給Prepared Statements定義一些參數,而MSQL只會解析一次;另外,最新版本的MySQL在傳輸Prepared Statements是使用二進制形式,效率很是高。函數

  例:性能

    //建立prepared statementfetch

    if ($stmt = $mysqli ->prepare("SELECT username FROM user WHERE state=?")){ip

            $stmt ->bind_param("s",$state); //綁定參數內存

            $stmt ->execute(); //執行

            $stmt ->bind_result($username); //綁定結果

            $stmt ->fetch(); //移動遊標

            printf("$s is from %s\n",$username,$state);

            $stmt ->close();

   }   

 

13.無緩衝查詢

     正常狀況下,當你的腳本中執行一個SQL語句的時候,你的程序會停在那裏知道沒有這個SQL返回,而後你的 程勳再回繼續往下執行。咱們能夠使用無緩衝查詢(mysql_unbuffered_query()函數)來改變這個行爲。

     myql_unbuffered_query()發送一個SQL語句到MySQL而並不像mysql_query()同樣去自動fetch和緩存結構。這樣會節省不少可觀的內存,尤爲是那些會產生大量的查詢語句,而且,不須要等到全部的結果返回,只須要第一行的結果返回到時候,就立刻能夠開始工做於查詢結果了。

    然而,這樣會有一些限制。由於你要麼把全部的行都讀走,或者在下一次查詢以前調用mysql_free_query()清除結果。並且,mysql_num_rows()或mysql_data_seek()將沒法使用。

 

14.將IP地址存成UNSIGNED INT

      IP原本應該是字符串類型;但若是用整形來存放,只須要4個字節,而且這樣有固定的長度。並且,這樣會帶來查詢上的優點,尤爲是當你使用這養的WHERE條件:IP between ip1 and ip2。

     必須使用UNSIGNED INT,由於IP地址會使用整個的32位無符號整形。

     而你的查詢,你能夠使用INET_ATON()來把一個字符串IP轉成一個整形,並使用INET_NTOA()把一個整形轉成一個字符串IP.在PHP中,也有這樣的函數ip2long()和long2ip()。

 

15.固定長度的表會更快

     若是全部字段都是固定長度的,整個表都會被認爲是「static」或「fixed-length」。例如,若是你的表中沒有如下字段:VARCHAR,TEXT,BLOB。只要包含了其中一個其中一個這些字段,那麼這個表就不是「固定長度靜態表」了,此時,MySQL引擎會用另外一種方法來處理。

     固定長度的表會提升性能,由於MySQL搜尋的會快一些,由於這些固定的長度是和容易計算下一個數據的偏移量的,因此讀取天然會快一些。而若是字段長度是不固定的,那麼。每次要找下一條的話,須要程序找到主鍵。

    而且,固定長度的表也更容易被緩存和重建。不過,惟一的反作用是,固定長度會浪費一些空間,由於不管你用不用,他都是要分配空間的。

相關文章
相關標籤/搜索