WHERE 子句对主键字段的行为

阿尤什·卡尔基
select * from table where username="johndoe"

在 Postgres 中,如果 username 不是主键,我知道它会遍历所有记录。

但是如果是主键字段,上面的SQL语句会遍历整个表,还是匹配username就终止。换句话说,当“where”在主键列上运行时,它的行为是否有所不同?

e_i_pi

当这些列用作过滤谓词时,主键(以及所有索引列)利用索引,例如WHEREJOIN...ON子句。

作为一个真实世界的示例,我的应用程序有一个名为 的表Log_Games,该表以数百万行ID作为主键,以及许多其他非索引列,例如ParsedAt. 比较以下内容:

索引查询

EXPLAIN ANALYZE
SELECT *
FROM "Log_Games"
WHERE "ID" = 792046

索引查询计划

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 "ParsedAt" = '2015-05-07 07:31:24+00'

非索引查询计划

Seq Scan on "Log_Games"  (cost=0.00..141377.34 rows=18 width=4190) (actual time=0.013..793.094 rows=1 loops=1)
  Filter: ("ParsedAt" = '2015-05-07 07:31:24+00'::timestamp with time zone)
  Rows Removed by Filter: 1924676
Planning time: 0.794 ms
Execution time: 793.135 ms

带有 indexed 子句的查询使用 index Log_Games_pkey,导致查询在 0.066 毫秒内执行。带有非索引子句的查询恢复为顺序扫描,这意味着它从表的开始到结束查看哪些列匹配,该操作导致执行时间激增至 793.135 毫秒。

网络上有很多很好的资源可以帮助您阅读执行计划并决定何时可能需要支持索引。一个很好的起点是 PostgreSQL 文档:https : //www.postgresql.org/docs/9.6/static/using-explain.html

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

LINQ where子句行为

来自分类Dev

Oracle SQL - WHERE 子句行为

来自分类Dev

where子句中的位字段

来自分类Dev

where子句中的位字段

来自分类Dev

Where子句中的奇数括号行为

来自分类Dev

Cassandra-具有非主键缺点的WHERE子句

来自分类Dev

重用WHERE子句中的字段值

来自分类Dev

使用WHERE子句从JSONB字段中选择

来自分类Dev

使用 where 子句选择多个字段

来自分类Dev

SQL Server检查where子句是否对任何行为真

来自分类Dev

MySql奇怪的行为-从where子句中的id右边剥离字符

来自分类Dev

了解 dbms_random.value 在 where 子句中的行为

来自分类Dev

在ADODB下的WHERE子句中使用多值查阅字段

来自分类Dev

熊猫read_sql。如何查询日期字段的where子句

来自分类Dev

where子句中的Javascript SQL请求错误字段错误

来自分类Dev

使用select中的字段的where子句中的动态表名称

来自分类Dev

如果字段值为空,则排除where子句中的列

来自分类Dev

具有相同字段名称的 WHERE 子句

来自分类Dev

带有父字段的 Ruby-on-Rails Where 子句

来自分类Dev

Linq Lambda Where子句和where子句

来自分类Dev

过滤主键后,为什么不能在Cassandra中添加WHERE子句?

来自分类Dev

MySQL安全模式错误,即使在where子句中使用主键时也是如此

来自分类Dev

Laravel 5. 复合主键。“where 子句”中的未知列“id”

来自分类Dev

更新时出现 MySQL 错误 1157,但是我在 where 子句中使用了主键

来自分类Dev

为什么嵌入在WHERE子句中的ToList的行为与在查询外部执行的ToList的行为不同?

来自分类Dev

多个where子句

来自分类Dev

Rails ActiveRecord where子句

来自分类Dev

Laravel动态where子句

来自分类Dev

plsql条件where子句

Related 相关文章

热门标签

归档