MySQL 效能優化 經驗

2021-06-06 10:18:20 字數 2198 閱讀 7060

1.為查詢快取優化你的查詢

大多數的mysql伺服器都開啟了查詢快取。這是提高性最有效的方法之一,而且這是被mysql的資料庫引擎處理的。當有很多相同的查詢被執行了多次的時候,這些查詢結果會被放到乙個快取中,這樣,後續的相同的查詢就不用操作表而直接訪問快取結果了。

這裡最主要的問題是,對於程式設計師來說,這個事情是很容易被忽略的。因為,我們某些查詢語句會讓mysql不使用快取。請看下面的示例:

上面兩條sql語句的差別就是curdate(),mysql的查詢快取對這個函式不起作用。所以,像now()和rand()或是其它的諸如此類的sql函式都不會開啟查詢快取,因為這些函式的返回是會不定的易變的。所以,你所需要的就是用乙個變數來代替mysql的函式,從而開啟快取。

2.explain你的select查詢

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

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

挑乙個你的select語句(推薦挑選那個最複雜的,有多表聯接的),把關鍵字explain加到前面。你可以使用phpmyadmin來做這個事。然後,你會看到一張**。下面的這個示例中,我們忘記加上了group_id索引,並且有表聯接:ww.phperz.com

當我們為group_id欄位加上索引後:

我們可以看到,前乙個結果顯示搜尋了7883行,而後乙個只是搜尋了兩個表的9和16行。檢視rows列可以讓我們找到潛在的效能問題。

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

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

下面的示例,只是為了找一下是否有「中國」的使用者,很明顯,後面的會比前面的更有效率。(請注意,第一條中是select *,第二條是select 1)

4.為搜尋欄位建索引

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

從上圖你可以看到那個搜尋字串 「last_name like 『a%』」,乙個是建了索引,乙個是沒有索引,效能差了4倍左右。

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

如果你的應用程式有很多join查詢,你應該確認兩個表中join的字段是被建過索引的。這樣,mysql內部會啟動為你優化join的sql語句的機制。

而且,這些被用來join的字段,應該是相同的型別的。例如:如果你要把decimal欄位和乙個int欄位join在一起,mysql就無法使用它們的索引。對於那些string型別,還需要有相同的字符集才行。(兩個表的字符集有可能不一樣)程式設計師站

6.千萬不要order by rand()

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

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

下面的示例是隨機挑一條記錄

Mysql效能優化20條經驗

1.為查詢快取優化你的查詢 2.explain 你的 select 查詢 3.當只要一行資料時使用 limit 1 4.為搜尋欄位建索引 5.在join表的時候使用相當型別的例,並將其索引 6.千萬不要 order by rand 7.避免 select 8.永遠為每張表設定乙個id 9.使用 en...

MYSQL 效能優化的經驗總結

訪問量越來越大,mysql自然成為瓶頸。因此mysql 的優化成為我們需要考慮的問題,第一步自然想到的是 mysql 系統引數的優化,作為乙個訪問量很大的 日20萬人次以上 的資料庫系統,不可能指望 mysql 預設的系統引數能夠讓 mysql執行得非常順暢。1 back log 要求 mysql ...

mysql效能優化 mysql效能優化

優化方式 1.空間換時間 冗餘 2.時間換空間 字段優先使用型別 int date char varchar text 索引型別 btree索引 hash索引 索引的葉子下,存放乙個資訊指向所在行的資料位址。btree有利於範圍查詢,hash有利於精確查詢。btree用的更多一些。btree索引的常...