MySQL パーティション フィールド列に別のインデックスを作成する必要がありますか?

小云云
リリース: 2017-12-08 10:55:25
オリジナル
2380 人が閲覧しました

パーティション フィールドが主キーの一部である必要があることは誰もが知っています。では、複合主キーを作成した後、パーティション フィールドに別のインデックスを追加する必要がありますか?効果はあるのでしょうか?この記事では、主に、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

key_len

ref


rows

フィルター済み追加1シンプルeffect_newp8ALLnullnullnullnull3 9151510 どこを使用するか5. インデックスを追加した後に実行計画を分析しますidselect_typetablepartitionstpye
4.テーブルにeffect_newを与え、インデックスidx_ctimeを追加します 結果は次のようになります:

possible_keys

key


key_len

ref

rows

filteredextra null 6. 結論: MYSQL のパーティション フィールドは主キー フィールドに含める必要があります_MySQLさまざまな MySQL ストレージ エンジンとさまざまなパーティション フィールドがクエリに与える影響_MySQLMySQL パーティション テーブル パーティションのオンライン変更 パーティション フィールド_MySQL
1 SIMPLE effect_new p8 ref idx_ctime id x_ctime 5 const 60760 100
テーブルはこのフィールドに基づいてパーティション化されていますが、これをインデックスと同等視することはできません。パーティション化後は、フィールドに特定の値を持つレコードが特定のパーティションに存在すると言えますが、これはインデックスではないため、見つけるのが困難になります。 場合によっては、主キーがパーティション化基準列と等しくない場合があります。このとき、主キーがクラスター化インデックスを構築したい場合は、それを複合主キーにするためにパーティション化基準列を含める必要があります。この場合、パーティション分割列にはインデックスがないのでしょうか?はい、ただし、パーティション化基準列がこの複合インデックスで最初にランク付けされていない場合、パーティション化基準列が検索ステートメントのフィルター条件として頻繁に使用される場合、十分な速度が得られません。パーティション化基準列に追加の列を追加するには、別のインデックスを作成します。 関連する推奨事項:

以上がMySQL パーティション フィールド列に別のインデックスを作成する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート