mysql資料最佳化

來源:互聯網
上載者:User

標籤:

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. EXPLAIN 你的 SELECT 查詢

使用 EXPLAIN 關鍵字可以讓你知道MySQL是如何處理你的SQL語句的。這可以幫你分析你的查詢語句或是表結構的效能瓶頸。

EXPLAIN 的查詢結果還會告訴你你的索引主鍵被如何利用的,你的資料表是如何被搜尋和排序的……等等,等等。

3. 當只要一行資料時使用 LIMIT 1

當你查詢表的有些時候,你已經知道結果只會有一條結果,但因為你可能需要去fetch遊標,或是你也許會去檢查返回的記錄數。

在這種情況下,加上 LIMIT 1 可以增加效能。這樣一樣,MySQL資料庫引擎會在找到一條資料後停止搜尋,而不是繼續往後查少下一條符合記錄的資料。

4. 為搜尋欄位建索引

索引並不一定就是給主鍵或是唯一的欄位。如果在你的表中,有某個欄位你總要會經常用來做搜尋,那麼,請為其建立索引吧。

一個是建了索引,一個是沒有索引,效能差了4倍左右。

5. 在Join表的時候使用相當類型的例,並將其索引

如果你的應用程式有很多 JOIN 查詢,你應該確認兩個表中Join的欄位是被建過索引的。這樣,MySQL內部會啟動為你最佳化Join的SQL語句的機制。

而且,這些被用來Join的欄位,應該是相同的類型的。例如:如果你要把 DECIMAL 欄位和一個 INT 欄位Join在一起,MySQL就無法使用它們的索引。對於那些STRING類型,還需要有相同的字元集才行。(兩個表的字元集有可能不一樣)

6. 千萬不要 ORDER BY RAND()

想打亂返回的資料行?隨機挑一個資料?真不知道誰發明了這種用法,但很多新手很喜歡這樣用。但你確不瞭解這樣做有多麼可怕的效能問題。

如果你真的想把返回的資料行打亂了,你有N種方法可以達到這個目的。這樣使用只讓你的資料庫的效能呈指數級的下降。這裡的問題是:MySQL會不得不去執行RAND()函數(很耗CPU時間),而且這是為了每一行記錄去記行,然後再對其排序。就算是你用了Limit 1也無濟於事(因為要排序)

7. 避免 SELECT *

從資料庫裡讀出越多的資料,那麼查詢就會變得越慢。並且,如果你的資料庫伺服器和WEB伺服器是兩台獨立的伺服器的話,這還會增加網路傳輸的負載。

8. 永遠為每張表設定一個ID

我們應該為資料庫裡的每張表都設定一個ID做為其主鍵,而且最好的是一個INT型的(推薦使用UNSIGNED),並設定上自動增加的 AUTO_INCREMENT標誌。

就算是你 users 表有一個主鍵叫 “email”的欄位,你也別讓它成為主鍵。使用 VARCHAR 類型來當主鍵會使用得效能下降。另外,在你的程式中,你應該使用表的ID來構造你的資料結構。

而且,在MySQL資料引擎下,還有一些操作需要使用主鍵,在這些情況下,主鍵的效能和設定變得非常重要,比如,叢集,分區……

在這裡,只有一個情況是例外,那就是“關聯表”的“外鍵”,也就是說,這個表的主鍵,通過若干個別的表的主鍵構成。我們把這個情況叫做“外鍵”。比如:有一個“學生表”有學生的ID,有一個“課程表”有課程ID,那麼,“成績表”就是“關聯表”了,其關聯了學生表和課程表,在成績表中,學生ID和課程ID叫“外鍵”其共同組成主鍵

9. 使用 ENUM 而不是 VARCHAR

ENUM 類型是非常快和緊湊的。在實際上,其儲存的是 TINYINT,但其外表上顯示為字串。這樣一來,用這個欄位來做一些選項列表變得相當的完美。

如果你有一個欄位,比如“性別”,“國家”,“民族”,“狀態”或“部門”,你知道這些欄位的取值是有限而且固定的,那麼,你應該使用 ENUM 而不是 VARCHAR。

MySQL也有一個“建議”(見第十條)告訴你怎麼去重新組織你的表結構。當你有一個 VARCHAR 欄位時,這個建議會告訴你把其改成 ENUM 類型。使用 PROCEDURE ANALYSE() 你可以得到相關的建議。
10. 從 PROCEDURE ANALYSE() 取得建議

PROCEDURE ANALYSE() 會讓 MySQL 幫你去分析你的欄位和其實際的資料,並會給你一些有用的建議。只有表中有實際的資料,這些建議才會變得有用,因為要做一些大的決定是需要有資料作為基礎的。

例如,如果你建立了一個 INT 欄位作為你的主鍵,然而並沒有太多的資料,那麼,PROCEDURE ANALYSE()會建議你把這個欄位的類型改成 MEDIUMINT 。或是你使用了一個 VARCHAR 欄位,因為資料不多,你可能會得到一個讓你把它改成 ENUM 的建議。這些建議,都是可能因為資料不夠多,所以決策做得就不夠准。

 

mysql資料最佳化

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.