2012-03-04 25 views
0

私は、選択肢のために最適化したい大きな割合(約25M行/日)で成長する統計表を持っており、サーバには余分なメモリがあります(32G、テーブルは4Gです)。大規模なテーブル(75M +行)のシンプルなmysqlの選択を最適化する

私のシンプルなロールアップクエリは次のとおりです。

EXPLAIN select FROM_UNIXTIME(FLOOR(endtime/3600)*3600) as ts,sum(numevent1) as success , sum(numevent2) as failure from stats where endtime > UNIX_TIMESTAMP()-3600*96 group by ts order by ts; 
+----+-------------+--------------+------+---------------+------+---------+------+----------+----------------------------------------------+ 
| id | select_type | table  | type | possible_keys | key | key_len | ref | rows  | Extra          | 
+----+-------------+--------------+------+---------------+------+---------+------+----------+----------------------------------------------+ 
| 1 | SIMPLE  | stats  | ALL | ts   | NULL | NULL | NULL | 78238584 | Using where; Using temporary; Using filesort | 
+----+-------------+--------------+------+---------------+------+---------+------+----------+----------------------------------------------+ 

統計のInnoDBテーブルで、私はこれをどのように最適化する必要があります。..終了時刻の通常のインデックスがありますか?

注:私はロールアップテーブルの追加を計画していますが、現在のところ私はこれに固執しています。追加のアプリケーションコードなしで修正できるかどうかは疑問です。

+0

あなたはどのような方法でファイルを削除しようとしましたか?注文を削除しようとしましたか?あなたは十分なメモリを使用するように設定されているかどうかを確認するためにあなたのサーバー構成を調べてみましたか? – imm

+0

MySqlの計算フィールドでインデックスが動作するとは思いません - それらを置き換える方法はありますか? – fatfrog

+0

これは、このクエリが達成しようとしていることを説明できる場合に役立ちます。 3600で除算して乗算することは冗長なようです。グループでは、時間を追加して並べ替えます。あなたは、時間のトンを追加するインデックス化されていない値で注文しています。注文する必要がある場合は、エンドタイムフィールドで注文し、インデックスに登録されていることを確認してください。 – Cfreak

答えて

1

私はローカルテストを行っています。次のことを試してみてください。

alter table stats add index (endtime, numevent1, numevent2); 

そして、それはgroup byで暗黙的であるべきとorder byを削除する(私はパーサはただ、この場合にorder byを無視しますが、念の推測:)

+0

これは、問合せ時間を10分の1(同じ問合せを実行するために3分)に削減します。その他のヒント? –

+0

ニース:)いいえ、私は考えることができません –

0

使用しているので、 InnoDBはあなたも試すことができ、次の

a)は24ギガバイト(に変更innodb_buffer_pool_size)は、サーバの再起動が必要です - あなたのテーブル全体がメモリにロードすることができるようになりますので、テーブルが大きく成長したとしても、ソートスピードアップれる

b)innodb_file_per_tableを追加すると、InnoDBはそれぞれの新しいテーブルスペースを独自のテーブルに配置します。既存のテーブルを削除して再作成する必要があります。

c)データに適合する最小の使用可能な列サイズを使用します。実際の列定義とサンプルを見ることなく、私は具体的なアイディアを提供することはできません。あなたはサンプルのスキーマとおそらく5行のデータを提供できますか

関連する問題