【问题标题】:PostgreSQL query extremely slowPostgreSQL 查询极慢
【发布时间】:2015-02-18 09:41:03
【问题描述】:

我在 PostgreSQL 数据库中有一个表:temp 有 4 列

(
    id int, 
    campaign character varying, 
    sender character varying, 
    date_s date
) 

已经有大约 900 万条记录。暂时没有索引。

问题是当我试图做一个:

SELECT COUNT(*) 
FROM temp 
WHERE 
    id = $idmail and 
    campaign = '$variable_campaign' AND 
    date > '$date_c' "

在 100K 循环中。

查询没有响应。 (我在 PHP 中设置了无限的 set_time_limit 否则我会在 5 分钟内得到 500 错误)

实际上,所有这些查询的目的是获取相关活动在本周未发送到的邮件列表。

你有什么想法吗,因为我真的不知道该怎么做!

如果无法执行查询,我可以做一种临时文件,但我更喜欢处理数据库,它更干净!

【问题讨论】:

  • “暂时没有索引”和“在 100K 循环中”,听起来像是解释性能问题的 2 个主要问题。但是,您为什么不创建一个查询来一次性选择您需要的所有记录呢?使用EXPLAIN ANALYZE获取查询计划和执行时间,可以发到explain.depesz.com
  • 为什么不创建索引来提高性能?在 TEMP(ID、CAMPAIGN、DATE)上创建索引 TEMP_IDX_1;
  • @Christian:索引可能会大大改善此查询,但如果执行 100000 次,它仍然很慢。索引只是性能优化的一小部分。

标签: php database postgresql


【解决方案1】:

假设有一个mails 表,主键为id

select id    
from
    temp t
    right join
    mails m using(id)
where 
    t.campaign = '$variable_campaign' and
    t.date > '$date_c' and
    t.id is null

它将返回所有未发送的邮件ID。

【讨论】:

  • 这个假设看起来已经好多了!只需一次顺序读取,而不是 10 万次顺序读取......有些索引可能会提高性能,但这一切都取决于!
  • 我要试试这个查询,让你知道它是否响应缓慢
猜你喜欢
  • 2019-10-25
  • 1970-01-01
  • 2023-03-12
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
相关资源
最近更新 更多