wut*_*aer 5 sql postgresql indexing performance sql-limit
我需要最低价值runnerId.
这个查询:
SELECT "runnerId" FROM betlog WHERE "marketId" = '107416794' ;
Run Code Online (Sandbox Code Playgroud)
需要80毫秒(1968结果行).
这个:
SELECT min("runnerId") FROM betlog WHERE "marketId" = '107416794' ;
Run Code Online (Sandbox Code Playgroud)
需要1600毫秒.
是否有更快的方法来找到最小值,或者我应该在我的java程序中计算min?
"Result (cost=100.88..100.89 rows=1 width=0)"
" InitPlan 1 (returns $0)"
" -> Limit (cost=0.00..100.88 rows=1 width=9)"
" -> Index Scan using runneridindex on betlog (cost=0.00..410066.33 rows=4065 width=9)"
" Index Cond: ("runnerId" IS NOT NULL)"
" Filter: ("marketId" = 107416794::bigint)"
CREATE INDEX marketidindex
ON betlog
USING btree
("marketId" COLLATE pg_catalog."default");
Run Code Online (Sandbox Code Playgroud)
另一个想法:
SELECT "runnerId" FROM betlog WHERE "marketId" = '107416794' ORDER BY "runnerId" LIMIT 1 >1600ms
SELECT "runnerId" FROM betlog WHERE "marketId" = '107416794' ORDER BY "runnerId" >>100ms
Run Code Online (Sandbox Code Playgroud)
如何LIMIT减慢查询速度?
你需要的是一个多列索引:
CREATE INDEX betlog_mult_idx ON betlog ("marketId", "runnerId");
Run Code Online (Sandbox Code Playgroud)
如果有兴趣,您可以在dba.SE上找到有关 PostgreSQL中多列索引,链接和基准的深入信息.
我是怎么想的?
在多列索引中,行由索引的第一列("marketId")排序(从而聚类),并且每个簇依次由索引的第二列排序 - 因此第一行与条件匹配min("runnerId").这使索引扫描速度极快.
关于LIMIT减慢查询的悖论效应- Postgres查询规划器在那里有一个弱点.常见的解决方法是使用CTE(在这种情况下不是必需的).在这个最近密切相关的问题下查找更多信息:
PostgreSQL查询耗时太长
| 归档时间: |
|
| 查看次数: |
1820 次 |
| 最近记录: |