问题:目前项目中使用 pg9.3,在一个单独的 DB server 上面,有一个表用来统计用户行为,目前接近 6 亿条数据,虽然加了索引,但是查询速度还是非常慢,目前正在调研如何解决性能瓶颈问。
参考解决方案:看了社区里面的帖子,能够想到的解决方案就是对数据做分表操作。
请问大家有没有好的解决方案,给点建议?XD
如果要问这样的问题,你需要说明白数据库表的结构,慢查询的 sql 语句,和 explain 的结果,别人才能给你建议怎么做. 不然我只能大概地告诉你两个字:拆表。
@small_fish__ 单个查询需要两秒,因为要分析大概 2 个星期的数据,DB time 跟 CPU time 加起来大概 10 多秒,难以忍受啊,多以才要优化的
优化方式有很多啦,也不用分表。
比如 summary 表,定期按需把聚合数据导入到一个新表,在新表里做统计分析。使用 group by + select into 或简单的 ETL 倒一次很快的。
PS. 一般用来分析的表,时间也不这么存,只存到天,甚至存 date_id。
user_id 和 timestamp 已经加了索引 是单独建索引还是联合索引,联合索引和单独索引差异很大。
如果建立 [user_id, timestamp] 的联合索引,应该不至于这么慢。
另外,为啥要 distinct 的,这个操作对数据库通常是要命的。
做统计数据,数据表实在太大了,通常要组合下面的方法
可以考虑这样操作:先把数据导出成数据文件,建立好目标分区表,然后把数据导入,重命名表。
这个方法是 mysql 下的经验,重命名表在 mysql 下很快,我对 pg 不太了解,不知道在 pg 下怎样。
加了索引不一定快,要看数据的分布,你先看哪个语句慢,条件是什么,这个条件下,数据的分布如何,如果这个条件下,数据超过 10% 的分布,那这个索引基本也提高不了性能,因为筛选出的数据集还是很大。