差异可能很微妙,有时很重要,有时实际上根本不存在.
通常,准备好的语句1.通过服务器准备(SQL解析、生成执行计划等),2.用附加参数执行,然后3.关闭.它允许您使用每次传入的不同参数重用相同的SQL,它可以帮助防止SQL注入,可以提供一些性能增强(特定于驱动程序/协议,YMMV),并防止重复步骤,就像上面prepare步中的执行计划生成和SQL解析一样.
对于编写源代码的人来说,准备好的语句可能比连接字符串并将其发送到DB服务器更方便.
DB.Query()Exec()QueryRow()
DB.Prepare()stmt.Exec(...args)
就两者之间的区别以及为什么使用其中之一而言,有几件事值得思考.
DB.Query()
您还可以将其与其他参数和查询字符串中的占位符一起使用,如上所述,它将在幕后执行准备好的语句.这里的潜在问题是,当您进行多个查询时,每个查询都会产生一个暗中准备好的语句.因为涉及到额外的步骤,所以效率可能会相当低,因为您每次执行查询时它都会重新准备、执行和关闭.
使用显式的预准备语句,您可以避免这种低效,因为您正在try 使用可能具有不同参数的先前准备的SQL.
DB.Prepare()
显然,您在哪种情况下使用取决于您的特定用例,但我希望上面的细节能够为您提供足够的帮助,以便您在每种情况下都能做出最佳决策.
Update给定OP中的UPDATE,当查询只需要执行一次时,本质上没有区别,因为带参数的查询是在幕后作为准备好的语句完成的.
DB.Query()
由于在本例中,准备好的语句是出于安全原因而使用的,因此可能值得通过其他方式处理安全问题,并改用明文查询,因为这将提高性能.然而,除非有足够的流量(或者预计流量在future 会大幅增长)来减轻服务器上的负载,否则任何yield 都可能无关紧要.这再次归结为现实世界的用例.
对于任何对有关预准备语句和直接明文查询之间的区别的度量感兴趣的人,有一篇很好的文章here(它也很好地解释了上面的大部分内容).