你完成了你的品牌新的應用程序,一切工作就像一個魅力。用戶來使用你的網絡。每個人是幸福的。
然後,突然間,一個大爆發的用戶殺死你的MySQL服務器,您的網站已關閉。出了什麼問題?你怎麼能阻止它嗎?
以下是MySQL性能優化的一些技巧,將幫助你,幫助你的數據庫。
大處著眼
在早期的發展階段,你應該知道預期到您的應用程序的用戶數。如果你希望很多用戶來說,你應該想想大,從一開始,計劃進行復制,可擴展性和性能。
但是,如果你優化你的SQL代碼,架構和索引策略,也許你不會需要大環境。你必須總是三思而後行的性能和可擴展性是不一樣的。
請務必使用EXPLAIN
EXPLAIN語句可以被用來作為獲取信息的方式MySQL如何執行SELECT語句的代名詞DESCRIBE。
當你前面一個關鍵字EXPLAIN SELECT語句,MySQL的顯示信息的查詢執行計劃的優化。也就是說,MySQL的說明它將如何處理SELECT,包括信息表加入的順序。可以使用EXPLAIN擴展的提供額外的信息。
選擇正確的數據類型
通常存儲在磁盤上(除了一些數據庫,內存數據庫一樣,它是存儲在內存中)。這意味著,為了獲取信息,為您的數據庫,它必須從磁盤讀取該信息,並把它變成一個結果集,您可以使用。磁盤I / O是極其緩慢的,尤其是在比較其他形式的數據存儲。
當你的數據庫的增長要大,開始讀取時間要長。設計拙劣的數據庫處理這個問題比他們實際需要的磁盤上分配更多的空間。這意味著該數據庫占用空間的磁盤的使用效率低下。
選擇正確的數據類型,可以幫助確保我們存儲的數據,使數據庫盡可能的小。為此,我們只選擇我們所需要的數據類型。
使用持久連接
使用永久連接的原因是減少數量的連接是相當昂貴的,即使他們更快的與MySQL與大多數其他數據庫。
有一些爭論這個話題,在網絡上mysqli擴展已禁用持久性連接功能,所以我會寫更多關於這個主題。持久連接的唯一的缺點是,如果你有多個並發連接,可以達到max_connections設置。這是很容易改變Apache的設置,所以我不認為這是原因為什麼你不應該使用持久連接。
持久連接是特別有用的,如果你有另一台計算機上的數據庫服務器。由於上述缺點,明智地使用它們。
了解查詢緩存
查詢緩存存儲的SELECT語句的文本,連同相應的結果發送到客戶端。如果相同的語句被接收後,服務器從查詢緩存中,而不是分析和再次執行該語句檢索結果。查詢緩存是共享的會話之間,這樣的結果集所產生的一個客戶端可以發送另一個客戶端發出的相同的查詢。
查詢緩存的環境中,可能是有用的,你有表不經常改變,服務器接收到許多相同的查詢。對於許多Web服務器產生許多動態頁面的基於數據庫的內容,這是一個典型的情況。
查詢緩存不返回過時的數據。在查詢緩存表被修改時,任何相關的條目將被刷新。
你怎麼找到我的MySQL查詢緩存是工作或沒有?
MySQL提供的統計資料,只需鍵入下面的命令在mysql>提示符下:
復制代碼 代碼如下:
mysql> show variables like 'query%';
不要使用索引列的功能
列上的索引可以是偉大的性能增益,但如果你使用該列中的函數,指數是從來沒有使用過。
總是嘗試重寫查詢不使用索引列的功能。
復制代碼 代碼如下:
WHERE TO_DAYS(CURRENT_DATE) - TO_DAYS(event_date) <= 7
可能是
復制代碼 代碼如下:
WHERE event_date >= '2011/03/15' - INTERVAL 7 DAYS
今天的日期是從PHP生成。這樣一來,指數列EVENT_DATE的查詢緩存內可存儲和查詢。
了解禅宗的SQL編碼
SQL代碼是優化數據庫性能的基礎。主SQL編碼技術,如重寫子查詢的SQL語句使用連接,消除了連接和類似的游標。
通過編寫巨大SQL代碼數據庫的性能將是巨大的。
使用ON DUPLICATE KEY UPDATE
如果你指定ON DUPLICATE KEY UPDATE,將某行插入,會導致在一個UNIQUE索引或PRIMARY KEY重復的值,更新舊行。
復制代碼 代碼如下:
INSERT INTO wordcount (word, count) VALUES ('a_word',1) ON DUPLICATE KEY UPDATE count=count+1;
您保存訪問服務器(然後選擇更新),清理你的代碼刪除所有,如果record_exists插入其他更新。
如果按照此提示,數據庫將不勝感激給你。