我有一个带索引的表:
create index on foo (a, b, c);
搜索a和b时,Postgres可以使用索引快速查找行:
test=# explain analyze select a from foo where a = 3 and b = 4;
Index Only Scan using foo_a_b_c_idx on foo (cost=0.43..486.83 rows=120 width=4) (actual time=0.141..23.981 rows=59049 loops=1)
Index Cond: ((a = 3) AND (b = 4))
Heap Fetches: 59049
Total runtime: 25.894 ms
搜索b和c的速度要慢得多,因为它必须线性扫描整个索引(或表):
test=# explain analyze select a from foo where b = 4 and c = 5;
Index Only Scan using foo_a_b_c_idx on foo (cost=0.43..121987.32 rows=120 width=4) (actual time=7.377..159.793 rows=59049 loops=1)
Index Cond: ((b = 4) AND (c = 5))
Heap Fetches: 59049
Total runtime: 160.735 ms
然而,在两种情况下查询计划看起来都相同(两者都被称为“仅索引扫描”,带有一些“索引条件”)。是否可以判断在对数或线性时间内是否可以访问(无需查看每个索引定义)?
其他数据库系统更清楚他们如何使用索引。在MS SQL中,第一个查询将是“索引搜索”(快速),而第二个查询将是“索引扫描”(慢速)。在Sqlite中,第一个是“SEARCH TABLE foo USING COVERING INDEX”(快速),而第二个是“SCAN TABLE foo USING COVERING INDEX”(慢)。
答案 0 :(得分:2)
除了@horse突出显示的更详细的查询计划选项外,答案是:否。除了基本了解索引的工作方式(当然还知道自己的模式)之外,没有任何提示或方法可以了解。