2010-12-17 18 views
-1

私は、2つの符号なしintフィールド、例えばf1とf2からなるMySQL MYISAMテーブル(例えばtbl)を持っています。 f2には索引があり、表は非常に大きい(約320,000,000+行)。私はこのテーブルを定期的に更新し(週に約100,000の新しい行を持つ)、ORDER BYを実行せずにこのテーブルを検索できるようにするために(リアルタイムクエリでは時間がかかります)、テーブルを物理的にORDERします私はその行を取得する方法に応じて。MySQL ALTER TABLE ORDER BY f1 DESC - SELECTクエリをブロックしますか?

したがって、私はALTER TABLE tbl ORDER BY f1 DESCを実行します。 (私はテーブルのコピーのための十分な物理的なスペースがサーバー上にあることを知っています)。この操作中に一時テーブルが作成され、SELECTステートメントは現在の行に影響を与えません。

しかし、私はこれが当てはまらず、ALTERテーブルで同時に発生するテーブルのSELECTステートメントがブロックされて終了しないことを経験しました。 ALTER TABLE tblが完了すると(実動サーバー上で約40分)、tblのSELECTステートメントは再び正常に実行されます。

"ALTER table tbl ORDER BY f1 DESC"が他のクライアントからtblを照会できないような理由はありますか?

答えて

0

テーブルを変更すると、常にテーブルがロックされ、SELECTが実行されなくなります。

私はあなたがALTER TABLEでそれを行うことができるかどうか分からなかったことを私は管理します。

テーブルから何を得ようとしていますか?たとえば、指定された範囲内のすべてのレコード? 3億2千万の行は簡単な数字ではありません。私はあなたに私の腸の反応を与えるでしょう:

  1. のInnoDBへの切り替えは
  2. パーティションテーブルは、(それがわずか数のように振る舞う作る(#2が、また取引を与えるが、#2は、性能を損なうことなしにできます)
  3. "ワーキングセット"テーブルと "履歴"テーブルを持つなど、基本的に手動でパーティションを変更するなどの再設計を検討してください。通常、最近挿入されたデータを検索する場合は、これを(パーティション化とともに)大いに役立ちます。あなたのルックアップが均等に分散されている場合、これはおそらく違いはありません。
  4. 私はあなたが保存しているかわからないので

をあなたが選択を絞る(その代わりの日付に検索、日付と顧客IDで検索)するために組み合わせて使用​​することができ、新しい列を追加することを検討し、これらのうちのいくつか(#4など)は適用されない場合があります。

他にもいくつか試してみることができます。 OPTIMIZE TABLEは時間がかかりますが、それは疑問です。内部的には少なくともInnoDB側でダンプ/リロードとして実装されていると思います。

+0

ご意見ありがとうございます。 InnoDBパーティショニングについて詳しく説明します。 – Tim

関連する問題