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