Autocomplete 使用Sphinx/Memcache提高Jquery自动完成的性能……还是?

Autocomplete 使用Sphinx/Memcache提高Jquery自动完成的性能……还是?,autocomplete,memcached,sphinx,Autocomplete,Memcached,Sphinx,我在InnoDB表中有一个43000个英国位置的列表,我使用它通过远程json调用填充Jquery自动完成框 目前,我只是执行一个基本的SELECT*,从标题为“lond%”的位置查询来检索请求,但即使这个网站仍在开发中,结果也进展缓慢 我已经在按键之间实现了200毫秒的延迟,并且在开始收集结果之前至少有4个字符,但是我可能需要重新考虑一下,因为在英国有大约3个字符的位置,我非常希望它立即显示结果 一个明显的改进是全文索引'title',但由于数据库的其余部分是InnoDB,我不想倒退并将表转换

我在InnoDB表中有一个43000个英国位置的列表,我使用它通过远程json调用填充Jquery自动完成框

目前,我只是执行一个基本的SELECT*,从标题为“lond%”的位置查询来检索请求,但即使这个网站仍在开发中,结果也进展缓慢

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

一个明显的改进是全文索引'title',但由于数据库的其余部分是InnoDB,我不想倒退并将表转换为MyISAM。因此,剩下的两个工具是Sphinx和Memcached

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

Memcached——我曾考虑过将所有43000个结果加载到内存中,然后执行某种数组搜索(或者memcache内置搜索,如果有的话?)。但这感觉有点像我?还是我只是想得太多了

我非常感谢您对最佳路线的反馈……

Sphinx: 可以将位置名称存储在字符串属性(即字段和属性)中。然后可以完全在sphinx中运行查询(不需要db访问)。这将是ulimate解决方案IMHO。 (属性存储在内存中,但仍然存储那么多并不重要)

Sphinx+MySQL: 但是,即使只是获取ID,然后在数据库表上执行主键查找,也应该比原生mysql更快。如果您省略sql并使用HandlerSocket,速度会更快

Memcache: 不,没有搜索。它的键仅用于查找。您可以构造一个密钥查找版本,基本上只存储所有可能的搜索。但是将存储大量数据,并且仍然必须处理丢失的数据(以防所有数据都被逐出)

。。。因此,将memcache放在sphinx甚至mysql前面并没有什么区别。(如果您有memcache,也可以这样做!)

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


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

谢谢您的意见。是的,关于第二个索引,这是非常正确的。我的另一个想法是,如果我要在mySQL中创建第二个表来进行查找,为什么不跳过MyISAM直接创建一个内存表呢?我需要在每次服务器重新启动时重新创建它,但是如果不重写代码,它的速度会不会比MyISAM更快,索引和sphinx+memcache的速度都差不多?我怀疑内存引擎会做得更好。它没有特别好的索引(因为它是内存,所以不经常被注意到),所以搜索将是CPU密集型的。一旦进行了大量的静默,innodb将缓存(内存中),因此性能将相当。但在一天结束时,尝试一下。在MyISAM或HASH中创建表的副本并对其运行一些查询是非常繁琐的。再次感谢您的回复。我刚刚尝试了一下内存,它在返回InnoDB提供的响应时肯定会更快。但从长远来看,这将如何扩展我不知道。考虑到这一点,我想我可以尝试一下Sphinx属性的初始路径。我不知道它可以返回ID以外的任何东西,所以这听起来很理想。一个重要的问题是,你在标题栏上有索引吗?(一个普通的指数,不是英国《金融时报》的)愚蠢的问题,不,我不知道。我不确定标准索引在这种情况下是否会有帮助?是的,标准索引肯定会有帮助。Mysql应该能够使用它进行前缀匹配(可以实现为范围搜索)