使用ColdFusion QoQ优化数据库查询

时间:2014-06-17 19:36:16

标签: sql optimization coldfusion

我尝试使用ColdFusion的查询查询功能来优化查询,以访问大约45,000个单词的缓存查询。

通过以下查询,我在速度切换到QoQ方面取得了很大成功:

<cfquery name="FindAnagrams" dbtype="query" >
    SELECT AllWords.Word, AllWords.AnagramKey
    FROM AllWords
    WHERE AllWords.WordLength = #i#
</cfquery>

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

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

 <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> 

删除&#39; Maxrows&#39;没有真正的帮助。我的数据库字段已编入索引,而且我已经完成了对优化查询的了解(您可以索引CF QoQ对象的列吗?)我怀疑它是&#39; ORDER BY&#39;这导致了延迟,但我不确定。如何进一步提高此类查询的速度?非常感谢。

2 个答案:

答案 0 :(得分:2)

为了优化第二个查询,您可以采取几种方法。

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

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

{
    'tha':['thames','that'],
    'the':['them','then','there'],
    //etc
}

不是运行QoQ,而是获得单词的前3个字母,查找数组,然后迭代它,查找匹配项。从本质上讲,它与基于函数的索引非常相似,但在代码中。你正在为速度交换记忆,但是用45000字,结构不会太大。

答案 1 :(得分:0)

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