19

datetime 列で mysql テーブルを分割したいと考えています。ある日パーティション。テーブル作成スクリプトは次のようになります。

CREATE TABLE raw_log_2011_4 (
  id bigint(20) NOT NULL AUTO_INCREMENT,
  logid char(16) NOT NULL,
  tid char(16) NOT NULL,
  reporterip char(46) DEFAULT NULL,
  ftime datetime DEFAULT NULL,
  KEY id (id)
) ENGINE=InnoDB AUTO_INCREMENT=286802795 DEFAULT CHARSET=utf8
PARTITION BY hash (day(ftime)) partitions 31;

しかし、ある日のデータを選択すると、パーティションが見つかりませんでした。選択ステートメントは次のようになります。

explain partitions select * from raw_log_2011_4 where day(ftime) = 30;

別のステートメントを使用すると、パーティションを見つけることができましたが、ある日のデータを選択できませんでした。

explain partitions select * from raw_log_2011_4 where ftime = '2011-03-30';

ある日のデータを選択してパーティションを利用する方法を教えてくれる人はいますか?ありがとう!

4

4 に答える 4

11

こんにちは、テーブルの定義で間違ったパーティションを実行しています。テーブルの定義は次のようになります。

CREATE TABLE raw_log_2011_4 (
  id bigint(20) NOT NULL AUTO_INCREMENT,
  logid char(16) NOT NULL,
  tid char(16) NOT NULL,
  reporterip char(46) DEFAULT NULL,
  ftime datetime DEFAULT NULL,
  KEY id (id)
) ENGINE=InnoDB AUTO_INCREMENT=286802795 DEFAULT CHARSET=utf8
PARTITION BY hash (TO_DAYS(ftime)) partitions 31;

そして、選択コマンドは次のようになります。

explain partitions 
    select * from raw_log_2011_4 where TO_DAYS(ftime) = '2011-03-30';

上記のコマンドは、TO_DAYS コマンドを次のように使用する場合と同様に、必要なすべての日付を選択します。

mysql> SELECT TO_DAYS(950501);
        -> 728779
mysql> SELECT TO_DAYS('2007-10-07');
        -> 733321

TO_DAYS AS を使用する理由 MySQL オプティマイザは、パーティションのプルーニングのために 2 つの日付ベースの関数を認識します: 1.TO_DAYS() 2.YEAR()

これで問題が解決します..

于 2011-05-28T18:39:12.093 に答える
2

私は最近、これに関連する MySQL ブログ投稿をhttp://dev.mysql.com/tech-resources/articles/mysql_55_partitioning.htmlで読みました。

5.1 より前のバージョンでは、日付に基づいてパーティショニングを行うために特別な体操が必要でした。上記のリンクでは、それについて説明し、例を示しています。

バージョン 5.5 以降では、日付や文字列などの数値以外の値を使用して直接パーティション分割を行うことができました。

于 2011-10-25T21:40:12.583 に答える