2016-04-18 12 views
0

私のmysqlデータベーステーブルでいくつかの問題が発生しました。私はdate_insertedを含む5分、10分ごとに200行を挿入するスクリプトがあり、いくつかの結合(4つの結合など)に基づいて挿入された最後のレコードを示すクエリがあります。表には、このようなものです:mysql大きなテーブルを構成する

table : id, location, int_id, in, out, steps, date_added

と私はこの

... 
join (
    select a.location, a.int_id, a.in, a.out, a .date_added 
    from table a 
    join (
     select location, int_id, max(date_added) as `date_added` 
     from table 
     group by location, int_id 
     ) b on b.location = a.location 
      and b.int_id = a.int_id 
      and b.date_added = a.date_added 
) c on c.location like concat('%', b.location_name, '%') 
    and c.int_id = b.interface_id 
... 

と、このテーブルがあまりにも10 milionを育つなどのように参加してきた、100 milionクエリが遅い実行されます記録します遅いです。

このテーブルのサイズを小さくする最適な方法は何ですか?私はパーティションを読んだが、もしそれがわからないなら、私のための最善の解決策だ?または?

毎月新しいデータベースまたはテーブルを作成することはありますか?

私は、100万のレコードを増やしてテーブルに加わることをやめたくありません。

大変ありがとうございますが、私はこれをどのようにスケールアップするかを理解できません。

UPDATE 1

id : int primary key auto_increment , location varchar, int_id int, in bigint, out bigint, steps varchar, date_added timestamp

私は5分ごとに場所がインタフェースIDと内と外(そのalwas増加のためのいくつかのBIGINTカウンターに名前を付けるが、私はそれをリセットすることができ、データベースに保存したログサーバーを持っています)の挿入日が正しい。 最新の日付にこのカウンタを表示するためにリアルタイムでレポートを行っています(グループをリセットする場合は0から開始し、グループの場合は最大値を使用できません)

問題は次のとおりです。半年ほどのこのテーブルは、このリアルタイムレポートがテーブルの行数の影響を受けるほど大きくなります。レポートのスピードが制限されたテーブルを維持するために、それらを分割する最善の方法は何ですか。私は日/週/月の詳細なレポートを作成するので、古いカウンターを削除したくないのですが、1つのテーブルに100万のレコードを保存したくありません。私は毎月のデータベースを作成し、1ヶ月間レコードをデータベース2016_04_report、2016_05_reportなどに挿入することを考えていました。

+1

最後の挿入タイムスタンプであればキャッシュテーブルを保存してそこにタイムスタンプを保存してください。 – ash

+0

キャッシュテーブル?どうやって ?私はそれぞれのカウンター(インとアウト)が必要なので、私はそれらをリセットすることができますので、私はその場所の最後の挿入時に0を必要とするので、inferface_id – 123onetwothree

+0

あなたはあなたが何であるかを説明すれば達成しようとしているデータ、格納しているデータ、その理由は何ですか?その後、分かりにくいので、私たちはあなたを助けようとします。また、解決したことが分かっていれば、より簡単な解決策が存在する可能性があります。 – ash

答えて

0

パフォーマンスを向上させるためには、on c.location like concat('%', b.location_name, '%')を避けてください。

クエリはテーブル全体を検索しますか?そうであれば、最終的にIOバインドされ、パフォーマンスの希望はありません。

新しいデータを毎日(または他の時間間隔で)集計することができます。これにより、大きなテーブルを見逃すことはできますか?

INDEX(location, int_id, date_added) 

この順にいくつか役立ちます。

SHOW CREATE TABLEを入力してください。あなたが提供したものは、あまりにも多くの詳細を残しましたまた、全体のクエリを提供します。それらを使って、私はPARTITIONingにコメントしているかもしれません。 (パーティション化が役立つことはほとんどありません。)

関連する問題