1. 程式人生 > >z583773315的專欄

z583773315的專欄

現在用的比較多的就是mysql了,因此在這裡總結下一些常用的優化,方便以後使用。

1 使用 limit 1
當你確定你的查詢返回的是1條資料的時候,使用 limit 1,你已經知道結果只會有一條結果,但因為你可能需要去fetch遊標,或是你也許會去檢查返回的記錄數。在這種情況下,加上 LIMIT 1 可以增加效能。這樣一樣,MySQL資料庫引擎會在找到一條資料後停止搜尋,而不是繼續往後查少下一條符合記錄的資料。

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

這裡寫圖片描述
從上圖你可以看到那個搜尋字串 “last_name LIKE ‘a%’”,一個是建了索引,一個是沒有索引,效能差了4倍左右。另外,你應該也需要知道什麼樣的搜尋是不能使用正常的索引的。例如,當你需要在一篇大的文章中搜索一個詞時,如: “WHERE post_content LIKE ‘%apple%’”,索引可能是沒有意義的。你可能需要使用MySQL全文索引或是自己做一個索引(比如說:搜尋關鍵詞或是Tag什麼的)

3 join 注意問題
在Join表的時候使用相當型別的例,並將其索引
如果你的應用程式有很多 JOIN 查詢,你應該確認兩個表中Join的欄位是被建過索引的。這樣,MySQL內部會啟動為你優化Join的SQL語句的機制。
而且,這些被用來Join的欄位,應該是相同的型別的。例如:如果你要把 DECIMAL 欄位和一個 INT 欄位Join在一起,MySQL就無法使用它們的索引。對於那些STRING型別,還需要有相同的字符集才行。(兩個表的字符集有可能不一樣)

// 在state中查詢company $r = mysql_query("SELECT company_name FROM
users LEFT JOIN companies ON (users.state = companies.state) WHERE users.id = $user_id"); // 兩個 state 欄位應該是被建過索引的,而且應該是相當的型別,相同的字符集。

4 千萬不要 ORDER BY RAND()
想打亂返回的資料行?隨機挑一個數據?真不知道誰發明了這種用法,但很多新手很喜歡這樣用。但你確不瞭解這樣做有多麼可怕的效能問題。
如果你真的想把返回的資料行打亂了,你有N種方法可以達到這個目的。這樣使用只讓你的資料庫的效能呈指數級的下降。這裡的問題是:MySQL會不得不去執行RAND()函式(很耗CPU時間),而且這是為了每一行記錄去記行,然後再對其排序。就算是你用了Limit 1也無濟於事(因為要排序)
5 避免 SELECT *
從資料庫裡讀出越多的資料,那麼查詢就會變得越慢。並且,如果你的資料庫伺服器和WEB伺服器是兩臺獨立的伺服器的話,這還會增加網路傳輸的負載。所以,你應該養成一個需要什麼就取什麼的好的習慣。使用sqlyog中的貼上sql語句就能得到你需要的欄位,Oracle中可以使用試圖或使用idea的功能也能得到你需要的sql欄位。
6 儘可能的使用 NOT NULL
除非你有一個很特別的原因去使用 NULL 值,你應該總是讓你的欄位保持 NOT NULL。這看起來好像有點爭議,請往下看。
首先,問問你自己“Empty”和“NULL”有多大的區別(如果是INT,那就是0和NULL)?如果你覺得它們之間沒有什麼區別,那麼你就不要使用NULL。(你知道嗎?在 Oracle 裡,NULL 和 Empty 的字串是一樣的!)
不要以為 NULL 不需要空間,其需要額外的空間,並且,在你進行比較的時候,你的程式會更復雜。 當然,這裡並不是說你就不能使用NULL了,現實情況是很複雜的,依然會有些情況下,你需要使用NULL值。