1

背景

私は非常に大きなテーブルを持っています。テーブルはこのようなものです

CREATE TABLE tb_doc (
did mediumint(8) unsigned NOT NULL auto_increment, 
title varchar(80) NOT NULL default '',
...,
PRIMARY KEY  (did), 
KEY title (title)
) 
TYPE=MyISAM;

タイトルのタイプは varchar(80) です。ほとんどの場合、タイトルは '111111'、'2222222'、'44444444' のような純粋な数値文字列になりますが、'3a'、'a4 のような utf-8 文字列になる場合もあります' または「中国」 (漢字)。

私はすでに HASH (did) を使用してパーティションを実行しましたが、私の SELECT ステートメントは常に次のようになります

SELECT did, title,... FROM tb_doc WHERE title= '1111111';
SELECT did, title,... FROM tb_doc WHERE title= '2222222';

したがって、タイトルを使用してパーティションを実行したいのですが、これがより高速になることを願っています。ここで質問です。

実験

次のステートメントを使用しました。

PARTITION BY RANGE COLUMNS (title)(
PARTITION p00 VALUES LESS THAN (1),         # not pure number strings
PARTITION p01 VALUES LESS THAN (500000),    # pure number strings from 1 to 500k
PARTITION p02 VALUES LESS THAN (1000000),   # pure number strings from 500k to 1000k
PARTITION p03 VALUES LESS THAN (1500000),   # pure number strings from 1000k to 1500k
..........                                  # ......    

PARTITION pn VALUES LESS THAN (25000000),   # the biggest number now
)
;

類似の質問

次の 2 つの Q&A を読み まし

質問

  1. タイトルを使用してパーティションを実行する方が良いですよね?
  2. 「utf-8」RANGE の例を教えてください。'500000'、'1000000' などと試してみましたが、うまくいきません。
  3. SELECT xxx from tb_doc WHERE title='12345' を使用すると、MySQL はパーティション 1 からのみデータを取得しますか?
  4. このテーブルは最大 50 GB ですが、最適なパーティション数はいくつですか?

前もって感謝します。

4

2 に答える 2

1

VARCHAR複数の言語の文字を適切に保存すると問題が発生することに注意してくださいNVARCHAR

HASH パーティショニングは、負荷をパーティションに均等に分散するために使用されます。まず、人間にとって意味のあるもの (Where 句に頻繁に現れる列) でパーティション分割し、次にできるだけ多くのコアを同時に利用するために HASH サブパーティション分割を行う必要があります。したがって、この場合の HASH サブパーティションの数は <= コアなしになります。

列にクラスター化インデックスを作成することをお勧めしtitleます。これにより、クエリが高速化されます。

そして、あなたの質問に関連して:

  1. 必ずしもそうではありません。パーティション分割ではなく、クラスター化されたインデックスにより、クエリが高速化されます。パーティショニングを使用してテーブルを管理します。多くの行をすばやく削除します。クエリの大部分が (1 行だけでなく) 多くの行を検索する場合、または列でtitleはないUNIQUE場合は、パーティションを検討してください。

  2. UTF-8 パーティション境界の例として、次のように言います。less then ('c')

  3. パーティショニングの定義方法に応じて、1 つ、複数、またはすべてのパーティションにヒットする可能性があります。

  4. 多くのパーティションを持つことによるペナルティはありませんが、MySQL 5.5+ のテーブルは最大 1024 個のパーティションとサブパーティションを持つことができます。

文字列値で分割する場合は、次のように使用KEY PARTITIONINGします: 18.2.5. キーのパーティショニング

例:

CREATE TABLE tm1 (
    s1 CHAR(32) PRIMARY KEY
)
PARTITION BY KEY(s1)
PARTITIONS 10;

最初に、アルファベット (または表に表示されると予想されるすべてのアルファベット) の文字と同じ数のパーティションを設定します。

于 2013-05-29T11:42:12.757 に答える
0

で分割しtitleても高速化しない

SELECT did, title,... FROM tb_doc WHERE title= '1111111';

PARTITIONing の制限の詳細と、PARTITIONing が役立ついくつかの使用例については、私のブログを参照してください。

于 2015-11-26T06:27:22.130 に答える