2011-06-30 22 views
1

名前、日付、バージョン、値の4つの列を持つテーブルがあります。この4つのすべてに複合インデックスがあります。それは20Mの行を持っています:2.000の名前、名前あたり約1.000の日付、日付ごとに約10のバージョン。複数の列を連結したFast MAX、GROUP BY

私は、すべての名前に対して、最高の日付、その日付の最高のバージョン、および関連する値を与えるリストを取得しようとしています。

私が行うと

SELECT name, 
     MAX(date) 
    FROM table 
GROUP BY name 

は、私は良いパフォーマンスを得ると私はクエリが年齢を取る名あたりMAX(version)を取得するために、これにテーブルを結合するときに、データベースは、

しかし複合インデックスを使用しています。上記のSELECT文とほぼ同じ時間で結果を得る方法が必要ですか?私は簡単にインデックスを使用して行うことができます。

+0

は、あなたも、私たちにとても遅いですJOINのクエリを表示することができますか? – Flimzy

+0

"M"は100万を意味しますか?北アメリカ人の中には、他の国の書式設定のカンマの代わりにこの期間があることを知らない人もいます。 –

答えて

0

これを試してください(私は彼らのために頼む...それはMySQLのためのいくつかの構文の調整を必要と知っていると私はそれらを見つけるでしょう)

INSERT INTO #TempTable 
SELECT name, MAX(Date) as Date 
FROM table 
Group By name 

select table.name, table.date, max(table.version) as version 
from table 
inner join #TempTable on table.name = #temptable.name and table.date = #temptable.date 
group by table.name, table.date 
+0

ありがとう、私はそれを微調整して試しました。テンポラリテーブルの充填には0.06秒、第2のクエリには20秒かかります。基本的には、一時テーブルの代わりにサブクエリを使用しても同じパフォーマンスが得られます。 – Thijs

+0

更新:誤った(テスト)インデックスを使用していたことが判明しました。インデックスを削除して正しい複合インデックスを使用させ、クエリ時間を20秒から0.04秒に改善しました。 – Thijs

関連する問題