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

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

一:對數據庫優化

1.建立索引

對於查詢佔主要的應用來講,索引顯得尤其重要。不少時候性能問題很簡單的就是由於咱們忘了添加索引而形成的,或者說沒有添加更爲有效的索引致使。若是不加索引的話,那麼查找任何哪怕只是一條特定的數據都會進行一次全表掃描,若是一張表的數據量很大而符合條件的結果又不多,那麼不加索引會引發致命的性能降低。

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

MySQL能夠很好的支持大數據量的存取,可是通常說來,數據庫中的表越小,在它上面執行的查詢也就會越快。所以,在建立表的時候,爲了得到更好的性能,咱們能夠將表中字段的寬度設得儘量小。

A、數據類型儘可能用數字型,數字型的比較比字符型的快不少。

B、 數據類型儘可能小,這裏的儘可能小是指在知足能夠預見的將來需求的前提下的。

C、 儘可能不要容許NULL,除非必要,能夠用NOT NULL+DEFAULT代替。

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

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

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

4.適當的冗餘,增長計算列

知足範式的表必定是規範化的表,但不必定是最佳的設計。不少狀況下會爲了提升數據庫的運行效率,經常須要下降範式標準:適當增長冗餘,達到以空間換時間的目的。

二:對代碼優化

1.開啓查詢緩存

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

/ 查詢緩存不開啓mysql

$r = mysql_query(「SELECT username FROM user WHERE signup_date >= CURDATE()」);程序員

// 開啓查詢緩存面試

$today = date(「Y-m-d」);sql

$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作性能優化
相關文章
相關標籤/搜索