2017-01-15 1 views
0

현재 600M 개가 넘는 레코드가있는 테이블에서 각 그룹의 마지막 레코드를 찾는 가장 효율적인 방법을 찾고 있습니다.EXPLAIN SELECT에 사용 된 테이블이 없습니다

내가 서브 쿼리를 사용하고 있지만 그 안에 FROM 절을 생략한다 찾은 가장 빠른 방법 :

``` 
+------+--------------------+-------+------+---------------+------+---------+------+-----------+----------------------------------------------+ 
| id | select_type  | table | type | possible_keys | key | key_len | ref | rows  | Extra          | 
+------+--------------------+-------+------+---------------+------+---------+------+-----------+----------------------------------------------+ 
| 1 | PRIMARY   | t1 | ALL | NULL   | NULL | NULL | NULL | 185093129 | Using where; Using temporary; Using filesort | 
| 2 | DEPENDENT SUBQUERY | NULL | NULL | NULL   | NULL | NULL | NULL |  NULL | No tables used        | 
+------+--------------------+-------+------+---------------+------+---------+------+-----------+----------------------------------------------+ 
``` 

유일한 다른 옵션 :

``` 
EXPLAIN 
SELECT customer, server, disk 
FROM t1 
WHERE timestamp = (SELECT MAX(timestamp)) 
GROUP BY customer, server, disk; 
``` 

을하지만 EXPLAIN는 하위 쿼리에 No tables used을 제공합니다 JOINS 또는 FROM 절이있는 하위 쿼리를 사용하고 있습니다. 하지만 둘 다 전체 테이블 스캔을하는 것처럼 보입니다. 여기에 설명 된 방법에 문제가 있습니까?

+0

처럼 생각 : 내가 쿼리에 오류가 thow하는 기대. 그러나 - 당신의 작업을 해결하는 것에 대한 많은 답이 있습니다. –

답변

0

(SELECT MAX(timestamp))은 테이블이없는 SUBQUERY입니다. 당신이 시도 할 수

SELECT @var:= MAX(timestamp) from t1; 

SELECT customer, server, disk 
FROM t1 
WHERE timestamp = @var 
GROUP BY customer, server, disk; 

또는 (느린) 이상한

SELECT customer, server, disk 
FROM t1 
WHERE timestamp = (SELECT MAX(timestamp) from t1) 
GROUP BY customer, server, disk; 
+0

이것은 처음에하는 일 이었지만 Indexes를 사용할 수 없기 때문에 쿼리를 실제로 비효율적으로 느리게 만드는 두 가지 테이블 스캔을 수행합니다. – OmisNomis

+0

왜'timestamp'에 인덱스를 추가하지 않습니까? 그것은 문제를 해결할 수 있습니다. –

+0

색인이 있지만 불행히도 여전히 1 시간 이상 걸립니다. 나는 지난 3 일 동안의 마지막 기록을 검색하는 것을 제한함으로써 문제를 해결했다. 이제 하위 쿼리가 있기 때문에보기로 저장하는 데 문제가 있습니다. – OmisNomis