我尝试使用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;这导致了延迟,但我不确定。如何进一步提高此类查询的速度?非常感谢。
答案 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
比较。