我有一张看起来像这样的表:
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
答案 0 :(得分:1)
您想要一个超过(objectID, time)
的综合索引:
ALTER TABLE my_table ADD INDEX (objectID, time)
原因是MySQL可以直接从索引树中检索每个time
的最大objectID
;然后,它也可以使用相同的索引再次加入表格,以使用类似第二个查询的内容查找groupwise maximum记录(但是应该加入objectID
和time
- 我喜欢在这种情况下使用NATURAL JOIN
:
SELECT *
FROM my_table NATURAL JOIN (
SELECT objectID, MAX(time) time
FROM my_table
WHERE time <= 1353143351
GROUP BY objectID
) t