2017-01-15 4 views
0

現在、私は、各グループの最後のレコードを見つけるのに最も効率的な方法を見つけようとしています。EXPLAIN SELECTで使用されるテーブルがありません。

私が見つけた最も簡単な方法は、サブクエリを使用しますが、その中にFROM句を省略します

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

しかしEXPLAINは、サブクエリにNo tables usedを提供しています。

``` 
+------+--------------------+-------+------+---------------+------+---------+------+-----------+----------------------------------------------+ 
| 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        | 
+------+--------------------+-------+------+---------------+------+---------+------+-----------+----------------------------------------------+ 
``` 

唯一の他のオプションJOINSまたはFROM句のサブクエリを使用しています。どちらも両方のテーブルスキャンを2回行っているようです。ここで説明した方法に問題はありますか?

+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を使うことができないため、2つのテーブルスキャンを実行しています。これは、クエリを実際に非効率的かつ低速にしています。 – OmisNomis

+0

なぜ 'timestamp'にインデックスを追加しませんか?それは問題を解決することができます。 –

+0

インデックスがありますが、残念ながらまだ1時間以上かかります。最後の3日間の最後のレコードを検索するのを制限することで問題は解決しました。 サブクエリがあるため、Viewとして保存する際に問題が発生しました。 – OmisNomis

関連する問題