为每个需要的国家创建一个表 - mysql

时间:2012-06-05 02:32:23

标签: mysql sql

我有一个数据库,其结构如下:

  • t_person(idp,idcity,name,addr,tels,zip,desc,premium)
  • t_city(idcity,idcountry,cityname)
  • 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 country(1 --- n)人创建一个新表怎么办,如下所示:
t_person_uk,t_person_usa,t_person_spain,每行有1500行,我认为这样搜索速度非常快。
PD,我在进行AJAX调用之前已经有0.25秒的超时时间。
谢谢,再见。

2 个答案:

答案 0 :(得分:0)

这根本不是你问题的直接答案,但对于评论来说有点太长了。

通常,这些类型的搜索是使用全文索引搜索引擎而不是MySQL构建的。全文搜索引擎将为您提供比MySQL标准MATCH更多的可能性。

例如,您将能够进行部分匹配,返回距离排序结果,自动建议和自动完成。 MySQL只会为您提供最低限度:一个匹配功能,有两种或三种模式。

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

此外,geonames还提供了一个免费且非常全面的地理数据数据库。

希望这对你来说不是太偏离主题:)

答案 1 :(得分:0)

我的第一个建议是如果您担心在高流量时太难以使用数据库,请不要使用SQL搜索描述列的文本,因为我怀疑您有很多文本。特别是因为它在你的专栏中的优先级链下降到目前为止。

在考虑了一会儿后,我几乎100%肯定这是你最大的处理负荷。我不知道你是如何在浏览器中提供结果的,但毫无疑问,你可以用python来获得更好的结果,直接查找字符串。

除此之外,我不知道该告诉你什么。你可以像你说的那样分解你的表,以编程方式访问它们,如果你这样做,我建议制作聚合表。但我真的不喜欢这个想法。