你完成了你的品牌新的應用程式,一切工作就像一個魅力。使用者來使用你的網路。每個人是幸福的。
然後,突然間,一個大爆發的使用者殺死你的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插入其他更新。
如果按照此提示,資料庫將不勝感激給你。