3

これがばかげた質問であるが、これは初めての場合は申し訳ありませんが、いくつかのことを理解するためにいくつかの助けが必要です。現在、mysqlを5.1にアップグレードしているので、mysqlでパーティションを使用できます。私の質問は、テーブルをパーティション化する場合、プルーニングプロセスを含むパーティション化されたテーブルは、結合を使用したクワイアリングで引き続き機能しますか、それとも、パーティションを持つテーブルをクワイアリングするだけの場合、パーティション化は最適ですか?

編集

クエリの例を次に示します。

SELECT event.*,site.* FROM event INNER JOIN site ON event.siteid = site.id
WHERE event.eventdate >= [somedate] AND event.eventdate <= [somedate]
AND event.siteid = [siteid]

そして、eventdateフィールドを使用してeventsテーブルにパーティションを設定しています。mysqlは、プルーニングプロセスを含め、イベントテーブルのパーティションを引き続き使用できますか?

4

2 に答える 2

3

分割されたテーブルは結合で使用できます。

where最高のパフォーマンスを得るには、句を微調整して1 つのパーティションのみを含めます。
たとえば、年ごとに分割する場合は、次のように結合できます。

select * from a
inner join partioned_table p on (p.id = a.id)
where p.year = '2011';

このクエリは、where 句の有無にかかわらず機能しますが、where 句を使用すると、アクセスするパーティションが 1 つだけになるため、はるかに高速になります。
より多くのパーティションにアクセスする場合、MySQL は、結合を行う前に一時テーブルを使用してパーティションをつなぎ合わせる必要があります。
この種のものは、パーティションの目的を無効にします。

于 2011-06-22T17:12:17.870 に答える
0

質問をよく理解しているかどうかはわかりませんが、パーティショニングは結合の動作に影響を与えるべきではありません。データの保存方法に影響するだけです。MySQL エンジンはデータを取得する場所を把握するように処理するため、実際には結合をそのままにしておく必要があります。次に例を示します。

CREATE TABLE members (
    firstname VARCHAR(25) NOT NULL,
    lastname VARCHAR(25) NOT NULL,
    username VARCHAR(16) NOT NULL,
    email VARCHAR(35),
    joined DATE NOT NULL
)
PARTITION BY RANGE( YEAR(joined) ) (
    PARTITION p0 VALUES LESS THAN (1960),
    PARTITION p1 VALUES LESS THAN (1970),
    PARTITION p2 VALUES LESS THAN (1980),
    PARTITION p3 VALUES LESS THAN (1990),
    PARTITION p4 VALUES LESS THAN MAXVALUE
);

select a.* 
from members a, subscriptions b 
where a.email = b.email and b.generation='X' 
  and a.joined between '1980-01-01' and now()

それが理にかなっているかどうか教えてください!マルセロ

于 2011-06-22T17:26:43.843 に答える