当前位置: 首页 > 知识库问答 >
问题:

连接性能:受主键选择或列顺序的影响?

钱德元
2023-03-14

我有一个 20 列和 3000 万行的表格劳动。一列lab_id是外键,具有索引(不唯一)。另一个表映射有 10 列,具有主键 ID 和唯一的索引列lab_id。我想用地图中的内容更新一些劳动列:

UPDATE labor r
INNER JOIN map m ON r.lab_id = m.lab_id
SET r.col5 = m.col5
  , r.col6 = m.col6
  , r.col7 = m.col7
;

<代码>劳动力。lab_id</code>可以作为第二列或最后一列放置。用于联接的索引列的位置是否会影响更新的性能?

如果删除 map.id并将map.lab_id定义为主键,性能是否会发生变化?

共有1个答案

拓拔麒
2023-03-14

表中列的顺序没有可衡量的差异。

主键的选择在InnoDB中确实有所不同。该存储引擎使用表的主键作为所谓的聚集索引。表的内容存储在该聚集索引中,而不是DBMS表空间的其他部分中。因此,当查询引用主键时,查询规划器可以立即访问行中的其余数据。

相比之下,非主键,甚至是唯一的主键(在InnoDB中)检索主键,查询规划器使用该主键访问聚集索引。因此,通过主键的行引用只需要一次数据访问操作。总的来说。

如果您的 id 列是自动增量列,并且您希望继续以这种方式使用它,则可以将其放入唯一索引中,然后更改主键。与此类似的 DDL 语句可以解决问题。

sql prettyprint-override">ALTER TABLE map
     ADD UNIQUE INDEX id(id),
     DROP PRIMARY KEY,
     ADD PRIMARY KEY (lab_id);

这可能是一个很好的方法,因为您的表将继续工作,而无需更改您现有的软件。

这种DDL语句同时处理多个键。这是进行更改的最有效方法,因为它一次完成所有表的重组。这仍然需要时间。

至于性能。插入/更新性能变化不大:插入和更新仍然需要检查和更新两个唯一键。查询性能会变得更好。

(以上都不适用于MyISAM或AriaDB存储引擎。)

 类似资料:
  • 我正在尝试执行 KTable-KTable 外键联接,但我收到一个错误,因为 Kafka 流正在尝试对外键使用字符串 serde。 我希望它使用Kotlinx序列化服务器。如何指定? 我想使用FK选择器将两个KTables的数据连接在一起,并将值重新映射到一个聚合对象中。 然而,我得到一个错误,因为Kafka Streams正在使用(我的默认Serde)用于反序列化外键。但它是一个JSON对象,我

  • Cassandra 2.1,Spark 1.1,Spark-Cassandra-Connector 1.1

  • 我知道线程是并发运行的,所以您无法预测执行的顺序,但在提供的代码中,我在运行其他代码之前加入了thread。如果应该等到线程执行完毕,那么为什么顺序仍然是随机的呢?在两个print语句之前加入任何内容总是会导致它们最后被打印,而如果我在之后加入所有内容,它并不总是最后,为什么?

  • 错误结果为 “OneToOne关系的JPA问题:外键引用的列数错误。应为2” 如何为join测试表指定主键? 表A:列id与表B:列test_id映射

  • 更好的选择是使用整数主/外键,并将GUID用作在每个表上具有的客户端ID吗?-我担心的是实体框架需要加载导航属性,以便在不对现有代码进行重大修改的情况下获得相关实体的GUID。 有问题的数据库/硬件是SQL Azure。

  • 问题内容: 我试图在接收每月数百万次页面浏览量的页面中找到一些简单的客户端性能调整。我关心的一个问题是使用CSS通用选择器()。 例如,考虑一个非常简单的HTML文档,如下所示: 通用选择器会将以上声明应用于,和元素,因为它们是文档中唯一的那些。 通常,我会从以下规则中看到更好的性能: 还是会产生完全相同的净效果? 通用选择器是否执行我可能不知道的更多工作? 我意识到该示例中的性能影响可能很小,但