オプティマイザはパーティションプルーニングができます。つまり、入力のクエリーを分析し、ディクショナリ情報と比較し、必要なテーブルパーティションだけにアクセスさせることができます。
パーティショニングは、それが1つのテーブルの論理的な表現であり、一連のテーブルがその下にあるいう点で、ビューと似たように考えることができます。パーティショニングはインデックスを利用した上で、全てのクエリーが共通のパターンに従う場合に適しています。例えば、
パーティショニングの性能は、ほとんどのクエリーが1つあるいはごく一部のパーティションにしか一度にアクセスしない場合に最善となります。我々が例でみてきたスキーマで考えてみると、CountryLanguage
テーブルへの全てのクエリーが公用語のみに対して発行されるケースが該当するでしょう。もしこれが本当であれば、isOfficial
によるパーティショニングは次のように実現できます。
# IsOfficialはENUMですが、CHARに変換することができます
# ENUM型はKEYパーティショニングのみをサポートしています
# パーティショニングキーは主キーの一部であり、かつ全てユニークキーである必要があります
ALTER TABLE CountryLanguage MODIFY IsOfficial CHAR(1) NOT NULL DEFAULT 'F', DROP PRIMARY KEY, ADD PRIMARY KEY(CountryCode, Language, IsOfficial);
ALTER TABLE CountryLanguage PARTITION BY LIST COLUMNS (IsOfficial) (
PARTITION pUnofficial VALUES IN ('F'),
PARTITION pOfficial VALUES IN ('T')
);
EXPLAIN FORMAT=JSON
SELECT * FROM CountryLanguage WHERE isOfficial='T' AND CountryCode='CAN';
{
"query_block": {
"select_id": 1,
"cost_info": {
"query_cost": "2.40"
},
"table": {
"table_name": "CountryLanguage",
"partitions": [
"pOfficial" # 公用語が含まれるパーティションのみがアクセスされる
],
"access_type": "ref",
"possible_keys": [
"PRIMARY",
"CountryCode"
],
"key": "PRIMARY",
"used_key_parts": [
"CountryCode"
],
"key_length": "3",
"ref": [
"const"
],
"rows_examined_per_scan": 2,
"rows_produced_per_join": 0,
"filtered": "10.00",
"cost_info": {
"read_cost": "2.00",
"eval_cost": "0.04",
"prefix_cost": "2.40",
"data_read_per_join": "8"
},
"used_columns": [
"CountryCode",
"Language",
"IsOfficial",
"Percentage"
],
"attached_condition": "(`world`.`CountryLanguage`.`IsOfficial` = 'T')"
}
}
}
データウェアハウスにおいて、これはslowly changing dimensionsと呼ばれます。https://en.wikipedia.org/wiki/Slowly_changing_dimension ↩