我有一个数据库,其结构如下:
我想要一个非常一般的“实时搜索”(像谷歌一样):
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秒的超时时间。
谢谢,再见。
答案 0 :(得分:0)
这根本不是你问题的直接答案,但对于评论来说有点太长了。
通常,这些类型的搜索是使用全文索引搜索引擎而不是MySQL构建的。全文搜索引擎将为您提供比MySQL标准MATCH
更多的可能性。
例如,您将能够进行部分匹配,返回距离排序结果,自动建议和自动完成。 MySQL只会为您提供最低限度:一个匹配功能,有两种或三种模式。
全文索引的一个很好的例子是Apache Solr,建立在Lucene之上。
此外,geonames还提供了一个免费且非常全面的地理数据数据库。
希望这对你来说不是太偏离主题:)
答案 1 :(得分:0)
我的第一个建议是如果您担心在高流量时太难以使用数据库,请不要使用SQL搜索描述列的文本,因为我怀疑您有很多文本。特别是因为它在你的专栏中的优先级链下降到目前为止。
在考虑了一会儿后,我几乎100%肯定这是你最大的处理负荷。我不知道你是如何在浏览器中提供结果的,但毫无疑问,你可以用python来获得更好的结果,直接查找字符串。
除此之外,我不知道该告诉你什么。你可以像你说的那样分解你的表,以编程方式访问它们,如果你这样做,我建议制作聚合表。但我真的不喜欢这个想法。