0

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

  • t_person(idp、idcity、姓名、地址、电话、邮编、降序、保费)
  • t_city(idcity,idcountry,城市名)
  • t_country(idcountry, 国名)

我想要一个非常通用的“实时搜索”(类似谷歌):

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+ 秒(我已经使用数据生成器对其进行了测试)。问题是,如果我为每个国家/地区(1 --- n)人创建一个新表,如下所示:
t_person_uk、t_person_usa、t_person_spain,每个都有 1500 行,我认为这样搜索会非常快。
PD,在进行 AJAX 调用搜索之前,我已经有 0.25 秒的超时时间。
谢谢,再见。

4

2 回答 2

0

这根本不是对您问题的直接回答,但评论有点太长了。

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

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

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

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

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

于 2012-06-05T03:33:07.260 回答
0

我的第一个建议是不要使用 SQL 搜索描述列的文本,如果您担心在高流量下过于努力地工作数据库,因为我怀疑您有很多文本坐在那里。特别是因为它在您的列中处于优先级链的下游。

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

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

于 2012-06-05T08:18:03.203 回答