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

Mal*_*ala 19 sql phpmyadmin

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

  • 首要的关键
  • 指数

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

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

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

非常感谢,

马拉

Cli*_*ote 27

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

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

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

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

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

  • 主键不需要是数字或单个字段.和IDENTITY列更适合该描述.相反,主键用于告诉RDBMS指定的字段可以唯一地标识表中的单个行.基本上是一个独特的索引.主键也是正常的(但不是必需的),它也是数据存储顺序的控制因素(SQLServer中的集群主键),因此显着提高了查找数据行所需的时间(用于读取,写入等) (3认同)
  • 谢谢你,你一直很有帮助!我想知道,将列设置为PK与将列设置为auto_increments的唯一Integer有何不同?引擎盖下有什么其他的吗? (2认同)

Mic*_*rdt 7

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

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

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

通常,在被频繁用于一个大的表中的任何列WHERE,ORDER BY或(特别是)JOIN条款应该有一个索引.由于指数需求埃维进行更新INSERT,UPDATE或者DELETE,它会减慢这些操作.如果您的写入次数很少且读取次数很多,那么请将您的内容编入索引.如果你有很多写入和大量的查询需要在许多列上的索引,那么你有一个很大的问题.


APC*_*APC 6

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

我们有一个用户表:

USER_ID number 
NAME varchar(30)
EMAIL varchar(50)
Run Code Online (Sandbox Code Playgroud)

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

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

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