我试图更好地理解主键,如何在表设计和查询中有效地使用它们。
首先,主键本身是否用在 WHERE 子句中?例如,如果我有一个名称表,并且对于姓氏以“A”开头的所有条目,主键设置为“A”,对于所有姓氏以“B”开头的条目,主键设置为“B”,等等。最好的做法是:
WHERE pk_field = 'B' AND last_name = 'Bluthe'
其次,我想了解自动递增主键如何比以下内容更好地提高性能:
SELECT last_name FROM names WHERE last_name = 'Bluthe'
如果这条记录的主键是 1247
WHERE pk_field = 1247
会好很多。在找到匹配项之前,任务是否仍会遍历该列中的每条记录。
首先,我同意 John M 对您的问题的评论。您应该阅读一些有关数据库概念的文章。
您可能误解了访问数据和数据在数据库中的组织方式。当你需要查找 last_name 等于 'Bluthe' 的名字时,只需这样做:
而已。您无需担心主键。您应该担心的是 last_name 是否被索引。
当我们谈论索引时,就会涉及到主键。主键是对表中一行进行寻址的方式。因此,PK 应该是唯一的。您定义主键的方式根本行不通。索引将建立在 PK 之上。假设您有如下名称表,假设使用整数作为 pk
然后我们在 last_name 上创建索引。创建的索引将是这样的:
在搜索 last_name 时,数据库将利用此索引来定位实际记录。搜索“Bluthe”将得到 pk_field = 3,然后用于从名称表中获取实际记录。
对我来说,主键的最佳实践是比较便宜(使用基于整数的数据类型),与自动增量值聚类。使用自动增量值,我们不必担心多个事务同时插入同一个表。聚簇主键会根据其主键值来排列表中的物理行。因此,基于主键的搜索将非常快。
HTH