2011-05-15 96 views
2

網站我要管理是對工人的搜索引擎(黃色頁面樣式)有4,000,000條記錄的MySQL表?

我創建這樣的數據庫:

People: <---- 4,000,000 records 
id 
name 
address 
id_activity <--- linked to the activites table 
tel 
fax 
id_region <--- linked to the regions table 

activites: <---- 1500 activites 
id 
name_activity 

regions: <--- 95 regions 
id 
region_name 

locations: <---- 4,000,000 records 
id_people 
lat 
lon 

所以基本上,我有慢的問題,是請求選擇所有的「打工皇帝」圍繞一個selecty城市(由用戶選擇)

我已經創建了完全工作,但需要5-6秒才能返回結果的請求......

基本上我做了選擇素在桌子上的位置T以一定半徑選擇所有城市,然後加入到百姓餐桌

SELECT people.*,id, lat, lng, poi, 
     (6371 * acos(cos(radians(plat)) * cos(radians(lat)) * cos(radians(lng) - radians(plon)) + sin(radians(plat)) * sin(radians(lat)))) AS distance 
    FROM locations, 
     people 
    WHERE locations.id = people.id 
    HAVING distance < dist 
ORDER BY distance LIMIT 0 , 20; 

我的問題是:

  1. 是我的數據庫很好的設計?我不知道是不是每個有400萬記錄的2個表是個好主意。可以選擇嗎?
  2. 我的要求設計得不好嗎?
  3. 如何加快搜索速度?
+1

你的SQL有一個'HAVING'子句,但沒有'GROUP BY' - 你確定這是對的嗎? – Oded 2011-05-15 18:03:06

+0

每個人是否有eaxactly 1個位置或每個人可以有多個位置?如果沒有其他理由要拆分,將lat + lng表移動到people表中將會有所幫助。 – bot403 2011-05-15 18:04:15

+0

@Oded:是的,我的團隊只是忘了粘貼 – Fazoulez 2011-05-15 18:16:00

回答

4
  1. 該設計看起來正常化。這是我期望在大多數設計良好的數據庫中看到的。表格中的數據量很重要,但次要的。 但是如果PeopleLocations之間存在1對1的相關性,如從您的查詢中看到的那樣,我會說表應該是是一個表。這樣肯定會的幫助。

  2. 你的SQL看起來不錯,儘管增加約束來減少涉及的行數會有所幫助。

  3. 您需要index your tables。這通常對緩慢有幫助最多(因爲大多數開發人員根本不考慮數據庫索引)。

+0

Re#2:對MySQL – 2011-05-15 18:08:12

+0

@OMG有效 - 謝謝。我查看了文檔... – Oded 2011-05-15 18:10:50

+0

只是一個建議(或稍後考慮的事情)。如果你的數據庫有其他幾個表,還有其他幾行,並且你仍然注意到一些性能問題,SQL Server有一個名爲'FILE GROUPS'的特性。 FILE GROUPS允許你設置不同的數據庫,甚至可以設置一組表來使用不同的目錄。這在使用多個硬盤驅動器時有一些很好的性能優勢。不過,我不知道MySQL是否有'FILE GROUPS'等價物。 – Martin 2011-05-15 18:17:24

0

有幾個基本的事情可以讓你的查詢運行緩慢。

你的表格上有什麼索引?你有沒有在表上聲明主鍵?在沒有索引的情況下連接兩個帶有4M行的表會導致數據庫上的大量工作。確保你先得到這個權利。

如果您已經爲數據庫構建了正確的索引,則可以查看緩存數據。您正在查詢中進行計算位置(緯度/經度)通常是否固定?他們多久更換一次?您的位置表中的物品是實際位置(城市,建築物等),還是他們記錄了人們的位置(如Foursquare簽入)?

如果你的位置是地方,你可以做很多很好的優化,如果你隔離不經常變化的數據部分並預先計算它們之間的距離。

如果一切都失敗,請確保您的數據庫服務器有足夠的RAM。如果服務器可以將數據保存在內存中,它會加速很多事情。

+0

1:好吧我錯了,我不使用索引 2:地點表是地點的最低緯度(例如比薩店),所以它是固定的 3:不確定要看你的意思。就像一個特定的城市預先扼殺那個城市周圍的所有比薩餅店? – Fazoulez 2011-05-15 18:38:59

+0

在比薩餅的規模,不是那麼多。這聽起來更像是位置感知計算(如Foursquare)。 如果您的位置在一個小區域內,您可能會使用畢達哥拉斯定理而不是三角函數計算近似距離。 – bpanulla 2011-05-16 20:39:10

相關問題