MySQL數據庫性能進行優化三大絕招

如下的文章主要介紹的是對MySQL數據庫性能進行優化的的幾大絕招,其中包括選取最適用的字段屬性,使用鏈接(JOIN)來代替子查詢(Sub-Queries),使用聯合 (UNION)來代替手動建立的臨時表的內容介紹。 數據庫

1. 選取最適用的字段屬性 性能

MySQL能夠很好的支持大數據量的存取,可是通常說來,數據庫中的表越小,在它上面執行的查詢也就會越快。所以,在建立表的時候,爲了得到更好的性能,咱們能夠將表中字段的寬度設得儘量小。例如,在定義郵政編碼這個字段時,若是將其設置爲CHAR(255),顯然給數據庫增長了沒必要要的空間,甚至使用VARCHAR這種類型也是多餘的,由於CHAR(6)就能夠很好的完成任務了。一樣的,若是能夠的話,咱們應該使用MEDIUMINT而不是BIGIN來定義整型字段。 大數據

另一個提升效率的方法是在可能的狀況下,應該儘可能把字段設置爲NOT NULL,這樣在未來執行查詢的時候,數據庫不用去比較NULL值。 優化

對於某些文本字段,例如「省份」或者「性別」,咱們能夠將它們定義爲ENUM類型。由於在MySQL中,ENUM類型被看成數值型數據來處理,而數值型數據被處理起來的速度要比文本類型快得多。這樣,咱們又能夠提升數據庫的性能。 編碼

2. 使用鏈接(JOIN)來代替子查詢(Sub-Queries) spa

MySQL從 4.1開始支持SQL的子查詢。這個技術可使用 SELECT語句來建立一個單列的查詢結果,而後把這個結果做爲過濾條件用在另外一個查詢中。例如,咱們要將客戶基本信息表中沒有任何訂單的客戶刪除掉,就能夠利用子查詢先從銷售信息表中將全部發出訂單的客戶ID取出來,而後將結果傳遞給主查詢,以下所示: 索引

DELETE FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo ) 事務


使用子查詢能夠一次性的完成不少邏輯上須要多個步驟才能完成的SQL操做,同時也能夠避免事務或者表鎖死,而且寫起來也很容易。可是,有些狀況下,子查詢能夠被更有效率的鏈接(JOIN)替代。例如,假設咱們要將全部沒有訂單記錄的用戶取出來,能夠用下面這個查詢完成: 內存

SELECT * FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo ) 效率


若是使用鏈接(JOIN)來完成這個查詢工做,速度將會快不少。尤爲是當salesinfo表中對CustomerID建有索引的話,性能將會更好,查詢以下:

SELECT * FROM customerinfo LEFT JOIN salesinfo ON customerinfo.CustomerID=salesinfo.CustomerID  WHERE salesinfo.CustomerID IS NULL


鏈接(JOIN)之因此更有效率一些,是由於 MySQL不須要在內存中建立臨時表來完成這個邏輯上的須要兩個步驟的查詢工做。

3. 使用聯合 (UNION)來代替手動建立的臨時表

MySQL 從 4.0 的版本開始支持 UNION 查詢,它能夠把須要使用臨時表的兩條或更多的 SELECT 查詢合併的一個查詢中。在客戶端的查詢會話結束的時候,臨時表會被自動刪除,從而保證數據庫整齊、高效。使用 UNION 來建立查詢的時候,咱們只須要用 UNION做爲關鍵字把多個 SELECT 語句鏈接起來就能夠了,要注意的是全部 SELECT 語句中的字段數目要想同。下面的例子就演示了一個使用 UNION的查詢。

SELECT Name, Phone FROM client UNION SELECT Name, BirthDate FROM author UNION SELECT Name, Supplier FROM product

上述的相關內容就是對於優化MySQL數據庫性能的「妙手」的描述,但願會給你帶來一些幫助在此方面。

相關文章
相關標籤/搜索