我有一个简单的,粘贴在下面的语句,针对Oracle数据库。此结果集包含企业名称,但它有24,000个结果,这些结果显示在下拉列表中。
我正在寻找有关减少结果集的方法的想法,以加快返回到用户界面的数据,可能是Google的搜索或完全不同的想法。我愿意接受任何想法,欢迎任何方向。
SELECT BusinessName FROM MyTable ORDER BY BusinessName;
想法:
SELECT BusinessName FROM MyTable WHERE BusinessName LIKE "A%;
我知道如何使用LIKE子句并不明智,但我说这是一个很大的结果集。也许就像BINARY搜索一样?
答案 0 :(得分:1)
最后一个查询可能会执行得非常糟糕。数据库内部的字符串比较可能非常慢,并且根据“命中”的数量,它可能会对性能造成巨大拖累。如果那不关心你就没关系。如果公司数据未规范化为自己的数据库表,则尤其如此。
只要用户知道他正在查找的公司,那么我会在一些流行的JavaScript库中识别现有的JavaScript组件,该库提供带有动态下拉列表的搜索文本字段,该下拉列表显示匹配结果将是一种有效的机制。但是,如果他们可能寻找名称的一部分,您可能希望使用'%A%'。例如,如果我正在寻找IBM Rational,LLC。当我搜索“Rational”时,我希望它显示在结果中吗?
无论哪种方式,观察您的性能,如果有意义缓存,公司中的数据会查找位于数据库前面的服务器上的服务。此外,请确保您不响应每次击键,但超时500ms左右,以允许用户在进入服务器和搜索之前键入多个字符。另外,我不建议将所有公司名称带到客户端。我们一直在寻求从浏览器页面减少到服务器的遍历的大小和频率。等待24k公司名称在表单加载时(甚至在幕后)下载到客户端,当更短的更快速的非常具体的查询将表现得足够好时,对我来说似乎更有效。再次,测试它并确定最适合您的用例的性能特征。
这些是我在具有大量数据的项目中使用的技术,例如从100,000多名用户中搜索用户。我们的代码是一个自定义的Dojo小部件(dijit),我没有看到如何直接使用dijit代码,但jQuery UI提供了autocomplete小部件。
此外,还对文本字段使用此查询的限制,以便下拉列表仅提供所有匹配项的子集,从而强制用户进一步优化查询。
答案 1 :(得分:-3)
SELECT BusinessName FROM MyTable ORDER BY BusinessName LIMIT 10