我有一个包含大约2400个“项目”的数据库表。用户将具有来自2400项目集的任意项目组合。然后需要查找每个项目的详细信息并将其显示给用户。获取所有项目详细信息的最有效方法是什么?我可以想到三种方法:
我没有提高SQL效率,所以任何指导都会有所帮助。知道这是一个基于AJAX的Web应用程序可能会有所帮助。
编辑:平均而言,用户将选择~150项,极少数超过400-500。
答案 0 :(得分:1)
最好的方法是在一个查询中返回您想要的数据:
select i.*
from items i
where i.itemID in (<list of ids>);
MySQL查询可能非常大(请参阅here),因此我不担心能够传递值。
但是,如果您的用户有这么多项目,我建议先将它们存储在数据库中,然后再执行join
以获取其他信息。
答案 1 :(得分:0)
如果用户从不/很少选择超过50个元素,那么我同意Gordons的回答。
如果它们最多可以选择2400个项目,那么通过将选定的ID插入到保留表然后加入它可能会更好。
但是,可以找到更全面的答案here - 我通过this答案找到了答案。
他的结论是:
我们看到,对于大量参数列表,将它们传递到临时表中比作为常量列表快得多,而对于小列表,性能几乎相同。
'小'和'大'几乎不是静态的,但取决于你的硬件 - 所以你应该测试。我的猜测是,你的IN列表中平均有150个元素,你会看到临时表获胜。
(如果你做测试,请回到这里说出你的设置中最快的。)
答案 2 :(得分:-1)
2400项没什么。我有一个拥有数十万行和关系的MySql数据库,只需优化查询就可以完美地工作。
您必须做的是,查看每个SQL查询的执行时间。然后,您可以自己优化每个查询,尝试不同的查询并测量执行时间。
你可以使用ex。 MySql Workbench,Sequel pro,Microsoft Server管理工作室或其他用于构建查询的软件。您还可以向表中添加索引,这也可以改善查询。
如果您需要扩展数据库,可以使用http://hadoop.apache.org
等软件另外一个值得一提的是NoSQL(Not-Only SQL)。它是一个无关系的数据库,可以处理动态属性,并构建用于处理大量数据。
如你所说,你可以使用AJAX。但这只会有助于页面的加载时间和Web服务器(非SQL服务器)的压力。只要问你是否有更多信息或更深入的解释。