2011-06-17 80 views
0

我正試圖提高現有MySQL數據庫的性能。MySQL索引 - 如何提高性能?

它是關於餐館數據庫,有兩個相關的表:

還有一個供網站的所有實體表,每個實體都有一個唯一的ID, 一個實體可以是幾乎任何東西,它可以是一個餐廳,用戶和其他許多東西。 有幾種實體類型,而餐廳的實體類型是「對象」。

我還要說這個數據庫的結構已經存在了很多 所以我不想做大的修改,例如我不打算刪除所有實體的表 。 (數據庫本身沒有數據,但是PHP引擎是這樣構建的,所以它很難對結構進行大的修改)。

也有一個表只能爲對象,有幾種類型在數據庫 對象,但餐館專門將是 搜索了很多,因爲這是該網站的主題, 餐館有幾個領域:國家,城市,名稱,流派。 在同一個城市和國家不能有兩個同名的餐廳, (例如,可以有兩個餐廳同名,但在同一個國家的不同城市 或兩個同名的餐廳但在不同的國家)

所以從這個事實,我想我應該做一個獨特的三列索引的國家,城市和名稱列。

另外我想說的是,URL也是以www.domain.com/Country/City/Restuarant-Name的形式構建的,所以國家城市名稱的組合應該快速獲取,這種類型的查詢會發生很多。

但也會有許多其他類型的查詢,如:搜索名稱爲 餐廳(使用LIKE查詢,因爲搜索的名稱可以是全名的一部分 ))城市或某個國家。 搜索某個國家和城市中某個流派的所有餐館。 和幾乎所有可能的組合。

也許是最常用的查詢將是:(a)爲餐館名稱搜索某市 和國家(這將是一樣的,當一個URL被輸入,但將使用 LIKE使用的查詢),(B )在某個城市和國家搜索某種類型的餐館。 和最後(C)在搜索餐館的名字在全球範圍(在整個數據庫,而不指定城市和國家)

這個表(對象表),目前有PRIMARY KEY是對象的ID, 該ID還使用了很多,將最好的做法是以下?:

  1. 做一個三列的唯一指標了國家,城市的,名稱
  2. 再拍(不是唯一的)索引超出名字(所以我上面寫的類型c的查詢將會執行得很快)
  3. 可能會創建某種子表,其中只包含 表中的餐館,因此將查詢此子表。

我真的很感激任何幫助,因爲我(因爲如果我決定 做出大的改變我可能會單獨從對象 其餘的餐館開始,這是不那麼重要)我一直試圖決定這個很長一段時間。

ps在對象表中的一些對象將不會有任何類型或任何國家或城市,所以他們將保持NULL,我知道NULL值是允許在一個唯一的鍵,但它會對 有影響表演?

感謝名單了很多的人誰願意閱讀本長的問題:)

+1

http://stackoverflow.com/questions/6098616/dos-and-donts-for-indexes/ –

+0

@Denis感謝您的鏈接。爲了表現,索引是關鍵。潘打算。 – Wiseguy

回答

1

,只要你想,你可以思考和計劃,但你不會知道肯定,直到你試試,基準什麼是最好的,比較你的選擇。這就是說,這聽起來像你絕對是在正確的軌道上。因爲它是從最廣泛的命令最窄的選擇標準

複合鍵
你的「國家城市名」複合鍵似乎是最有用的順序。我相信你是故意這樣做的,因爲複合鍵的值只能從左到右使用。因爲名稱沒有在該索引中排名第一,所以您需要一個單獨的密鑰,只需名稱,如您所述。 NULL的

指數值
imysql.cn「允許索引NULL值真的不會影響性能。」這只不過是沒有數據或參考而已,所以我不知道他們如何/如果他們證明了這一點。

拆分表
如果有很多與餐廳記錄混合在其他的數據,當然,這可能會減緩事情有點。如果您將錶轉換爲具有相同結構的「餐廳」和「其他」表格,您仍然可以使用簡單的UNION輕鬆查詢其組合數據。除非您對數據/減速有所瞭解,否則我寧願避免將桌子拆分,除非必要,至少爲了簡單/一致。

是否有任何可預見的查詢當前索引不會考慮,如沒有國家的城市?如果是這樣,一定要適當地索引涵蓋所有可預見的情況。你沒有提到它,但我想你也會有一個索引類型


最終,您需要生成大量測試數據並進行嘗試。 (確定您最終可能期望得到多少數據,並生成至少三倍的測試數據,以使系統通過它的步伐。)從您描述的內容來看,設計聽起來不錯,但測試可能會發現意外問題,你可以從不同的索引中受益,等等。如果發現任何問題,你將有一個特定的目標來完成,而不是簡單地思考所有假設情景。

+0

感謝很多男士,我想多說一句,我還會有一個評級專欄用於對餐廳進行分類,這是否會對答案產生影響?我假設不能有一個以上的指數,也許只是增加評級並將其作爲四列指數? (國家,城市,名稱,等級) – fiftyeight

+0

@fiftyeight您的意思是「不能超過一個」_primary key_?因爲可以肯定有多少個索引就是你想要的。我認爲你不想在這個獨特的複合索引中包含_rating_。它不用於識別記錄。只需在_rating_列上放置一個非唯一索引。 – Wiseguy

+0

@fiftyeight所以它看起來像你會有四個索引:1)ID上的主鍵,2)「country-city-name」上的唯一組合索引,3)_name_上的常規索引,4)常規索引on _評分_。應該這樣做,除非你發現某些查詢由於某種原因不能使用這些查詢。如果你確實發現了這一點,那麼這真的可以幫到你。 :-) – Wiseguy