1. 程式人生 > >從數據庫、代碼和服務器對PHP網站Mysql做性能優化

從數據庫、代碼和服務器對PHP網站Mysql做性能優化

now() image 最好 提高 mysql 避免 允許 大數 rdate

數據庫優化是PHP面試幾乎都會被問到的事情,也是我們工作中應該註意的事情,當然,如果是小網站無所謂優化不優化,網站訪問量大了自然會暴漏數據庫的瓶頸,這個瓶頸是各方面問題綜合導致的,下面我們來做下數據庫優化的總結。

一:對數據庫優化

1.創建索引

對於查詢占主要的應用來說,索引顯得尤為重要。很多時候性能問題很簡單的就是因為我們忘了添加索引而造成的,或者說沒有添加更為有效的索引導致。如果不加索引的話,那麽查找任何哪怕只是一條特定的數據都會進行一次全表掃描,如果一張表的數據量很大而符合條件的結果又很少,那麽不加索引會引起致命的性能下降。

2.選取最適用的字段屬性

MySQL可以很好的支持大數據量的存取,但是一般說來,數據庫中的表越小,在它上面執行的查詢也就會越快。因此,在創建表的時候,為了獲得更好的性能,我們可以將表中字段的寬度設得盡可能小。

A、數據類型盡量用數字型,數字型的比較比字符型的快很多。

B、 數據類型盡量小,這裏的盡量小是指在滿足可以預見的未來需求的前提下的。

C、 盡量不要允許NULL,除非必要,可以用NOT NULL+DEFAULT代替。

D、少用TEXT和IMAGE,二進制字段的讀寫是比較慢的,而且,讀取的方法也不多,大部分情況下最好不用。

E、 自增字段要慎用,不利於數據遷移

3.設計規範化表,消除數據冗余

4.適當的冗余,增加計算列

滿足範式的表一定是規範化的表,但不一定是最佳的設計。很多情況下會為了提高數據庫的運行效率,常常需要降低範式標準:適當增加冗余,達到以空間換時間的目的。

二:對代碼優化

1.開啟查詢緩存

大多數的MySQL服務器都開啟了查詢緩存。這是提高性最有效的方法之一,而且這是被MySQL的數據庫引擎處理的。當有很多相同的查詢被執行了多次的時候,這些查詢結果會被放到一個緩存中,這樣,後續的相同的查詢就不用操作表而直接訪問緩存結果了。
 這裏最主要的問題是,對於程序員來說,這個事情是很容易被忽略的。因為,我們某些查詢語句會讓MySQL不使用緩存。

/ 查詢緩存不開啟

$r = mysql_query(“SELECT username FROM user WHERE signup_date >= CURDATE()”);

// 開啟查詢緩存

$today = date(“Y-m-d”);

$r = mysql_query(“SELECT username FROM user WHERE signup_date >= ‘$today‘”);

      上面兩條SQL語句的差別就是 CURDATE() ,MySQL的查詢緩存對這個函數不起作用。所以,像 NOW() 和 RAND() 或是其它的諸如此類的SQL函數都不會開啟查詢緩存,因為這些函數的返回是會不定的易變的。所以,你所需要的就是用一個變量來代替MySQL的函數,從而 開啟緩存。

2.優化查詢語句

 統一SQL語句的寫法,空格、大小寫保持整站一致。

盡量避免使用select *,返回無用的字段會降低查詢效率。

不要把SQL語句寫得太復雜,如果語句長可以將一個Select語句的結果作為子集,然後從該子集中再進行查詢,這種一層嵌套語句還是比較常見的,但是根據經驗,超過3層嵌套,查詢優化器就很容易給出錯誤的執行計劃。

     使用臨時表暫存結果,簡化SQL語句的重要方法就是采用臨時表暫存中間結果,但是,臨時表的好處遠遠不止這些,將臨時結果暫存在臨時表,後面的查詢就在tempdb中了,這可以避免程序中多次掃描主表,也大大減少了程序執行中“共享鎖”阻塞“更新鎖”,減少了阻塞,提高了並發性能。

盡量避免使用in 和not in,會導致數據庫引擎放棄索引進行全表掃描。

盡量避免使用or,會導致數據庫引擎放棄索引進行全表掃描。

盡量避免進行null值的判斷,會導致數據庫引擎放棄索引進行全表掃描。

盡量避免在where條件中等號的左側進行表達式、函數操作,會導致數據庫引擎放棄索引進行全表掃描。

減少跨庫查詢和大表連接操作(分割你的表,減小表尺寸)。

存儲過程、視圖、函數的適當使用。

三:對硬件優化

1.提升帶寬

帶寬越大,訪問速度越快。

2.當數據足夠快時,CPU可能出現瓶頸,增加cpu的核數或者cpu個數

3.I/O瓶頸一般發生在工作所需的數據遠遠超過有效內存容量時,這時候我們就用SSD硬盤代替普通磁盤,增加服務器內存;

本人博客:從數據庫、代碼和服務器對PHP網站Mysql做性能優化

從數據庫、代碼和服務器對PHP網站Mysql做性能優化