19

我最近开始开发我的第一个使用 SQL 数据库的严肃应用程序,并且我正在使用 phpMyAdmin 来设置表。有几个可选的“功能”我可以给出不同的列,但我不完全确定它们的作用:

  • 首要的关键
  • 指数

我知道 PK 的用途以及如何使用它,但我想我的问题是为什么需要一个 - 它与仅将列设置为“唯一”有何不同,除了您可以只有一个PK?只是为了让程序员知道这个值唯一标识了记录吗?还是它也有一些特殊的属性?

我不知道“索引”是做什么的——事实上,我见过它使用的唯一一次是(1)我的主键似乎被索引了,(2)我听说索引在某种程度上与性能有关; 你想要索引列,但不要太多。如何决定要索引哪些列,它到底是做什么的?

编辑:一个索引列应该是一个可能想要排序的列吗?

非常感谢,

马拉

4

4 回答 4

27

主键通常用于为您的记录创建一个数字“id”,并且此 id 列会自动递增。

例如,如果您有一个books带有id字段的表,其中id是主键并且也设置为auto_increment(在“phpmyadmin 中的额外”下),那么当您第一次向表中添加一本书时,该表的 id 将变为 1' . 下一本书的 id 将自动为“2”,依此类推。通常,每个表都应该至少有一个主键,以帮助轻松识别和查找记录。

当您需要定期从表中检索某些信息时,将使用索引。例如,如果您有一个users表,并且您将需要经常访问该email列,那么您可以在电子邮件上添加一个索引,这将导致访问电子邮件的查询更快。

然而,添加不必要的索引也有缺点,所以只在确实需要访问的列上添加它。例如,UPDATE,DELETEINSERT索引越多查询会慢一点,因为 MySQL 需要为每个索引列存储额外的信息。更多信息可以在这个页面找到。

编辑:是的,需要ORDER BY大量使用的列应该有索引,以及WHERE.

于 2009-08-22T08:29:31.157 回答
7

主键基本上是一个唯一的索引列,充当该表中行的“官方”ID。最重要的是,它通常用于外键关系,即如果另一个表首先引用了一行,它将包含该行主键的副本。

请注意,可能有一个复合主键,即一个包含多于一列的主键。

索引提高了查找时间。它们通常是基于树的,因此通过索引查找特定行需要 O(log(n)) 时间,而不是扫描整个表。

通常,大表中任何经常在 或(尤其是)子句中使用的列WHEREORDER BY应该JOIN有一个索引。由于需要为 evey或更新索引INSERT,因此会减慢这些操作。如果你写的很少,读的很多,那么索引到你听到的内容。如果您有大量写入和大量查询,需要在许多列上建立索引,那么您就有大问题了。UPDATEDELETE

于 2009-08-22T08:53:28.550 回答
6

主键和唯一键之间的区别最好通过一个例子来解释。

我们有一个用户表:

USER_ID number 
NAME varchar(30)
EMAIL varchar(50)

在该表中,USER_ID 是主键。NAME 并不是唯一的——世界上有很多 John Smiths 和 Muhammed Khans。EMAIL 必须是唯一的,否则全球电子邮件系统将无法工作。所以我们对 EMAIL 设置了一个唯一的约束。

那么为什么我们需要一个单独的主键呢?三个原因:

  1. 数字键在外键关系中使用时效率更高,因为它占用的空间更少
  2. 电子邮件可以更改(例如交换提供商),但用户仍然相同;在整个模式中改变主键值始终是一场噩梦
  3. 使用敏感或私人信息作为外键总是一个坏主意
于 2009-08-22T08:53:48.157 回答
4

在关系模型中,保证在表中存在且唯一的任何列或列集都可以称为表的候选键。“现在”的意思是“不为空”。数据库设计中的常见做法是将其中一个候选键指定为主键,并使用对主键的引用来引用整行或行描述的主题项。

在 SQL 中,PRIMARY KEY 约束相当于每个主键列的 NOT NULL 约束,以及所有主键列的 UNIQUE 约束。在实践中,许多主键变成了单列。

对于大多数 DBMS 产品,PRIMARY KEY 约束也会导致在主键列上自动构建索引。当为主键创建新条目时,这会加快系统检查活动,以确保新值不会与现有值重复。它还加快了基于主键值的查找速度,并在主键和引用它的外键之间进行连接。加速多少取决于查询优化器的工作方式。

最初,关系数据库设计人员在数据中寻找给定的自然键。近年来,趋势一直是总是创建一个称为 ID 的列,一个整数作为第一列和每个表的主键。DBMS 的自动生成功能用于确保此密钥是唯一的。这种趋势记录在“奥斯陆设计标准”中。它不一定是关系设计,但它服务于遵循它的人的一些直接需求。我不推荐这种做法,但我承认这是流行的做法。

索引是一种数据结构,它允许根据对被索引的表的列的描述快速访问表中的几行。索引由某些表列的副本组成,称为索引键,散布着指向表行的指针。指针通常对 DBMS 用户隐藏。索引与查询优化器协同工作。用户在 SQL 中指定正在寻找的数据,优化器提出索引策略和其他策略,用于将正在寻找的内容转换为找到它的策略。有某种组织原则,例如排序或散列,使索引能够用于快速查找和某些其他用途。一旦数据库构建器创建了索引或声明了主键,这一切都是 DBMS 内部的。

可以建立与主键无关的索引。主键可以在没有索引的情况下存在,尽管这通常是一个非常糟糕的主意。

于 2009-08-22T15:00:22.330 回答