1

我在 InnoDB 表中有一个包含 43,000 个英国位置的列表,我用它来通过远程 json 调用填充 Jquery 自动完成框。

目前我只是执行一个基本的 SELECT * FROM locations WHERE title LIKE 'lond%' 查询来检索请求,但即使这个站点仍在开发中,结果也很慢。

我已经在按键之间延迟了 200 毫秒,并且在开始收集结果之前至少有 4 个字符,但我可能需要重新考虑这一点,因为英国有一些 3 个字符的位置,我非常希望它显示结果立即地。

一个明显的改进是全文索引“标题”,但由于数据库的其余部分是 InnoDB,我宁愿不倒退并将表转换为 MyISAM。因此,我剩下了另外两个工具,即 Sphinx 和 Memcached。

Sphinx - 据我所知,Sphinx 只返回匹配结果的 ID,所以我仍然需要使用触发查找的每个用户按键来查询 MySQL。因此,我不确定它会有多大的改进?

Memcached - 我曾考虑将所有 43,000 个结果加载到内存中,然后执行某种数组搜索(或者如果有 memcache 内置搜索?)。但这感觉有点白痴?还是我只是想多了?

我真的很感激一些关于最佳路线的反馈......

4

1 回答 1

2

Sphinx:您可以将位置名称存储在字符串属性中(即字段和属性)。然后你可以完全在 sphinx 中运行你的查询(不需要数据库访问)。这将是最终的解决方案恕我直言。(属性存储在内存中,但仍然存储这么多没什么大不了的)

Sphinx + MySQL:但即使只是获取 ID,然后对数据库表进行主键查找,也应该比原生 mysql 更快。如果您消除 sql 并使用 HandlerSocket 会更快。

Memcache:不,没有搜索。仅它的键查找。您也许可以构建一个键查找版本,基本上只是存储所有可能的搜索。但是会存储很多,并且仍然必须应对未命中(以防万一一切都被驱逐)

...所以它与将 memcache 放在 sphinx 甚至 mysql 前面并没有什么不同。(如果你有内存缓存,也可以!)

Redis:如果您真的想实现仅内存查找,那么 Redis 可能会起作用。

(具有讽刺意味的是,如果使用 sphinx、memcache 或 redis,无论如何,您会有效地创建第二个“快速查找”索引。原始数据表的副本,专门设置为启用搜索。在这种情况下,您可以创建一个副本您在 MyISAM 中的表存档相同的效果,即使将原始保留在 InnoDB 中)

于 2013-05-13T11:22:19.223 回答