mysql DB上的高负载如何避免?

时间:2009-11-23 12:05:29

标签: mysql autocomplete jquery

我有一张桌子,其中包含世界各地的城市,它包含超过70,000个城市。

并且在我的主页中也有自动建议输入 - 在我的主页中密集使用 - 对输入中的每个输入(在第二个字母之后)进行sql查询(如搜索)..

所以我担心从那个重负载,... ,,所以我寻找任何解决方案或技术可以帮助在这种情况下。

6 个答案:

答案 0 :(得分:2)

缓存表格,最好是在内存中。 70.000个城市的数据并不多。如果每个城市占用50个字节,则仅为70000 * 50 / (1024 ^ 2) = 3MByte。毕竟,城市列表并没有快速改变

如果您专门使用AJAX调用,则可以缓存JSON中前两个字母的每个组合的数据。假设类似拉丁语的字母表,那将是大约680种组合。将每个文件保存为JSON格式的文本文件,并让jQuery直接访问文本文件。

答案 1 :(得分:2)

首先在城市'名称'上创建一个索引。这样可以加快查询:

SELECT name FROM cities WHERE name LIKE 'ka%'

同时尝试让自动完成表单有点'懒惰'。用户输入的字母越多,数据库必须处理的记录数就越少。

答案 2 :(得分:1)

答案 3 :(得分:1)

您应该在Web服务器上缓存尽可能多的数据。不像国家,城市等列表那样经常变化的数据是一个很好的候选者。实际上,你多久添加一个国家?即使您更改了列表,只需简单刷新缓存即可。

您应确保正确调整查询以充分利用索引和加入技术。

您也可能从其他查询中加载数据库。您可能希望研究提高MySQL数据库性能的技术。

答案 4 :(得分:0)

如果您对城市名称有索引,则应该有效地处理数据库。此声明有误,请参阅下面的评论

要降低对服务器资源的要求,只有在n个字符后才能提供自动完成功能。还允许一些超时,即当用户仍在键入时不执行请求 一旦用户停止输入一段时间,您就可以请求自动完成。

答案 5 :(得分:0)

让你的桌子适合内存,这对于70k行应该是微不足道的。

然后你可以很容易地进行扫描。也许甚至不使用sql数据库(因为它不经常更改),只是将城市转储到文本文件并扫描。如果您有许多Web服务器但只有一个数据库服务器,那么肯定会更好,因为每个服务器都可以保留自己的文件副本。

您每秒看到多少查询达到峰值?我无法想象有 许多人输入城市名称,即使它是一个非常繁忙的网站。

如果您获得良好的点击率(例如因为人们倾向于输入相同的内容),您也可以缓存各个回复(例如在memcached中)


实际上,你也可以预先计算所有一三个字母组合的响应,这只是26 * 26 * 26(= 17k)条目。由于四个或更多字母输入必须在逻辑上是其中一个的子集,因此您可以扫描17k条目中的相应一个。