Mysql 用java实现搜索过滤器

Mysql 用java实现搜索过滤器,mysql,search,filter,lucene,cassandra,Mysql,Search,Filter,Lucene,Cassandra,我们需要为我的社交网站针对用户档案实施搜索过滤器(类似网络日志),档案上的过滤器包括年龄范围、性别和兴趣 我们在MySQL上运行了大约100万个配置文件,MySQL似乎不是实现此类过滤器的正确选择,因此我们也在关注Cassandra 那么,实现这种过滤器的最佳方法是什么呢?结果需要非常快 e、 g.年龄=18-24岁,性别=男性,兴趣=足球 日期、性别和兴趣中的年龄为varchar 编辑: 让我重新表述一下这个问题,我怎样才能在任何类型的搜索中获得最快的结果。 它可以基于配置文件名,或者1M配置

我们需要为我的社交网站针对用户档案实施搜索过滤器(类似网络日志),档案上的过滤器包括年龄范围、性别和兴趣

我们在MySQL上运行了大约100万个配置文件,MySQL似乎不是实现此类过滤器的正确选择,因此我们也在关注Cassandra

那么,实现这种过滤器的最佳方法是什么呢?结果需要非常快

e、 g.年龄=18-24岁,性别=男性,兴趣=足球

日期、性别和兴趣中的年龄为varchar

编辑:
让我重新表述一下这个问题,我怎样才能在任何类型的搜索中获得最快的结果。 它可以基于配置文件名,或者1M配置文件记录上的任何其他配置文件


谢谢

尝试优化您的查询可能会有一些意义(至少您可以做一些事情)。听起来您有一个很大的数据库,如果您返回一个很大的结果集并使用java过滤结果,您可能会因为缓存中保存的所有数据而遇到性能问题

如果是这种情况,您可以尝试的一件事是在数据库之外缓存结果并从中读取。这是可以实现的,但是如果需要,您可以实现自己的版本。如果这是你感兴趣的东西,这是一个很好的起点


我刚刚注意到MySQL的这一点。我不知道它的效率有多高,但它们有一些内置的功能,这可能有助于加快速度。

进行底层SQL更改将有助于您的项目。您可能需要考虑将兴趣栏从自由输入字段(VARCHAR)更改为标签(例如,在附加表上的多对多)。 您使用了
Football
的示例,上面有一个
like
操作符。如果将其更改为标记,则您将遇到一个初始结构问题,即决定放置在何处:

football
Football
American Football
Australian-rules football
但是,一旦您这样做了,标签将帮助您的select语句更快地运行


如果不进行此更改,您将把数据管理问题从一个数据库(有能力处理)推到Java(可能没有)。

为什么MySQL看起来不是正确的选择?你发现它太慢了吗?mysql中的like语句已经过时了谁说了关于like
?我用like%FOOTALL%尝试了一个简单的兴趣选择,查询结果花了很长时间。我们不想像在1M记录上运行loop那样在java中过滤结果,我们的后端有hibernate和memcached服务器。很好,我不知道你的设置,我想这是一个很好的开始。你是否提前知道人们会搜索哪些关键字,或者知道常用的关键字是什么?您可以考虑添加标签或对将要搜索的文本进行某种形式的索引,因此您所要做的就是在标签上搜索,如果用户正在查找的内容有标签的话。可以在保存文本时进行标记,这样就不会出现真正的性能损失。关于标记,您是对的,但问题仍然存在,即使是年龄和性别搜索。正常的select查询(即使是大表上的计数)也需要很长时间。您是否尝试过“1987-06-17”和“1993-06-17”之间的生日?SQL引擎可以对其进行优化。让性别成为一个可为null的布尔男性(因此true表示男性,false表示女性,null表示没有响应)怎么样?请记住,SQL引擎将非常快地清除不需要的记录并获得所需的子集,而在Java中这很难做到(在Java中,只有选择记录后才能知道记录)。基本的SQL优化将为您带来很多,而无需进行编程更改,因此首先考虑索引,无通配符,并使用内置的EXPLAIN指令。