2016-04-02 8 views
1

私は、その過程で大量のデータを持つウェブサイトを運営してきました。数百万行のMySQLロックテーブル

ユーザーの保存、サーバーへのIP、ID、日付などのデータと、それは、MySQLデータベースに格納されます。各エントリは、テーブル内の単一の行として格納されます。

今のテーブル内の約24万行がある

問題1:

物事は全表スキャンがあまりにも多くの分かかることがありますが、私はすでにテーブルをインデックス化など、今遅くなっています。

問題2:

ユーザーがテーブルから選択データを引っ張っている場合(テーブルがロックされているとして)クエリが完了するまで、それは潜在的にサイトへのアクセスを他のすべてのユーザーをブロックすることができます。

我々サーバ

  • 32 GBのRAM
  • 12コアスレッドCPU 24と
  • テーブル用のMyISAMエンジン

SELECT SUM(impresn)、SUMを(EXPLAIN rae)、SUM(reve)、date FROM publisher_ads_hits '2015-05-01 'と日付DESC BY日付ORDER BY「2016年4月2日」ANDユーザーID =「168」グループ

+1

テーブルをSELECT文でブロックされていない上、インデックスを追加し、ライブシステム

  • に超える6-12monthsデータを保持いけない:いくつかの提案があります。おそらく更新/挿入について。インデックスは、実行するクエリに応じて使用されます。ただインデックスを投げ込まないでください。 –

  • +4

    インデックスとクエリを持つテーブル構造を提供してください。エンジンをinnodbに変更してください。 –

    +0

    実行 '選択説明...'私はそれを追加し、上記インデックスは誰がデータを取得するときに選択クエリの条件が、問題はすべてのサイトの平均HTMLページもそのロックである。ここで、iは、すでに使用し、返信用 –

    答えて

    1

    オーバーCOMPOSITE INDEXを持つことに役立ちますで複数のフィールドを使用するのであれば、クエリはインデックスを使用しません。複合インデックス(userid、date)を追加してみてください。
    多くの更新および削除操作がある場合は、エンジンをINNODBに変更してください。

    2

    ロックあなたはすべて選択がブロックされているMyISAMテーブルに書き込む場合@Max Pからコメントします。テーブルロックのみがあります。 InnoDBを使用する場合は、必要なROWだけをロックするROWロックがあります。また、クエリの説明も表示します。それで、新しいものを作る必要があるかもしれません。 MySQLはクエリごとに1つのインデックスしか扱えません。あなたが説明することにより、WHERE条件は、この分野

    +0

    感謝を説明 –

    0

    基本的な問題は、フルテーブルスキャンです。日付に基づいて

    • パーティションテーブルとのuser_id
    関連する問題