MySQL:语句是否缓存在数据库中?

标签 mysql database prepared-statement

我将从另一个问题中获取一些文字:

PreparedStatementStatement 的稍微强大的版本,并且应该始终至少与 Statement 一样快速且易于处理。 准备好的语句可以参数化

大多数关系数据库通过四个步骤处理 JDBC/SQL 查询:

  1. 解析传入的 SQL 查询
  2. 编译 SQL 查询
  3. 规划/优化数据采集路径
  4. 执行优化的查询/获取并返回数据

对于发送到数据库的每个 SQL 查询,语句将始终执行上述四个步骤。准备好的语句预先执行上述执行过程中的步骤(1) - (3)。因此,当创建准备语句时,会立即执行一些预优化。效果是减轻执行时数据库引擎的负载。

现在这是我的问题:

如果我使用数百或数千个Statement,是否会导致数据库出现性能问题? (我并不是说他们会因为每次要做更多的工作而表现得更慢)。所有这些语句都会缓存在数据库中还是一旦执行就会丢失在空间中?

最佳答案

由于使用准备好的语句没有限制,因此您应该谨慎使用它们。 正如您所说,您需要数百次准备,请三思而后行,可能您使用的是错误的。 应该使用的模式是让应用程序每秒执行大量插入/更新/选择数百或数千次,仅变量不同。因此,在现实世界中,就像连接、创建 session 、发送语句以及向该语句发送一堆变量。

但是,如果您的计划是为每个操作做好准备,那么最好使用通用查询。

关于您的问题:

  1. 数百条语句不会杀死 mysql 或导致性能下降
  2. 当客户端 session 启动并运行时,准备好的内容存储在内存中。一旦你关闭 session ,准备好的就死掉了。

确定您需要它:

  1. 您的应用能够快速执行语句,因此您可以获得使用它们的速度值(value)
  2. 您的查询不会有可变数量的参数,否则您可以通过在每个语句上创建对象并存储在内存中来杀死您的应用程序

关于MySQL:语句是否缓存在数据库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28268002/

相关文章:

java - 尝试在 Spring Boot 中访问两个数据库时创建名称为 'entityManagerFactory' 的 bean 时出错

mysql - 从命令行连接时,用户访问被拒绝...

java - 考虑用户在 Android 应用程序中选择反向时间间隔的用例

mysql - 将歌词存储在 MySQL 数据库中

java - 如何针对两个条件执行 RealmQuery

java - mysql 加载以前的查询数据来呈现查询

java - 使用时间戳的准备语句需要更多纳秒

php - 使用ajax将点击时的id名称传递给php

mysql - 每个字段可以有多个值

mysql - 是否可以使用预准备语句在 MySQL 中创建表?