最新日期的MySql记录匹配标准

时间:2017-01-05 19:06:34

标签: mysql

我有一个mySql表,其中记录了所有状态更改。我希望能够查询特定日期的所有项目的状态,或所有项目的最后日期。我现在的表是:

CREATE TABLE `tra_rel_sta` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `tra_id` int(11) DEFAULT NULL,
  `sta_id` int(11) DEFAULT NULL,
  `changed_on` datetime DEFAULT NULL,
  `changed_by` int(11) DEFAULT NULL,
  `comments` text,
  PRIMARY KEY (`id`),
  KEY `tra_id` (`tra_id`),
  KEY `rel` (`tra_id`,`sta_id`,`changed_on`),
  KEY `sta_id` (`sta_id`),
  KEY `changed_on` (`changed_on`),
  KEY `tra_changed` (`tra_id`,`changed_on`)
) ENGINE=InnoDB AUTO_INCREMENT=51734 DEFAULT CHARSET=utf8;

(我知道我可能过度使用索引,但我还没有确切地知道如何优化索引)。

我现在使用的查询,其工作原理是:

SELECT rel.changed_on, rel.changed_by, rel.tra_id, sta.id AS sta_id, sta.status, sta.description, sta.onHold, sta.awaitingApproval, sta.approved, sta.complete, sta.locked
FROM ( 
    SELECT tra_id, MAX(changed_on) AS lst
    FROM tra_rel_sta 
    GROUP BY tra_id
) AS rec
LEFT JOIN tra_rel_sta AS rel ON rel.changed_on = rec.lst AND rel.tra_id = rec.tra_id
LEFT JOIN tra_status AS sta ON sta.id = rel.sta_id

如果我想使用特定日期,我在子查询中插入WHERE语句。

这样可行,但在PHP中运行大约需要0.65秒,表中有大约51,733条记录。当我需要知道对象的最后状态时,此查询在其他几个查询中用作子查询,因此会减慢许多应用程序的速度。

我尝试在MySQL: how to select record with latest date before a certain date中描述的WHERE语句中使用子查询,但它花费的时间几乎是其两倍。我已尝试使用MySQL select of record with latest date中所述的JOIN语句,但我得到的结果相同或略慢。

如何优化此查询或修复索引以使其更有效?

谢谢!

根据要求,查询的解析:

id | select_type | table       | type   | possible_keys                     | key     | key_len | ref               | rows  | Extra
---|-------------|-------------|--------|-----------------------------------|---------|---------|-------------------|-------|-------------
1  | PRIMARY     | <derived2>  | ALL    | NULL                              | NULL    | NULL    | NULL              | 49931 | NULL
1  | PRIMARY     | rel         | ref    | tra_id,rel,changed_on,tra_changed | tra_id  | 5       | rec.tra_id        | 1     | Using where
1  | PRIMARY     | sta         | eq_ref | PRIMARY                           | PRIMARY | 4       | csinfo.rel.sta_id | 1     | NULL
2  | DERIVED     | tra_rel_sta | index  | tra_id,rel,tra_changed            | tra_id  | 5       | NULL              | 49931 | NULL

0 个答案:

没有答案