MySQL:获取早于xxx,Performance的最新条目

时间:2013-03-28 18:42:06

标签: mysql performance select explain

我有一张看起来像这样的表:

ID | objectID | time | ...
-------------------
 1 |        1 | ...
 2 |        1 | ...
 3 |        1 | ...
 4 |        2 | ...
 5 |        2 | ...
 6 |        3 | ...
 7 |        4 | ...

ID是主键,objectID是非唯一的。 我试图提高查询的性能,以获取所有objectID的最新条目,但条目不应该比某个值更新。 我尝试跟踪两个查询,这两个查询都应该提供相同的(并且正确的结果):

SELECT *
FROM (
    SELECT *
    FROM table
    WHERE time <= XXX
    ORDER BY time DESC
)
GROUP BY objectID

SELECT *
FROM table AS t     
INNER JOIN (
    SELECT ID, MAX(time)
    FROM table
    WHERE time <= 1353143351
    GROUP BY objectID
) s
USING (ID)

第一个查询的EXPLAIN告诉我

id | select_type | table      | type | possible_keys | key     | key_len | ref  | rows   | Extra
------------------------------------------------------------------------------------
1  | PRIMARY     | <derived2> | ALL  | NULL          | NULL    | NULL    | NULL | 145827 | Using temporary; Using filesort
2  | DERIVED     | tbl_test   | ALL  | NULL          | NULL    | NULL    | NULL | 238694 | Using filesort

表示第二个查询

id | select_type | table      | type   | possible_keys | key     | key_len | ref  | rows   | Extra
------------------------------------------------------------------------------------
1  | PRIMARY     | <derived2> | ALL    | NULL          | NULL    | NULL    | NULL | 325 
1  | PRIMARY     | t          | eq_ref | PRIMARY,ID    | PRIMARY | 4       | s.ID | 1   
2  | DERIVED     | tbl_test   | index  | NULL          | ID      | 12      | NULL | 238694 | Using where; Using index; Using temporary; Using filesort

(tbl_test是我的测试表)

第二个查询似乎(更快),但仍然不是非常快,在~200k DB条目下运行时间为0.1秒。 有没有办法提高查询的性能?任何缺失的索引?

提前致谢!!

编辑:解释eggys查询(请参阅帖子中的查询):

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   PRIMARY <derived2>  ALL NULL    NULL    NULL    NULL    325 
1   PRIMARY lab_case_test   ALL NULL    NULL    NULL    NULL    238694  Using where; Using join buffer
2   DERIVED lab_case_test   index   NULL    ID  12  NULL    238694  Using where; Using index; Using temporary; Using f...

CREATE TABLE `lab_case_test` (
 `ID` int(11) NOT NULL AUTO_INCREMENT,
 `caseID` int(11) NOT NULL,
 `time` int(11) NOT NULL,
 // ....
 PRIMARY KEY (`ID`),
 KEY `ID` (`ID`,`caseID`,`time`),
 KEY `caseID` (`caseID`,`time`)
) ENGINE=MyISAM AUTO_INCREMENT=238695 DEFAULT CHARSET=utf8

1 个答案:

答案 0 :(得分:1)

您想要一个超过(objectID, time)的综合索引:

ALTER TABLE my_table ADD INDEX (objectID, time)

原因是MySQL可以直接从索引树中检索每个time的最大objectID;然后,它也可以使用相同的索引再次加入表格,以使用类似第二个查询的内容查找groupwise maximum记录(但是应该加入objectIDtime - 我喜欢在这种情况下使用NATURAL JOIN

SELECT *
FROM   my_table NATURAL JOIN (
  SELECT   objectID, MAX(time) time
  FROM     my_table
  WHERE    time <= 1353143351
  GROUP BY objectID
) t