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

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

序文

パーティション フィールドは主キーの一部でなければならないことは誰もが知っています。では、複合主キーを作成した後、パーティション フィールドに別のインデックスを追加する必要がありますか?効果はありますか?検証してみましょう。早速、詳しい紹介を見ていきましょう。

1. 新しいテーブル effect_new を作成します (作成時間に基づいて月ごとにパーティション化されます)

テーブル `effect_new` を作成します (
 `id` bigint(20) NOT NULL AUTO_INCREMENT,
 `type` tinyint(4) NOT NULL デフォルト '0',
 `timezone` varchar(10) デフォルト NULL,
 `date` varchar(10) NOT NULL,
 `hour` varchar(2) デフォルト NULL,
 `position` varchar(200) デフォルト NULL,
 `country` varchar(32) NOT NULL,
 `create_time` 日時 NOT NULL デフォルト '1970-01-01 00:00:00',
 主キー (`id`,`create_time`)、
 キー `index_date_hour_country` (`date`,`hour`,`country`)
) ENGINE=InnoDB AUTO_INCREMENT=983041 デフォルトCHARSET=utf8
範囲によるパーティション分割 (TO_DAYS (`create_time`))
(パーティション p0 の値が (736754) 未満です) エンジン = InnoDB、
 パーティション p1 の値が (736785) 未満です。エンジン = InnoDB、
 パーティション p2 の値が (736815) 未満です。エンジン = InnoDB、
 パーティション p3 の値が (736846) 未満です。エンジン = InnoDB、
 パーティション p4 の値が (736876) 未満です。エンジン = InnoDB、
 パーティション p5 の値が (736907) 未満です。エンジン = InnoDB、
 パーティション p6 値が (736938) 未満です。エンジン = InnoDB、
 パーティション p7 の値が (736968) 未満です。エンジン = InnoDB、
 パーティション p8 値が (736999) 未満 エンジン = InnoDB、
 パーティション p9 値が (737029) 未満です。エンジン = InnoDB、
 パーティション p10 の値が (737060) 未満です。エンジン = InnoDB);

2. データを挿入します。

`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') に INSERT INTO します。

3. ステートメントを分析する

パーティションの説明
effect_new_indexから*を選択
ここで、create_time = '2017-10-14 12:00:00'

結果は次のとおりです。

id選択タイプテーブルパーティションタイプ可能なキーキーの長さ参照フィルター余分な
1単純効果_新規8ページ全てヌルヌルヌルヌル391515 10 where の使用

4. テーブルeffect_newにインデックスidx_ctimeを追加します。

5. インデックスを追加した後の実行プランを分析する

結果は次のとおりです。

id選択タイプテーブルパーティションタイプ可能なキーキーの長さ参照フィルター余分な
1単純効果_新規8ページ参照idx_ctime idx_ctime 5定数60760 100ヌル

6. 結論:

テーブルはこのフィールドによってパーティション分割されますが、これはインデックスと同等ではありません。パーティション分割後、フィールドに特定の値を持つレコードが特定のパーティションに含まれることしか言えませんが、それはインデックスではないため、それらを見つけるのに時間がかかります。

場合によっては、主キーがパーティション列と等しくないことがあります。主キーにクラスター化インデックスを作成する場合は、パーティション列を含めて複合主キーにする必要があります。では、この場合、パーティション基準列にはインデックスがないのでしょうか?はい、しかし、十分な速度ではありません。パーティション列がこの複合インデックスで最初にランクされていない場合、十分な速度ではありません。パーティション列が検索ステートメントのフィルタリング条件として頻繁に使用される場合は、パーティション列用の追加インデックスを作成する必要があります。

要約する

上記はこの記事の全内容です。この記事にはまだ多くの欠点があります。この記事の内容が皆様の勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問がある場合は、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。

以下もご興味があるかもしれません:
  • MySQL の高度な機能 - データ テーブル パーティショニングの概念とメカニズムの詳細な説明
  • MySql テーブル、データベース、シャーディング、パーティショニングの知識の詳細な説明
  • MySql テーブル、データベース、シャーディング、パーティショニングの知識ポイントの紹介
  • MySQLテーブルシャーディングとパーティショニングの具体的な実装方法
  • Navicat による MySQL パーティショニングの実践
  • MySQL パーティションテーブルの正しい使用方法
  • MySQL 最適化 Zabbix パーティション最適化
  • MySQL データベース テーブルのパーティション分割に関する考慮事項 [推奨]
  • MySQL データ テーブル パーティション テクノロジーの簡単な分析
  • MySQL データテーブルのパーティション戦略と利点と欠点の分析

<<:  VMware WorkStation 14 pro インストール Ubuntu 17.04 チュートリアル

>>:  VMware での Ubuntu と Windows 間のファイル共有

推薦する

MySql テーブル、データベース、シャーディング、パーティショニングの知識の詳細な説明

1. はじめにデータベース内のデータ量が一定レベルに達すると、システムパフォーマンスのボトルネックを...

Linux 3.X/4.x/5.x でパゴダ パネルのパスワードを忘れた場合の解決方法

ssh に入り、次のコマンドを入力してパスワードをリセットします (コマンドの末尾の「testpas...

仮想マシンに Windows Server 2008 オペレーティング システムをインストールする

この記事では、Windows Server オペレーティング システムのインストールと企業でのそのア...

MySQL で削除されたレコードが有効にならない理由のトラブルシューティング

オンライン MySQL トランザクションの問題の記録先週の金曜日、大きなテーブルを削除する操作を実行...

Oracle10パーティションとMySQLパーティションの違いの詳細な説明

一般的に使用される Oracle10g パーティションは、範囲 (範囲パーティション)、リスト (リ...

node.jsのインストールとHbuilderXの設定の詳細な説明

npm インストールチュートリアル: 1. Node.jsインストールパッケージをダウンロードする公...

Windows 10 で MySQL 8.0.12 の解凍バージョンをインストールして構成する方法 (グラフィック チュートリアル付き)

この記事では、MySQL 8.0.12 の解凍版のインストールと設定方法を記録し、皆様と共有します。...

MySQLのexplain型の詳細な説明

導入:多くの場合、さまざまな選択ステートメントを使用して必要なデータを照会した後、多くの人は作業が正...

js、css、htmlはブラウザのさまざまなバージョンを決定します

正規表現を使用してIEブラウザのバージョンを判別するIEブラウザかどうか確認するif (docume...

Vueを使用して天気コンポーネントをロードする方法の詳細な説明

この記事では、Vueを使用して天気コンポーネントをロードする方法を参考までに紹介します。具体的な内容...

上部の固定divは半透明効果に設定できます

コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...

chkconfig および systemctl コマンドを使用して Linux サービスを有効または無効にする方法

これは Linux 管理者にとって重要な (そして素晴らしい) トピックなので、誰もが Linux ...

MySql8.0バージョンに接続するMyBatisの設定問題について

mybatis を学習しているときにエラーが発生しました。エラーの内容は次のとおりです。データベース...

CSS最適化スキルの自己実践体験

1. CSS スプライトを使用します。利点は、CSS で使用される小さな画像を 1 つの大きな画像に...