2

次のような日付列の月で分割された MySQL テーブルを作成しました。

CREATE TABLE `my_big_table` (
  `some_id` varchar(60) COLLATE utf8_unicode_ci NOT NULL,
  `some_value` varchar(256) COLLATE utf8_unicode_ci NOT NULL,
  `some_other_value` varchar(256) COLLATE utf8_unicode_ci NOT NULL,
  `time` datetime NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
PARTITION BY LIST(MONTH(time))
(PARTITION p1 VALUES IN (1) ENGINE = MyISAM,
 PARTITION p2 VALUES IN (2) ENGINE = MyISAM,
 PARTITION p3 VALUES IN (3) ENGINE = MyISAM,
 PARTITION p4 VALUES IN (4) ENGINE = MyISAM,
 PARTITION p5 VALUES IN (5) ENGINE = MyISAM,
 PARTITION p6 VALUES IN (6) ENGINE = MyISAM,
 PARTITION p7 VALUES IN (7) ENGINE = MyISAM,
 PARTITION p8 VALUES IN (8) ENGINE = MyISAM,
 PARTITION p9 VALUES IN (9) ENGINE = MyISAM,
 PARTITION p10 VALUES IN (10) ENGINE = MyISAM,
 PARTITION p11 VALUES IN (11) ENGINE = MyISAM,
 PARTITION p12 VALUES IN (12) ENGINE = MyISAM)

今、私が走るとき

explain partitions select * from my_big_table where month(time) = 2 limit 10;

私は出力として得ます:

id  select_type table       partitions              type    possible_keys   key key_len ref rows        Extra
1   SIMPLE      my_big_table    p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12  ALL NULL        NULL    NULL    NULL    10762868    "Using where"

どうやらすべてのパーティションが読み取られているようですが、その理由は不思議です。エンジンは、一致する値がパーティションp2でのみ見つかることを理解するのに十分賢くあるべきではありませんか? 次のような日付ベースのクエリでも同じ出力が得られます

explain partitions select * from my_big_table where date(time) = '2013-02-01' limit 10;

手がかりはありますか?

乾杯、アレックス

4

3 に答える 3

1

OK、さらにグーグルで試行錯誤
した後、クエリのwhere句の月(...)または日付(...)ステートメントに問題があるようです。クエリ

explain partitions select * from my_big_table where time = '2013-02-01 00:00:00' limit 10;

期待どおりにパーティションp2のみをスキャンします。したがって、パーティション列の生の値が where 句の一部である場合にのみ、パーティションのプルーニングが機能するようです。

乾杯、アレックス

于 2013-04-02T16:18:13.343 に答える
0

テーブル値に対して関数を使用しないでくださいmonth(time) = 2。MySQL は常に、そのようなクエリですべての値を調査します (つまり、フル テーブル スキャン)。

通常、この種の「問題」は、使用されていないインデックスに関連していますが、パーティションのプルーニングについても同じことが言えます。

于 2014-04-30T18:49:03.033 に答える