首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL缓存准备好的语句以提高性能

MySQL缓存准备好的语句以提高性能
EN

Stack Overflow用户
提问于 2018-07-28 00:26:27
回答 1查看 1.2K关注 0票数 0

如果调用MySQL,则为未被mysql_stmt_close缓存的准备语句。

我希望MySQL缓存常用的语句。问题是,我不知道MySQL如何处理缓存语句的所有细节。

例如,是否最好保持mysql_stmt指针,并不断地绑定不同的参数并执行它?

或者,这是否只为我节省了C内存分配,因为MySQL实际上是基于查询匹配(或其他什么)缓存语句,并且与i mysql_stmt_preparemysql_stmt_close的次数或i mysql_connect的次数无关。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-02 10:41:59

如果您发出一个准备陈述,MySQL会准备一些事情,比如解析和执行计划,所以当您稍后绑定实际的参数时,它不需要(再次)这样做。制备通常只需要一些ms。如果这是相关的,将取决于您的查询的总执行时间,而且您显然只能在多次运行它时才能节省时间(但如果只运行一次,您也不会浪费时间)。尽管如此,即使您只运行一次,使用准备好的语句也是一个标准安全措施

准备好的语句存储在服务器上,需要(一点点)内存。关闭它时释放它,之后不缓存它。它也是特定于连接的,因此不同的连接将为相同的查询分配自己的内存。

您可以保持几个准备好的语句处于活动状态。开放准备语句的总数实际上有一个上限(由计数给出),但这将取决于有多少用户使用您的应用程序(以及他们分配的内存(通常仍然是可以忽略的)是否与您的考虑相关。

在保存长时间准备的语句时,有一些实际的含义,最重要的是,当您失去连接时,准备好的语句就会丢失(不管是偶然的还是有意关闭的)。这可能会也可能不会使您的代码复杂化(例如重新初始化连接丢失的语句)。它还迫使您保持连接处于打开状态,虽然MySQL通常不需要太多资源来保持休眠连接的打开,但您可能不希望这样做。此外,这将基本上防止您使用连接池(除非它们支持),因为您不能在不丢失准备语句的情况下返回到池的连接(尽管这通常与c-应用程序不太相关)。

这是标准的c mysql api的行为(正如您的语法所建议的)。如果您使用替代工具,这种行为当然会有所不同。例如,java驱动程序.close上执行(可选)缓存语句。但它基本上是通过不实际关闭它(通过api)和处理诸如在连接丢失时重新初始化之类的事情来实现的。这意味着这样的缓存(应用程序端)有一定的用处,虽然我不知道有一个c++的替代方案,但实现它当然是可能的(也不应该太复杂)(而且很可能已经有人这样做了)。

最后一个注意事项,正如您可能正在寻找的那样:在MySQL 8之前,有一个查询缓存来缓存特定查询的结果。如果使用完全相同的代码(具有完全相同的参数)运行两次查询,并且不涉及表的更新(如果启用了缓存,且结果集不太大),MySQL将从该缓存中获取结果,而无需重新执行查询。它只与准备好的语句密切相关,并且对应用程序透明(您不需要更改任何内容),但可能与缓存上下文相关。

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

https://stackoverflow.com/questions/51567016

复制
相关文章

相似问题

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