1. 為查詢緩存優化查詢
當有很多相同的查詢被執行了多次的時候,這些查詢結果會被放到一個緩存中,這樣,後續的相同的查詢就不用操作表而直接訪問緩存結果了。
2. EXPLAIN SELECT 查詢
使用 EXPLAIN 關鍵字可以知道MySQL是如何處理SQL語句的。這可以查詢語句或是表結構的性能瓶頸。
EXPLAIN 的查詢結果還會索引主鍵被如何利用的,數據表是如何被搜索和排序的……等等
3. 當只要一行數據時使用 LIMIT 1
當查詢表的有些時候,已經知道結果只會有一條結果,但因為可能需要去fetch游標,或是也許會去檢查返回的記錄數。
在這種情況下,加上 LIMIT 1 可以增加性能。這樣一樣,MySQL數據庫引擎會在找到一條數據後停止搜索,而不是繼續往後查少下一條符合記錄的數據。
4. 為搜索字段建索引
索引並不一定就是給主鍵或是唯一的字段。如果在你的表中,有某個字段你總要會經常用來做搜索,那麼,請為其建立索引吧。
5. 在Join表的時候使用相當類型的例,並將其索引
如果應用程序有很多 JOIN 查詢,應該確認兩個表中Join的字段是被建過索引的。這樣,MySQL內部會啟動優化Join的SQL語句的機制。
而且,這些被用來Join的字段,應該是相同的類型的
6. 千萬不要 ORDER BY RAND()
想打亂返回的數據行?隨機挑一個數據?真不知道誰發明了這種用法,但很多新手很喜歡這樣用。但你確不了解這樣做有多麼可怕的性能問題。
如果你真的想把返回的數據行打亂了,你有N種方法可以達到這個目的。這樣使用只讓你的數據庫的性能呈指數級的下降。
7. 避免 SELECT *
從數據庫裡讀出越多的數據,那麼查詢就會變得越慢。並且,如果你的數據庫服務器和WEB服務器是兩台獨立的服務器的話,這還會增加網絡傳輸的負載。
所以,你應該養成一個需要什麼就取什麼的好的習慣。
8. 永遠為每張表設置一個ID
我們應該為數據庫裡的每張表都設置一個ID做為其主鍵,而且最好的是一個INT型的(推薦使用UNSIGNED),並設置上自動增加的AUTO_INCREMENT標志。
就算是你 users 表有一個主鍵叫 “email”的字段,你也別讓它成為主鍵。使用 VARCHAR 類型來當主鍵會使用得性能下降。另外,在你的程序中,你應該使用表的ID來構造你的數據結構。
9. 使用 ENUM 而不是 VARCHAR
ENUM 類型是非常快和緊湊的。在實際上,其保存的是 TINYINT,但其外表上顯示為字符串。這樣一來,用這個字段來做一些選項列表變得相當的完美。
如果你有一個字段,比如“性別”,“國家”,“民族”,“狀態”或“部門”,你知道這些字段的取值是有限而且固定的,那麼,你應該使用 ENUM 而不是 VARCHAR。
10. 從 PROCEDURE ANALYSE() 取得建議
PROCEDURE ANALYSE() 會讓 MySQL 幫你去分析你的字段和其實際的數據,並會給你一些有用的建議。只有表中有實際的數據,這些建議才會變得有用,因為要做一些大的決定是需要有數據作為基礎的。
11. 盡可能的使用 NOT NULL
除非你有一個很特別的原因去使用 NULL 值,你應該總是讓你的字段保持 NOT NULL。
12. Prepared Statements
Prepared Statements很像存儲過程,是一種運行在後台的SQL語句集合,我們可以從使用 prepared statements 獲得很多好處,無論是性能問題還是安全問題。
13. 無緩沖的查詢
正常的情況下,當你在當你在你的腳本中執行一個SQL語句的時候,你的程序會停在那裡直到沒這個SQL語句返回,然後你的程序再往下繼續執行。你可以使用無緩沖查詢來改變這個行為。
14. 把IP地址存成 UNSIGNED INT
很多程序員都會創建一個 VARCHAR(15) 字段來存放字符串形式的IP而不是整形的IP。如果你用整形來存放,只需要4個字節,並且你可以有定長的字段。而且,這會為你帶來查詢上的優勢,尤其是當 你需要使用這樣的WHERE條件:IP between ip1 and ip2。
15. 固定長度的表會更快
如果表中的所有字段都是“固定長度”的,整個表會被認為是 “static” 或 “fixed-length”。 例如,表中沒有如下類型的字段: VARCHAR,TEXT,BLOB。只要你包括了其中一個這些字段,那麼這個表就不是“固定長度靜態表”了,這樣,MySQL 引擎會用另一種方法來處理。
16. 垂直分割
“垂直分割”是一種把數據庫中的表按列變成幾張表的方法,這樣可以降低表的復雜度和字段的數目,從而達到優化的目的。
17. 拆分大的 DELETE 或 INSERT 語句
如果你需要在一個在線的網站上去執行一個大的 DELETE 或 INSERT 查詢,你需要非常小心,要避免你的操作讓你的整個網站停止相應。因為這兩個操作是會鎖表的,表一鎖住了,別的操作都進不來了。
18. 越小的列會越快
對於大多數的數據庫引擎來說,硬盤操作可能是最重大的瓶頸。所以,把你的數據變得緊湊會對這種情況非常有幫助,因為這減少了對硬盤的訪問。
19. 選擇正確的存儲引擎
在 MySQL 中有兩個存儲引擎 MyISAM 和 InnoDB,每個引擎都有利有弊。
MyISAM 適合於一些需要大量查詢的應用,但其對於有大量寫操作並不是很好。甚至你只是需要update一個字段,整個表都會被鎖起來,而別的進程,就算是讀進程都無法操作直到讀操作完成。另外,MyISAM 對於 SELECT COUNT(*) 這類的計算是超快無比的。
InnoDB 的趨勢會是一個非常復雜的存儲引擎,對於一些小的應用,它會比 MyISAM 還慢。他是它支持“行鎖” ,於是在寫操作比較多的時候,會更優秀。並且,他還支持更多的高級應用,比如:事務。
20. 使用一個對象關系映射器(Object Relational Mapper)
使用 ORM (Object Relational Mapper),你能夠獲得可靠的性能增漲。一個ORM可以做的所有事情,也能被手動的編寫出來。但是,這需要一個高級專家。
21. 小心“永久鏈接”
“永久鏈接”的目的是用來減少重新創建MySQL鏈接的次數。當一個鏈接被創建了,它會永遠處在連接的狀態,就算是數據庫操作已經結束了。而且,自 從我們的Apache開始重用它的子進程後——也就是說,下一次的HTTP請求會重用Apache的子進程,並重用相同的 MySQL 鏈接。