我有一个webapp开发问题,我已经开发了一个解决方案,但我正在尝试找到可能解决我看到的一些性能问题的其他想法.
问题陈述:
用户输入多个关键字/令牌
应用程序搜索与令牌匹配的内容
每个令牌需要一个结果
即,如果一个条目有3个令牌,我需要输入id 3次
排名结果
为令牌匹配分配X点
根据点对条目ID进行排序
如果点值相同,请使用日期对结果进行排序
我希望能够做但却没有想到的是发送1个返回类似于in()的结果的查询,但是为每个选中的条目ID返回一个重复的条目id.
有没有比我正在做的更好的方法,使用多个单独的查询为每个令牌运行一个查询?如果是这样,实施这些最简单的方法是什么?
编辑
我已经对条目进行了标记,因此,例如,"see spot run"的条目ID为1,有三个标记,"see","spot","run",这些标记位于单独的标记表中,条目ID与它们相关,因此表格可能如下所示:
'see', 1 'spot', 1 'run', 1 'run', 2 'spot', 3
Robin Barnes.. 6
您可以在MySQL中使用"UNION ALL"在一个查询中实现此功能.
只需循环遍历PHP中的标记,为每个标记创建一个UNION ALL:
例如,如果令牌是'x','y'和'z',您的查询可能看起来像这样
SELECT * FROM `entries` WHERE token like "%x%" union all SELECT * FROM `entries` WHERE token like "%y%" union all SELECT * FROM `entries` WHERE token like "%z%" ORDER BY score ect...
order子句应该作为一个整个结果集运行,这是你需要的.
在性能方面,它不会那么快(我猜),但是对于数据库而言,速度方面的主要开销通常是从PHP向数据库引擎发送查询并接收结果.使用这种技术,这只发生一次而不是每个令牌一次,因此性能会提高,我只是不知道它是否足够.
您可以在MySQL中使用"UNION ALL"在一个查询中实现此功能.
只需循环遍历PHP中的标记,为每个标记创建一个UNION ALL:
例如,如果令牌是'x','y'和'z',您的查询可能看起来像这样
SELECT * FROM `entries` WHERE token like "%x%" union all SELECT * FROM `entries` WHERE token like "%y%" union all SELECT * FROM `entries` WHERE token like "%z%" ORDER BY score ect...
order子句应该作为一个整个结果集运行,这是你需要的.
在性能方面,它不会那么快(我猜),但是对于数据库而言,速度方面的主要开销通常是从PHP向数据库引擎发送查询并接收结果.使用这种技术,这只发生一次而不是每个令牌一次,因此性能会提高,我只是不知道它是否足够.