这个MySQL查询可以更有效吗?

时间:2013-02-25 16:47:16

标签: mysql sql

更新这是一个sqlfiddle http://sqlfiddle.com/#!2/e0822/1/0

我有一个应用程序的MySQL数据库(itunes_id),每个应用程序ID都有一个注释字段。要保留历史记录,每次更改注释时,都会添加一行新数据。在下面的查询中,我只想要一个每个应用程序(itunes_id)的最新条目(最高ID)的列表。

以下是我的数据库的标题:

id  (key and auto increment)
itunes_id
comments 
date

此查询获取给定itunes_id的最新条目。如何使此查询更有效?

SELECT * FROM (
    SELECT * FROM (
        SELECT * FROM Apps
        ORDER BY id DESC
    ) AS apps1
    GROUP BY itunes_id
) AS apps2
LIMIT 0 , 25

4 个答案:

答案 0 :(得分:1)

此查询使用子查询,该子查询分别为每个ID获取最大itunes_ID。然后,子查询的结果将在原始表上重新连接,前提是它匹配两列:itunes_IDID

SELECT  a.*
FROM    Apps a
        INNER JOIN
        (
            SELECT  itunes_id, MAX(ID) max_id
            FROM    Apps
            GROUP   BY itunes_id
        ) b ON a.itunes_id = b.itunes_id AND
                a.ID = b.max_ID
LIMIT   0, 25

要获得更快的效果,请在列INDEXitunes_ID上创建复合列ID。 EG,

ALTER TABLE Apps ADD INDEX (itunes_ID, ID)

答案 1 :(得分:1)

对于类似的方法,我使用“recent”布尔字段来标记包含最新版本的记录。这需要对每个插入进行UPDATE查询(停用上一个最近的记录),但允许快速选择查询。或者,您可以维护两个表,一个表包含最近的记录,另一个表包含每个应用程序的历史记录。

编辑:也许您可以尝试与此类似的表:

  • id int not null auto_increment primary key
  • version int not null
  • main_id int null
  • 最近布尔值不为空
  • app varchar(32)not null
  • comment varchar(200)null

您可以使用“main_id”列指向版本为1的记录。

答案 2 :(得分:0)

我只想要给定应用的最新条目(最高ID)(itunes_id)

这样做

SELECT MAX(id), comments FROM Apps WHERE itunes_id = "iid";

SELECT id, comments FROM Apps WHERE itunes_id = "iid" ORDER BY id DESC LIMIT 1;

iid是您想要最新评论的itunes ID。

确保将iditunes_id编入索引composite index以获得最高效率。

答案 3 :(得分:0)

SELECT * FROM (
    SELECT * FROM (
        SELECT * FROM Apps
        ORDER BY id DESC
    ) AS apps1
    GROUP BY itunes_id
) AS apps2
LIMIT 0 , 25

不会选择最旧的记录(您不能假设生成的密钥始终是“最旧的”)。你想要的是这样的:

SELECT * FROM (
    SELECT * FROM (
        SELECT * FROM Apps
        where some_date = (select max(some_date) from Apps limit 1)
        ORDER BY id DESC
    ) AS apps1
    GROUP BY itunes_id
) AS apps2
LIMIT 0 , 25