我正试图通过使用ColdFusion的Query of queries特性来访问大约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> 删除“Maxrows”并没有真正的帮助。我的数据库字段已经建立了索引,我的优化查询知识也到此为止了(您能为CF QoQ对象的一列建立索引吗?)我怀疑是“ORDER BY”导致了延迟,但我不确定。如何进一步提高此类查询的速度?非常感谢。
发布于 2014-06-18 16:27:45
要优化第二个查询,您可以采用几种方法。
首先,看看您的数据库是否支持基于函数的索引( oracle术语,但它在其他平台上也可用)。有关mySQL的示例,请参阅以下内容:Is it possible to have function-based index in MySQL?
其次,你可以将你的单词预处理成支持你想要的查询的结构。我假设您当前正在将查询加载到其他地方的应用程序或会话范围中。当你这样做的时候,你也可以将这些单词处理成如下的结构:
{
'tha':['thames','that'],
'the':['them','then','there'],
//etc
}不是运行QoQ,而是获取单词的前3个字母,查找数组,然后遍历它,查找匹配项。从本质上讲,它与基于函数的索引非常相似,只不过是在代码中。你正在用内存来换取速度,但是有了45000个单词,结构就不会很庞大了。
发布于 2014-06-18 08:50:28
LIKE子句可能会导致第二个查询的性能不佳。如果在常规数据库查询中使用LIKE,您可以看到类似的性能损失。由于LIKE对存储在数据库列中的整个字符串执行通配符搜索,因此它不能只进行EQUALS比较。
https://stackoverflow.com/questions/24271968
复制相似问题