SQL:主键和索引究竟做了什么?

时间:2009-08-22 08:19:50

标签: sql phpmyadmin

我最近开始开发我的第一个使用SQL数据库的认真应用程序,我正在使用phpMyAdmin来设置表。有几个可选的“功能”,我可以提供各种列,我不完全确定他们做了什么:

  • 主键
  • 索引

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

我不知道“索引”是做什么的 - 实际上,我见过它的唯一时间是(1)我的主键似乎被编入索引,(2)我听说索引是某种方式与表现有关;你想要索引列,但不是太多。如何确定要索引哪些列,以及它究竟做了什么?

编辑:如果一个索引列中有一个可能想要ORDER BY?

非常感谢,

马拉

4 个答案:

答案 0 :(得分:27)

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

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

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

但是,添加不必要的索引也存在缺点,因此仅在真正需要访问的列上添加此索引而不是其他索引。例如,由于MySQL需要为每个索引列存储额外信息,因此UPDATEDELETEINSERT查询的索引会越慢。更多信息可以在this page找到。

编辑:是的,需要在ORDER BY中使用的列应该有索引,以及WHERE中使用的索引。

答案 1 :(得分:7)

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

请注意,可以使用复合主键,即包含多个列的复合主键。

索引可以缩短查找时间。它们通常是基于树的,因此通过索引查找某一行需要O(log(n))时间而不是扫描整个表。

通常,WHEREORDER BY或(特别是)JOIN子句中经常使用的大型表中的任何列都应具有索引。由于需要针对evey INSERTUPDATEDELETE更新索引,因此会降低这些操作的速度。如果您的写入次数很少且读取次数很多,那么请将您的内容编入索引。如果你有很多写入和大量需要多列索引的查询,那么你就有一个大问题。

答案 2 :(得分:6)

通过示例可以最好地解释主键和唯一键之间的区别。

我们有一个用户表:

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

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

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

  1. 数字键效率更高 在外键中使用时 关系,因为它占用更少的空间
  2. 电子邮件可以更改(例如 交换提供者)但用户是 还是一样;涟漪变化 整个架构中的主键值 永远是一场噩梦
  3. 使用它总是一个坏主意 敏感或私人信息 外键

答案 3 :(得分:3)

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

在SQL中,PRIMARY KEY约束相当于每个主键列的NOT NULL约束,以及所有主键列一起使用的UNIQUE约束。实际上,许多主键都是单列。

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

最初,关系数据库设计者在给定的数据中查找自然键。近年来,趋势是始终创建一个名为ID的列,一个整数作为第一列和每个表的主键。 DBMS的自动生成功能用于确保此密钥是唯一的。这种趋势记录在“奥斯陆设计标准”中。它不一定是关系设计,但它可以满足跟随它的人们的一些直接需求。我不推荐这种做法,但我认识到这是普遍的做法。

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

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