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搜尋的會快一些,由於這些固定的長度是和容易計算下一個數據的偏移量的,因此讀取天然會快一些。而若是字段長度是不固定的,那麼。每次要找下一條的話,須要程序找到主鍵。
而且,固定長度的表也更容易被緩存和重建。不過,惟一的反作用是,固定長度會浪費一些空間,由於不管你用不用,他都是要分配空間的。