database - 给定一个查询,您如何知道要添加哪些索引?

标签 database postgresql database-indexes

有没有什么工具可以做到这一点?你给它一个 SQL 查询,它会给出建议。例如,我正在尝试优化以下查询:

Load (383.2ms)  SELECT COUNT(*) as plays, p.chosen_race as race, p.won as won, r.game_type as type FROM plays p, replays r WHERE p.replay_id = r.id AND r.is_public = 't' AND r.winner_known = 't' GROUP BY r.game_type, p.chosen_race, p.won ORDER BY r.game_type, p.chosen_race

解释

 Aggregate  (cost=8389.92..8389.93 rows=1 width=4)
   ->  Hash Left Join  (cost=3570.69..8150.84 rows=95630 width=4)
         Hash Cond: (replays.id = players_replays_join.replay_id)
         ->  Hash Left Join  (cost=1785.34..3772.35 rows=38995 width=4)
               Hash Cond: (replays.id = plays.replay_id)
               ->  Seq Scan on replays  (cost=0.00..833.02 rows=15901 width=8)
                     Filter: (is_public AND ((state)::text = 'success'::text))
               ->  Hash  (cost=1110.82..1110.82 rows=41082 width=4)
                     ->  Seq Scan on plays  (cost=0.00..1110.82 rows=41082 width=4)
         ->  Hash  (cost=1110.82..1110.82 rows=41082 width=8)
               ->  Seq Scan on plays players_replays_join  (cost=0.00..1110.82 rows=41082 width=8)

我们应该如何解释该输出?

最佳答案

您需要表格中的数据。

然后你可以使用EXPLAIN ANALYZE

http://www.postgresql.org/docs/9.0/interactive/using-explain.html

您可以添加和删除索引并比较时间。

关于database - 给定一个查询,您如何知道要添加哪些索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6612789/

相关文章:

java - Servlet - 如何从数据库下载多个文件

concurrency - POSIX 的 read() 和 write() 系统调用是原子的吗?

PostgreSQL:为 boolean 列创建索引

php - 我不能做外键,约束错误

SQL 查询 - 所有字母表的正则表达式模式

python - 计算两个数据帧的振荡

postgresql - AWS RDS PostgreSQL 9.5.4 扩展 postgis_tiger_geocoder 缺少 Soundex?

postgresql - 在使用 AWS Data Pipeline 从 RDS postgres 数据库导出的 CSV 文件中包含列标题?

postgresql - PostgreSQL 外键约束中的意外值

mysql - 索引 'enabled' 字段好主意?