mysql - 哪个更好,单个 "insert select-join"(单个查询)或选择然后插入(两个查询)

标签 mysql sql insert

我正在收集大量有关用户的内容。该内容的所有者 ID 与我提供给所有者的 ID 不同。我还有一个ownerId 到我的内部ID 的映射。 我很矛盾是否应该使用单个查询或两个查询插入内容。

测试架构:

CREATE TABLE map (
   internalId INT NOT NULL,
   ownerId INT NOT NULL,
   PRIMARY KEY (internalId),
   INDEX (ownerId) 
);

Create Table content (
  internalId INT NOT NULL,
  contentId INT NOT NULL,
  PRIMARY KEY (internalId, contentId)
 );

INSERT INTO map (internalId, ownerId) VALUES (1,100), (2,1000)

选项 1:从 map 中选择相关行,然后构建插入查询。 选项 2:以下查询有效(带有 UNION ALL 的内部选择语句以编程方式生成):

INSERT IGNORE INTO content (SELECT internalId, contentId FROM (SELECT 101 AS contentId, 100 AS ownerId UNION ALL
     SELECT 102 AS contentId, 100 AS ownerId UNION ALL
     SELECT 103 AS contentId, 100 AS ownerId UNION ALL
     SELECT 1001 AS contentId, 1000 AS ownerId) AS s_q
     INNER JOIN map USING (ownerId));

第二个选项要快一些(单个查询和所有查询),但我没有进行任何压力测试,因此不确定它将如何处理第二个表因插入或更新而锁定的情况。 第一个选项更容易阅读和调试(并处理死锁 - 您只需事先对数据进行排序。我不知道第二个选项在这方面是否有任何保证)。 还有其他我没有注意到的方面吗?

最佳答案

使用单个查询。

原因不是“性能”、“简单性”或“风格”(尽管单个查询在所有方面都胜出)...而是数据完整性

如果您使用 2 个查询,它们之间必然存在时间间隔,在此期间另一个进程可能会修改数据,导致您的组合更新不再包含数据库新状态的正确值。

单个查询始终具有正确的效果。

您可以启动一个事务,锁定所有涉及的表,读取,编写更新查询,执行更新,提交,但这对开发人员和数据库来说都是负担。

关于mysql - 哪个更好,单个 "insert select-join"(单个查询)或选择然后插入(两个查询),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58407956/

相关文章:

mysql:如何从一个表中提取多个表并在每个表中分组,然后组合成一个结果?

java - JSP循环遍历jsp上的mysql表并显示它

sql - SQL Server 中的别名列名

php - 有什么方法可以优化 MySQL 中的复杂数学查询吗?

MySQL select 用于全局销售报告

mysql - 获取所有具有重复电子邮件地址的用户

从 iOS 代码接收数据的 PHP 文件不起作用

mysql插入选择语法错误

sql - 使用 Oracle 将树从一个表插入到另一个表的最佳方法是什么

php - 如何使用一个 SQL 查询从两个表中获取结果?