mysql - 此查询将锁定哪些表?

标签 mysql innodb myisam

我正在使用下面的查询在两个表之间迁移数据。我遇到了表锁定问题,因此我正在考虑将表引擎从 MyISAM 更改为 InnoDB。我需要为哪些表执行此操作?只是我正在写入的表,还是我正在写入的表和我正在读取的表?

INSERT INTO table1 (
  field1, field2, field2
)
SELECT
  field1, field2,
  (
    SELECT
      temp.field4
    FROM
      table1 AS temp
    WHERE
      temp.id = table2.id
    ORDER BY
      temp.something DESC
    LIMIT
      1
  ) + 1 AS field3
FROM
  table2
WHERE
  NOT EXISTS (
    SELECT
      1
    FROM
      table1 AS temp
    WHERE
      temp.id = table2.id
  )

最佳答案

锁定什么

这要看情况。如果要确保执行更新时不会写入新数据,则应该锁定两个表。如果这只是一个写入问题,那么只锁定您正在执行更新的表。

常见的误解

MyISAM 不能做锁是错误的。 MyISAM 无法实现行级锁定。 MyISAM 完全能够锁定表。

根据以下列表做出您的决定。

决策助手

您的表的插入、删除和更新次数是否比选择的次数多得多?
=> InnoDB

是否需要全文搜索
=> MyISAM

您更喜欢/需要明确的外键约束
=> InnoDB

磁盘空间或内存是否有问题?
=> MyISAM

有疑问吗?
=>MyISAM

没有赢家。

关于mysql - 此查询将锁定哪些表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1545514/

相关文章:

php - 具有关系的嵌套映射 Laravel 查询

mysql - InnoDB:文件操作中的操作系统错误号 23

php - mysql使用第一个表中的auto_increment值作为第二个表中的外键插入到两个表中

MYSQL-登录警告: Using a password on the command line interface can be insecure

选择后删除记录的Mysql查询..?

mysql - 在 codeigniter 中使用 Where 和 Where 条件更新 SQL

MySQL第二个基于外键的自增字段

php - Mysql 在 xampp 上意外停止

MySQL MyISAM 数据丢失的可能性?

mysql - MySQL表中统计数据的快速计算