我正在设计一个包含高分列表的数据库,并且需要SQL查询快速列表.
高分列表中的条目与用户之间将存在一对一的关系,但我不需要列表本身的所有用户信息.
所以,我想知道设计是否会更快地查询数据库.
设置1:
2个表与1对1的关系.
用户表:
ID(PK) – 名称 – 电子邮件 – entryID(FK)
条目表:
ID(PK) – 得分 – 消息 – 用户ID(FK)
查询:
SELECT score, message
FROM entries
ORDER BY score desc
设置2:
1张桌子
用户表:
ID – 名称 – 电子邮件 – 得分 – 消息
查询:
SELECT score, message
FROM users
ORDER BY score desc
我想知道的是:当您选择列的子集时,表中的列数是否会影响查询的速度?
最佳答案 如果您的表没有索引,则查询中的列数无关紧要 – 它会扫描具有所有列的块.唯一的影响是返回时间 – 发送给客户端的数据量会有所不同.
如果您计划在查询中包含索引和索引列的列表 – 那么它确实很重要.例如,使用9.6,您可以点击仅索引扫描…
啊,是的,它对具有TOASTed值的列很重要.
简短的例子:
t=# create table s09 (i int, a text);
CREATE TABLE
t=# insert into s09 select generate_series, 'text' from generate_series(1,9999999,1);
INSERT 0 9999999
t=# analyze s09;
ANALYZE
t=# explain analyze select * from s09;
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------
Seq Scan on s09 (cost=0.00..154053.58 rows=9999858 width=9) (actual time=0.010..1712.339 rows=9999999 loops=1)
Planning time: 0.046 ms
Execution time: 2825.514 ms
(3 rows)
t=# explain analyze select i from s09;
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------
Seq Scan on s09 (cost=0.00..154053.58 rows=9999858 width=4) (actual time=0.010..1828.329 rows=9999999 loops=1)
Planning time: 0.028 ms
Execution time: 2937.231 ms
(3 rows)