1.使用查詢緩存mysql
大多數的MySQL服務器都開始了查詢緩存,這是由MySQL查詢引擎處理的;這樣當出現重複的查詢的時候,查詢結果會放到一個緩存中,這樣當再次訪問的時候,會直接讀取緩存;但有些狀況下,某些查詢語句不會使用緩存,如:sql
//查詢緩存不開啓數據庫
$res = mysql_query("SELECT username FROM users WHERE time>= CURETIME()");緩存
//查詢緩存開始服務器
$today = date('Y-m-d');網絡
$res = mysql_query("SELECT username FROM users WHERE time>= '$today' ");數據結構
注:mysql對NOW()和RAND()不會開啓緩存,由於他們返回的結果是易變的,咱們須要用一個變量來代替函數,從而開啓緩存。app
2.EXPLAIN你的查詢函數
使用EXPALN關鍵字可讓你知道mysql如何處理你的SQL語句,這能夠幫你分析你的表結構後者性能瓶頸;post
EXPALN的查詢結果還會告訴你你的索引主鍵如何被利用,你的數據博阿如何被搜索和排序等。
3.當數據只有一條的時候使用LIMIT1
若是知道查詢表的結果只有一條,能夠考慮使用「LIMIT 1」,因爲查詢的時候須要去fetch遊標,這樣當數據庫引擎查詢到一條數據之後,能夠中止搜索;如:
//沒有效率的
$res = mysql_query("SELECT * FROM users WHERE country = 'china' LIMIT 1 ");
//有效率的
$res = mysql_query("SELECT 1 FROM uers country = 'china' L ");
4.爲索引字段創建索引
索引並不不必定就是給主鍵或者惟一字段的。若是你的表中的某個字段常常須要被用來搜索,那麼最好爲他簡歷索引。
有些搜索是不能使用正常的索引的,如:「WHERE post_content LIKE '%apple%' 」,索引是沒有意義的,你須要使用MySQL的全文索引或者本身新建一個索引(好比說:搜索關鍵詞或者Tag什麼的)
5.在join表的時候使用相同類型的字段,並將它們索引
若是你的應用有不少JOIN查詢,你應該肯定這兩個表中Join字段的類型是相同的,而且都被簡歷了索引,這樣mysql內部機制纔會爲你啓動join的sql語句。
這樣被用來Join的字段,應該是相同類型的。如:將一個DECIMAL字段類型和INT類型join到一塊兒,將沒法使用到索引;另外,string類型字段的需相同的字符集。
6.千萬不要使用ORDER BY RAND()
想打亂返回的數據行?直接使用RAND()會致使可怕的性能問題?示例如:
//千萬不要這樣作
$res = mysql_query("SELECT username FORM users ORDER BY RAND() LIMIT 1");
//這樣作更好
$counts_query = mysql_query("SELECT COUNT(*) FROM users");
$counts_arr = mysql_fetch($counts_query);
$rand = mt_rand(0,$counts_arr[0]-1);
$res = mysql_query("SELECT username FROM users LIMIT $rand,1"); //有「,」
7.避免SELECT *
從數據中讀取的字段越多,速度越慢;而且若是有多臺數據庫服務器的話,還會增長網絡傳輸負擔。
8.永遠爲每張表設置一個ID
咱們應該爲數據庫中的每一張表設置一個ID做爲主鍵,最好是一個INT類型(推薦使用UNSIGNED),並設置自動添加的AUTO_INCREMENT標誌。
儘可能使用INT類型做爲主鍵,並使用表的主鍵構造對應的數據結構;主鍵的性能和設置很是重要,尤爲是在集羣和分區等狀況下。
例外狀況:「關聯表」的「外鍵」,也就是說,這個表的主鍵,由若干標的表的主鍵構成,咱們吧這個狀況叫作外鍵;例如:有一個「學生表」有學生的ID,有一個「課程表」有課程ID,那麼,「成績表」就是「關聯表」了,其關聯了學生表和課程表,在成績表中,學生ID和課程ID叫「外鍵」共同構成主鍵。
9.使用ENUM而不是VARCHAR
ENUM類型,其表存的是字符串,添加選項的時候是美劇,顯示出來的是字符串;若是插入的記錄不在枚舉範圍中,對於的字段將變爲空,並對於的字段索引值爲0。
建議在字段的取值有限並且固定的狀況下使用。
10.使用PROCEDURE ANALYSE()取得建議
PROCEDURE ANALYSE()會幫你分析你的字段和實際的數據,並給出一個有用的建議;一些大的決定是須要數據做爲基礎的,而且會數據量的變化而變化。