【问题标题】:Need help optimizing database query. Very unexperienced with indices需要帮助优化数据库查询。对索引非常缺乏经验
【发布时间】:2011-08-18 21:42:35
【问题描述】:

我需要优化这个查询。教授建议使用索引,但我对如何使用感到非常困惑。如果我能得到一个关于什么是好的索引、为什么以及所需的实际代码的示例,那么我绝对可以自己完成剩下的工作。任何帮助都是极好的。 (PSQL 顺便说一句)

    SELECT 
      x.enteredBy
      , x.id
      , count(DISTINCT xr.id)
      , count(DISTINCT c.id)
      , 'l'
 FROM 
      ((locationsV x left outer join locationReviews xr on x.id = xr.lid)
       left outer join reviews r on r.id = xr.id) 
       left outer join comments c on xr.id = c.reviewId
 WHERE 
      x.vNo = 0  
      AND (r.enteredBy IS NULL OR 
            (r.enteredBy <> x.enteredBy 
             AND c.enteredBy <> x.enteredBy
             AND r.enteredBY NOT IN 
                       (SELECT requested FROM friends WHERE requester = x.enteredBY)
             AND r.enteredBY NOT IN 
                       (SELECT requester FROM friends WHERE requested = x.enteredBY)))
     AND (c.enteredBy IS NULL OR 
             (c.enteredBY NOT IN 
                       (SELECT requested FROM friends WHERE requester = x.enteredBY)
             AND c.enteredBY NOT IN 
                       (SELECT requester FROM friends WHERE requested = x.enteredBY)))
 GROUP BY 
     x.enteredBy
     , x.id

我尝试在开头添加类似这样的内容,但它所花费的总时间没有改变。

CREATE INDEX friends1_idx ON friends(requested);
CREATE INDEX friends2_idx ON friends(requester);

【问题讨论】:

  • 有人看到任何其他优化吗?

标签: database optimization indexing postgresql


【解决方案1】:

我认为除了查看索引之外,还可以优化 SQL 本身以提高性能。在 WHERE 子句中包含 IN 子句可能会导致优化器进行全表扫描。因此,如果您可以将它们移动到FROM 部分中的表格,您将获得更好的性能。此外,在SELECT 语句中包含COUNT(DISTINCT ...) 子句似乎有问题。如果您可以进行更改,那么您可能会更好,因此 DISTINCT 子句是必要的,并且只需使用 COUNT 聚合函数。

在进行左连接之前,请考虑在 FROM 子句中使用 SQL 语句——类似这样的结构:

SELECT ... 
FROM Table1 LEFT JOIN 
     (SELECT ... FROM Table2 INNER JOIN Table3 ON ...) AS Table4 ON
        Table1.somecolumn = Table4.somecolumn
...

我知道这并没有为您提供解决方案,但希望它能帮助您思考问题的其他方面并探索解决性能问题的其他方法。

【讨论】:

  • 谢谢!关于索引的任何其他提示?
  • 我认为最好使用数据库分析工具来建议索引,而不是尝试自己猜测。大多数数据库都会有工具让您运行 SQL 命令,该命令将被分析以获取索引建议。除此之外,您还需要一个能够区分事物的索引。如果您为 90% 的值相同的列编制索引,那么除非您在 10% 中寻找某些东西,否则它可能不会太有用。具有许多唯一值的列可能是更好的索引。您还希望对查询中使用的列进行索引 - 在您的情况下可能是“请求者”或“请求”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-05
  • 2011-08-05
  • 2012-10-14
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多