Sql 主键字段上WHERE子句的行为

Sql 主键字段上WHERE子句的行为,sql,postgresql,Sql,Postgresql,在Postgres中,如果用户名不是主键,我知道它将遍历所有记录 但是,如果它是主键字段,那么上面的SQL语句将遍历整个表,或者在匹配用户名后立即终止。换句话说,“where”在主键列上运行时的行为是否不同?主键(以及所有索引列)在这些列用作筛选谓词时利用索引,如where和JOIN…on子句 作为一个真实的例子,我的应用程序有一个名为Log\u Games的表,这是一个包含数百万行的表,ID作为主键,还有许多其他非索引列,如ParsedAt。比较以下各项: 索引查询 select * from

在Postgres中,如果用户名不是主键,我知道它将遍历所有记录

但是,如果它是主键字段,那么上面的SQL语句将遍历整个表,或者在匹配用户名后立即终止。换句话说,“where”在主键列上运行时的行为是否不同?

主键(以及所有索引列)在这些列用作筛选谓词时利用索引,如
where
JOIN…on
子句

作为一个真实的例子,我的应用程序有一个名为
Log\u Games
的表,这是一个包含数百万行的表,
ID
作为主键,还有许多其他非索引列,如
ParsedAt
。比较以下各项:

索引查询

select * from table where username="johndoe"
Index Scan using "Log_Games_pkey" on "Log_Games"  (cost=0.43..8.45 rows=1 width=4190) (actual time=0.024..0.024 rows=1 loops=1)
  Index Cond: ("ID" = 792046)
Planning time: 1.059 ms
Execution time: 0.066 ms
索引查询计划

EXPLAIN ANALYZE
SELECT *
FROM "Log_Games"
WHERE "ID" = 792046
EXPLAIN ANALYZE
SELECT *
FROM "Log_Games"
WHERE "ParsedAt" = '2015-05-07 07:31:24+00'
非索引查询

select * from table where username="johndoe"
Index Scan using "Log_Games_pkey" on "Log_Games"  (cost=0.43..8.45 rows=1 width=4190) (actual time=0.024..0.024 rows=1 loops=1)
  Index Cond: ("ID" = 792046)
Planning time: 1.059 ms
Execution time: 0.066 ms
非索引查询计划

EXPLAIN ANALYZE
SELECT *
FROM "Log_Games"
WHERE "ID" = 792046
EXPLAIN ANALYZE
SELECT *
FROM "Log_Games"
WHERE "ParsedAt" = '2015-05-07 07:31:24+00'
带有index子句的查询使用index
Log\u Games\u pkey
,导致查询在0.066ms内执行。带有non-indexed子句的查询将恢复为顺序扫描,这意味着它将从表的开始到结束,查看哪些列匹配,这一操作会导致执行时间缩短到793.135ms

网络上有很多优秀的资源可以帮助您阅读执行计划,并决定何时需要支持索引。PostgreSQL文档是一个很好的起点:

为什么有一个名为
johndoe
的专栏?有关数据库如何使用索引的详细信息,请阅读“johndoe”不是列。”用户名“是一列。”johndoe'是列
中的一个条目。“johndoe”
是一个标识符(=列),
'johndoe'
将是一个字符串值,非常感谢。我从来不知道双引号和单引号在英语中的意思不同SQL@KeyurPanchal:不会的。如果有索引,数据库将使用该索引查找该行。