首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ColdFusion QoQ优化数据库查询

使用ColdFusion QoQ优化数据库查询
EN

Stack Overflow用户
提问于 2014-06-18 03:36:16
回答 2查看 191关注 0票数 0

我正试图通过使用ColdFusion的Query of queries特性来访问大约45,000个单词的缓存查询来优化我的查询。

通过下面的查询,我成功地将速度切换到了QoQ:

代码语言:javascript
复制
<cfquery name="FindAnagrams" dbtype="query" >
    SELECT AllWords.Word, AllWords.AnagramKey
    FROM AllWords
    WHERE AllWords.WordLength = #i#
</cfquery>

执行时间从大约400毫秒增加到大约15毫秒。

然而,下面的查询仅略微减少了执行时间(从~500ms减少到~400ms):

代码语言:javascript
复制
 <cfquery name="TopStartWith" dbtype="query" maxrows="15">
    SELECT AllWords.Word
    FROM AllWords
    WHERE AllWords.Word LIKE <cfoutput>'#Word#%' </cfoutput> 
    AND AllWords.Word <> '#Word#'
    ORDER BY AllWords.Frequency DESC;
  </cfquery> 

删除“Maxrows”并没有真正的帮助。我的数据库字段已经建立了索引,我的优化查询知识也到此为止了(您能为CF QoQ对象的一列建立索引吗?)我怀疑是“ORDER BY”导致了延迟,但我不确定。如何进一步提高此类查询的速度?非常感谢。

EN

回答 2

Stack Overflow用户

发布于 2014-06-18 16:27:45

要优化第二个查询,您可以采用几种方法。

首先,看看您的数据库是否支持基于函数的索引( oracle术语,但它在其他平台上也可用)。有关mySQL的示例,请参阅以下内容:Is it possible to have function-based index in MySQL?

其次,你可以将你的单词预处理成支持你想要的查询的结构。我假设您当前正在将查询加载到其他地方的应用程序或会话范围中。当你这样做的时候,你也可以将这些单词处理成如下的结构:

代码语言:javascript
复制
{
    'tha':['thames','that'],
    'the':['them','then','there'],
    //etc
}

不是运行QoQ,而是获取单词的前3个字母,查找数组,然后遍历它,查找匹配项。从本质上讲,它与基于函数的索引非常相似,只不过是在代码中。你正在用内存来换取速度,但是有了45000个单词,结构就不会很庞大了。

票数 2
EN

Stack Overflow用户

发布于 2014-06-18 08:50:28

LIKE子句可能会导致第二个查询的性能不佳。如果在常规数据库查询中使用LIKE,您可以看到类似的性能损失。由于LIKE对存储在数据库列中的整个字符串执行通配符搜索,因此它不能只进行EQUALS比较。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24271968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档