2012-06-05 47 views
0

我有這樣一個結構的數據庫MySQL的:
創建一個表是需要每一個國家 -

  • t_person(IDP,idcity,姓名,地址,運輸發射車,拉鍊,遞減,保險費)
  • t_city(idcity,idcountry,城市名)
  • t_country(idcountry,COUNTRYNAME)

我想一個非常普遍的 「生活搜索」(谷歌等):

SELECT p.name, p.addr, p.zip, p.desc, c.cityname, x.countryname, 
MATCH (p.name, p.addr, p.zip, p.desc) 
AGAINST ('fred* tall* 94620*' IN BOOLEAN MODE) as score 
FROM t_person p 
INNER JOIN t_city c ON c.idcity = p.idcity 
INNER JOIN t_country x ON x.idcountry = c. idcountry 
WHERE MATCH (p.name, p.addr, p.zip, p.desc) 
AGAINST ('fred* tall* 94620*' IN BOOLEAN MODE) 
AND x.idcountry = 43 -- (i.e USA) 
ORDER BY score DESC, p.name ASC, p.premium DESC 

當只有1000-1500行時,這個查詢運行時間大約爲0.011秒,但是當有30000+行時它將花費大約1.2+秒(我用數據發生器測試過它)。 問題是,如果我爲evey國家(1 --- n)人創建一個新表,如下所示:
t_person_uk,t_person_usa,t_person_spain,每行都有1500行,我認爲這樣搜索會很快速。
PD,在進行AJAX調用搜索之前,我已經有了0.25秒的超時時間。
謝謝,再見。

+2

除非編制索引失敗,否則不要爲每個國家創建表格。你在哪裏定義了索引?你的解釋告訴你什麼? –

+0

全文索引(p.nombre,p.addr,p.zip,p.desc,p。tels)/ 而且EXPLAIN說一切正常,行1,1,1,32000(我用來測試的生成數據)PRIMARY KEY無處不在,Keylength 2,null,3,2,另外:分頁(LIMIT 0, 15)沒有工作,因爲我必須通過最佳匹配來命名,名稱爲ASC,「premium」DESC(某些用戶是「高級」),並且您知道mysql如何工作(這與選擇所有行時相同或最差同時)。 - 無限制= 1.189秒,限制爲0,15 = 1.219秒 – DanStarck

+0

什麼是x.idpais?我沒有看到它在架構中的任何地方。 – matchdav

回答

0

這不是一個直接回答你的問題,但有點太長的評論。

通常,這些類型的搜索是使用全文索引搜索引擎而不是MySQL構建的。全文搜索引擎將爲您提供比MySQL的標準MATCH更多的可能性。

例如,您將能夠進行部分匹配,返回距離排序結果,自動建議和自動完成。 MySQL只會爲您提供最低限度的:一個匹配的功能,有兩種或三種模式。

全文索引的一個很好的例子是Apache Solr,建立在Lucene之上。

此外,免費的非常全面的地理數據庫可在geonames

但願這不是太題外話你:)

+0

謝謝zi42我會檢查Apache Soir – DanStarck

0

我的第一個建議是使用SQL搜索不到你的描述列的文本,如果你擔心在高流量的工作您的數據庫太辛苦,因爲我懷疑你有很多文字坐在那裏。特別是因爲它在你的專欄中的優先級鏈中非常落後。

經過一段時間的思考,我幾乎100%肯定地認爲這是您最大的處理負載。我不知道你是如何在瀏覽器中提供結果的,但毫無疑問你可以通過python獲得更好的結果,例如直接查找字符串。

除此之外,我不知道該告訴你什麼。你可以像你說的那樣分解你的表格,以編程方式訪問它們,如果你這樣做,我會建議製作聚合表格。但我真的不喜歡這個想法。

+0

你是真實的,這花了我很多時間,因爲這是項目中最重要的部分,但我需要使用php/mysql/jquery-ajax/MVC/POO ...,我聽說過很多關於python的內容,我肯定會在某天看看它,謝謝 – DanStarck

+0

那麼你的下一個最好的選擇是使用PHP中的Perl Regex庫。 – matchdav

相關問題