在主键上创建索引有什么好处吗?

3

我查看了这篇Stack Overflow的帖子:

MySQL中主键、唯一键和索引有什么区别?

并找到以下语句:

请注意,MySQL中定义为主键或唯一键的列会自动创建索引。

基于此,我有两个问题:

  • 我可以安全地假设在主键本身上创建索引没有性能优势,因为主键本质上是一个索引吗?

也许更重要的问题:

  • 如果您正在执行人们引用的经典示例,按lastName和firstName进行SELECT,并且该表还具有您经常使用的主键,那么是否应将索引创建为(primary_key,lastName,firstName)或仅(lastName,firstName)因为主键已经是索引?

为什么要在默认已有索引的东西上创建索引? - Andrey
我正在尝试理解主键的行为。根据我的阅读,我有这样的印象,即使表有一个主键,如果我没有索引地基于lastName进行SELECT,MySQL也会扫描整个表。如果我基于一些组合的lastName和firstName创建索引,它将解决这个问题。然而,如果这是真的,那么主键除了唯一性之外还能给我什么?试图确定如何获得最佳的SELECT性能。 - Carvell Fenton
它可以通过主键快速进行SELECT。顺便说一句,如果您有FirstName+LastName并按LastName查询,则速度很快。 - Andrey
我并不是说查询速度很快。如果没有在lastName上创建索引,它确实不够快,就像你所说的那样。我只是试图理解如何正确构建索引。希望这样能澄清问题。 - Carvell Fenton
1
在编程中涉及到的内容,如果你遇到了像 SELECT A FROM B WHERE C 这样简单的查询语句,那么你有两个选择:对整张表进行扫描或是利用索引查找。如果你想选择后者,那么你应该只使用已有索引中的列作为 WHERE 语句的条件。 - Andrey
2个回答

1

关于你的第一个问题,是的,你可以放心地做出这样的假设。

至于第二个问题:

索引有助于加速搜索 - 就像书中的索引一样。它们可以帮助数据库引擎跳转到正确的记录,就像索引可以帮助你跳转到书中的正确页面一样。

你自己创建的索引的好处取决于你打算如何搜索数据。

在你的例子中,如果你要在应用程序中搜索名称字段,我会在名称字段上创建一个索引。


终于完成了自己的回答编辑。抱歉一开始我误读了问题。 - David
1
那么你的意思是创建名称字段索引,而不将主键作为该索引定义的一部分?然后,如果我仅按主键进行SELECT操作,那么对其进行索引没有意义,因为它已经是一个索引了? - Carvell Fenton
当然 - 这正是我所指的。 - David
谢谢,我想你和其他评论已经为我解决了这个问题。非常感谢! - Carvell Fenton

0
如果在PRIMARY_KEY上有索引,并且在LastName,FirstName上有索引,那并不意味着自动创建一个PRIMARY_KEY,LastName,FirstName的索引。

然而,在这种情况下,主键字段通常是多余的,因为您有另一个可用的索引。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接