パーティション フィールドが主キーの一部である必要があることは誰もが知っています。では、複合主キーを作成した後、パーティション フィールドに別のインデックスを追加する必要がありますか?効果はあるのでしょうか?この記事では、主に、MySQL パーティション フィールド列に別のインデックスを作成する必要があるかどうかに関する関連情報を紹介します。この記事は、例を通じて検証されており、必要なすべての友人が理解して学習できるよう、一定の参考学習価値があります。小 一緒に学びましょう。
1. 新しいテーブルeffect_newを作成します(作成時間に基づいて月ごとに分割されます)
CREATE TABLE `effect_new` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `type` tinyint(4) NOT NULL DEFAULT '0', `timezone` varchar(10) DEFAULT NULL, `date` varchar(10) NOT NULL, `hour` varchar(2) DEFAULT NULL, `position` varchar(200) DEFAULT NULL, `country` varchar(32) NOT NULL, `create_time` datetime NOT NULL DEFAULT '1970-01-01 00:00:00', PRIMARY KEY (`id`,`create_time`), KEY `index_date_hour_coun` (`date`,`hour`,`country`) ) ENGINE=InnoDB AUTO_INCREMENT=983041 DEFAULT CHARSET=utf8 PARTITION BY RANGE (TO_DAYS (`create_time`)) (PARTITION p0 VALUES LESS THAN (736754) ENGINE = InnoDB, PARTITION p1 VALUES LESS THAN (736785) ENGINE = InnoDB, PARTITION p2 VALUES LESS THAN (736815) ENGINE = InnoDB, PARTITION p3 VALUES LESS THAN (736846) ENGINE = InnoDB, PARTITION p4 VALUES LESS THAN (736876) ENGINE = InnoDB, PARTITION p5 VALUES LESS THAN (736907) ENGINE = InnoDB, PARTITION p6 VALUES LESS THAN (736938) ENGINE = InnoDB, PARTITION p7 VALUES LESS THAN (736968) ENGINE = InnoDB, PARTITION p8 VALUES LESS THAN (736999) ENGINE = InnoDB, PARTITION p9 VALUES LESS THAN (737029) ENGINE = InnoDB, PARTITION p10 VALUES LESS THAN (737060) ENGINE = InnoDB);
2. いくつかのデータを挿入します
3.
INSERT INTO `effect_new` (`id`, `type`, `timezone`, `date`, `hour`, `position`, `country`, `create_time`) VALUES ('1', '0', 'GMT+8', '2017-07-01', '', 'M-NotiCleanFull-FamilyRecom-0026', '', '2017-07-02 00:07:02'); INSERT INTO `effect_new` (`id`, `type`, `timezone`, `date`, `hour`, `position`, `country`, `create_time`) VALUES ('2', '1', 'GMT+8', '2017-09-30', '23', 'Ma5dtJub', 'EG', '2017-10-01 00:00:00'); INSERT INTO `effect_new` (`id`, `type`, `timezone`, `date`, `hour`, `position`, `country`, `create_time`) VALUES ('3', '1', 'GMT+8', '2017-09-10', '10', '28', 'DZ', '2017-09-11 00:08:20'); INSERT INTO `effect_new` (`id`, `type`, `timezone`, `date`, `hour`, `position`, `country`, `create_time`) VALUES ('4', '1', 'GMT+8', '2017-02-03', '20', '32', 'AD', '2017-02-04 00:00:00'); INSERT INTO `effect_new` (`id`, `type`, `timezone`, `date`, `hour`, `position`, `country`, `create_time`) VALUES ('5', '0', 'GMT+8', '2017-03-05', '2', NULL, 'AI', '2017-03-06 02:10:00'); INSERT INTO `effect_new` (`id`, `type`, `timezone`, `date`, `hour`, `position`, `country`, `create_time`) VALUES ('6', '0', 'GMT+8', '2017-09-23', '13', 'M-BrandSplash-S-0038', 'AG', '2017-09-23 13:00:00'); INSERT INTO `effect_new` (`id`, `type`, `timezone`, `date`, `hour`, `position`, `country`, `create_time`) VALUES ('7', '1', NULL, '2017-10-13', '12', 'BB-Main-AppAd-0018', 'AF', '2017-10-14 12:00:00'); INSERT INTO `effect_new` (`id`, `type`, `timezone`, `date`, `hour`, `position`, `country`, `create_time`) VALUES ('8', '0', 'GMT+8', '2017-10-28', '2', 'M-ChargeReminder-S-0040', 'AE', '2017-10-29 00:00:00'); INSERT INTO `effect_new` (`id`, `type`, `timezone`, `date`, `hour`, `position`, `country`, `create_time`) VALUES ('9', '1', 'GMT+8', '2017-10-09', NULL, '30', 'AI', '2017-10-10 00:09:00'); INSERT INTO `effect_new` (`id`, `type`, `timezone`, `date`, `hour`, `position`, `country`, `create_time`) VALUES ('10', '0', 'GMT+8', '2017-10-05', '5', ' M-BrandSplash', 'LA', '2017-10-06 05:10:00');
結果は次のようになります: sible_keys
key
rows
1 | シンプル | effect_new | p8 | ALL | null | null | null | null | 3 91515 | 10 | |
4.テーブルにeffect_newを与え、インデックスidx_ctimeを追加します | 5. インデックスを追加した後に実行計画を分析します | 結果は次のようになります: | id | select_type | table | partitions |
possible_keys
key_len
ref
rows
1 | SIMPLE | effect_new | p8 | ref | idx_ctime | id x_ctime | 5 | const | 60760 | 100 | |
6. 結論: | テーブルはこのフィールドに基づいてパーティション化されていますが、これをインデックスと同等視することはできません。パーティション化後は、フィールドに特定の値を持つレコードが特定のパーティションに存在すると言えますが、これはインデックスではないため、見つけるのが困難になります。 | 場合によっては、主キーがパーティション化基準列と等しくない場合があります。このとき、主キーがクラスター化インデックスを構築したい場合は、それを複合主キーにするためにパーティション化基準列を含める必要があります。この場合、パーティション分割列にはインデックスがないのでしょうか?はい、ただし、パーティション化基準列がこの複合インデックスで最初にランク付けされていない場合、パーティション化基準列が検索ステートメントのフィルター条件として頻繁に使用される場合、十分な速度が得られません。パーティション化基準列に追加の列を追加するには、別のインデックスを作成します。 | 関連する推奨事項: | MYSQL のパーティション フィールドは主キー フィールドに含める必要があります_MySQL | さまざまな MySQL ストレージ エンジンとさまざまなパーティション フィールドがクエリに与える影響_MySQL | MySQL パーティション テーブル パーティションのオンライン変更 パーティション フィールド_MySQL |
以上がMySQL パーティション フィールド列に別のインデックスを作成する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。