What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015
1. What's New inWhat's New in
MySQL 5.7 OptimizerMySQL 5.7 Optimizer
奥野 幹也
Twitter: @nippondanji
mikiya (dot) okuno (at) gmail (dot) com
@MySQL User Conference Tokyo 2015
6. オプティマイザの新機能!!
● EXPLAIN for CONNECTION
●
JSON EXPLAIN
● コストモデル
– JOIN の順序選択
– 統計情報の正確性
– コストの係数のユーザーによる設定
● GROUP BY
●
FROM 句のサブクエリ
● IN サブクエリ
●
UNION ALL
● ソート
● テンポラリテーブル
24. サンプル
mysql> alter table City add index (district);
Query OK, 0 rows affected (0.07 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table City add index (name);
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> select index_name, cardinality from
information_schema.statistics where table_name = 'City' and
index_name in ('District', 'Name')G
*************************** 1. row ***************************
index_name: District
cardinality: 4188
*************************** 2. row ***************************
index_name: Name
cardinality: 4188
2 rows in set (0.00 sec)
25. サンプル : MySQL 5.6
mysql> explain extended select * from City inner join Country on
Country.name = City.name and Country.name = City.districtG
*************************** 1. row ***************************
... 略 ...
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: City
type: ref
possible_keys: District,Name
key: District
key_len: 20
ref: world.Country.Name
rows: 1
filtered: 100.00
Extra: Using index condition; Using where
2 rows in set, 1 warning (0.00 sec)
26. サンプル : MySQL 5.7
mysql> explain extended select * from City inner join Country on
Country.name = City.name and Country.name = City.districtG
*************************** 1. row ***************************
... 略 ...
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: City
partitions: NULL
type: ref
possible_keys: Name,District
key: Name
key_len: 35
ref: world.Country.Name
rows: 1
filtered: 10.00
Extra: Using index condition; Using where
2 rows in set, 2 warnings (0.00 sec)
27. サンプル
mysql> set optimizer_trace='enabled=on';
Query OK, 0 rows affected (0.00 sec)
mysql> select * from City inner join Country on
Country.name = City.name and Country.name =
City.district;
mysql> select * from
information_schema.optimizer_traceG
36. オプティマイザの実行計画を
細かく制御
● クエリ単位でアルゴリズムの ON/OFF が指定できる
● /*+ ... */ で囲った中にヒントを記述する
● テーブルごと、クエリブロックごとにヒントを指定可能
– optimizer_switch は常にクエリ全体
● 例
– select /*+ BKA(City) */ * from City join
Country on Country.Code = City.CountryCode
where City.name like 'a%'
– select /*+ NO_RANGE_OPTIMIZATION(Country) */
Name from Country where Code like 'J%' union
all select Name from City where CountryCode
like 'I%'
– select Name from Country where Code in (select
/*+ SUBQUERY(MATERIALIZATION) */ CountryCode
from City where name like 'ab%')
38. ONLY_FULL_GROUP_BY
● MySQL 5.7 で
– ONLY_FULL_GROUP_BY という sql_mode がデフォルトになっ
た
– ONLY_FULL_GROUP_BY の挙動が変わった
●
問題となるクエリの例
– SELECT
Code, Name, AVG(GNP)
FROM Country GROUP BY Code;
● GROUP BY 句に含まれていないカラムが出現している!!
39. バージョンによる挙動の違い
● ONLY_FULL_GROUP_BY が有効でない場合は、 GROUP BY を実行する
ときに読んだ行のどれかの値が返される
– 結果は不定!! Non-deterministic !!
●
MySQL 5.6 では、 ONLY_FULL_GROUP_BY が有効な場合、 GROUP BY
句に含まれない、かつ集約関数でないカラムがある場合、エ
ラーになる
● MySQL 5.7 では、 ONLY_FULL_GROUP_BY が有効な場合(デフォル
ト)、 GROUP BY 句に含まれるカラムに関数従属しているカラムの
出現は許可され、それ以外はエラーになる
– ただし主キーやユニークキーによって FD が保証されている場
合のみ
42. サンプル: MySQL 5.6
> EXPLAIN SELECT Name FROM (SELECT Name FROM City WHERE Name LIKE 'a%') tG
*************************** 1. row ***************************
id: 1
select_type: PRIMARY
table: <derived2>
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 258
Extra: NULL
*************************** 2. row ***************************
id: 2
select_type: DERIVED
table: City
type: range
possible_keys: Name
key: Name
key_len: 35
ref: NULL
rows: 258
Extra: Using where; Using index
2 rows in set (0.01 sec)
43. サンプル: MySQL 5.7
mysql> EXPLAIN SELECT Name FROM (SELECT Name FROM City WHERE
Name LIKE 'a%') tG
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: City
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 4188
filtered: 11.11
Extra: Using where
1 row in set, 1 warning (0.00 sec)