SQL:一种稍微复杂的优化查询

时间:2012-08-29 18:18:46

标签: sql database query-optimization

好的,我们有一个数据库,有一个不太好的表格 - 列布局,适用于在线运作的小型新闻机构。目前,改变布局是不可能的;所以,我专注于查询。

网页需要“访客”作者列表。每个列表项应包含:

  • 作者的形象(作者)
  • 作者姓名(作者)
  • 他/她写的最后一篇文章的标题(新闻)
  • 该文章的URI(新闻)

在括号中是存储信息的表名。

在“作者”(40多条记录)中,相关栏目是:

  • 图像
  • 名称
  • 类型(我们会在这里查找值“Guest”)
  • ASCII(存储“名称”值但不包含非英文字符和空格)

“新闻”(28k +记录)表基本上是一个所有新闻和文章都涌入的池。感兴趣的列将是:

  • Id(主键:越高,越近)
  • 分类
  • 标题
  • URI

现在,“类别”有很多值;但是,如果特定记录是文章,则此列保留“作者”的“ASCII”(而不是“Id”,遗憾地)。

有一个PHP代码,“同时”查询每个作者。当我看到它时,我想替换它。所以,我想,“嗯......如何一次性取出这些?”并想出了这个:

-- Aliases are prefixed with 't' for tables and 'c' for columns.
SELECT
  tAu.Image, tAu.Name, tNw.Title, tNw.URI
FROM ( -- tAu & tNw

    SELECT * FROM ( -- tRc & Authors

        SELECT
          MAX(Id) cId, Category cCt -- Max Id for most recent
        FROM
          News
        GROUP BY
          cCt

    ) tRc -- table of categories with their most recent id's
    INNER JOIN
      Authors
    ON
      tRc.cCt = Authors.ASCII
    WHERE
      Authors.Type = 'Guest'

) tAu -- table of authors with their most recent id's
INNER JOIN
  News tNw
ON
  tAu.cId = tNw.Id -- merging authors with their latest article info

目前,此查询大约需要0.0364秒。可能不是那么糟糕;但是,我很好奇这是否可以做得更好(因为这个查询从新闻中选择两次)。

1 个答案:

答案 0 :(得分:0)

我不知道它是否更快,但是稍微清理了一下你的查询,这可能有助于优化器:

SELECT
  Authors.Image,
  Authors.Name,
  News.Title,
  News.URI

FROM (
    SELECT
      MAX(Id) TopNewsId,
      Category
    FROM News
    GROUP BY Category
) TopNewsPerCats

INNER JOIN News     ON News.Id       = TopNewsPerCats.TopNewsId

INNER JOIN Authors  ON Authors.ASCII = TopNewsPerCats.Category
                   AND Authors.Type  = 'Guest'

News表的索引应以( Category, Id)开头,以加快内部SELECT GROUP BY