MySQL 5.
今回は、
STRAIGHT_JOIN
STRAIGHT_
たとえば、
mysql> EXPLAIN SELECT Country.Name as CountryName, City.Name AS City FROM City INNER JOIN Country ON City.CountryCode=Country.Code; +----+-------------+---------+------------+------+---------------+-------------+---------+--------------------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+---------+------------+------+---------------+-------------+---------+--------------------+------+----------+-------+ | 1 | SIMPLE | Country | NULL | ALL | PRIMARY | NULL | NULL | NULL | 239 | 100.00 | NULL | | 1 | SIMPLE | City | NULL | ref | CountryCode | CountryCode | 3 | world.Country.Code | 18 | 100.00 | NULL | +----+-------------+---------+------------+------+---------------+-------------+---------+--------------------+------+----------+-------+ 2 rows in set, 1 warning (0.00 sec)
これをSTRAIGHT_
mysql> EXPLAIN SELECT STRAIGHT_JOIN Country.Name as CountryName, City.Name AS City FROM City INNER JOIN Country ON City.CountryCode=Country.Code; +----+-------------+---------+------------+--------+---------------+---------+---------+------------------------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+---------+------------+--------+---------------+---------+---------+------------------------+------+----------+-------+ | 1 | SIMPLE | City | NULL | ALL | CountryCode | NULL | NULL | NULL | 4188 | 100.00 | NULL | | 1 | SIMPLE | Country | NULL | eq_ref | PRIMARY | PRIMARY | 3 | world.City.CountryCode | 1 | 100.00 | NULL | +----+-------------+---------+------------+--------+---------------+---------+---------+------------------------+------+----------+-------+ 2 rows in set, 1 warning (0.04 sec)
詳しい説明はここでは割愛しますが、
Join-Orderオプティマイザヒント句
MySQL8.
- JOIN_
FIXED_ ORDER - 強制的に結合する順番をFROM句の指定の順番で行います。
- JOIN_
ORDER - 指定した順序で表を結合するようにオプティマイザに教えます。
- JOIN_
PREFIX - 指定したテーブルを先に結合するようにオプティマイザに教えます。
- JOIN_
SUFFIX - 指定したテーブルを後に結合するようにオプティマイザに教えます。
Join-Order オプティマイザヒント句を利用する場合は、
SELECT /*+ JOIN_PREFIX(t1) */ t2.id FROM t2 LEFT JOIN t1 on t1.id = t2.id;
もし、
〈 エイリアスを使用した例 〉 mysql> SELECT /*+ JOIN_PREFIX(b2) */ b2.id FROM t1 INNER JOIN t2 as b2 on t1.id = b2.id; +----+ | id | +----+ | 1 | | 2 | 〈 省略 〉 〈 ワーニングの例 〉 mysql> EXPLAIN SELECT /*+ JOIN_PREFIX(t2) */ b2.id FROM t1 INNER JOIN t2 as b2 on t1.id = b2.id; +----+-------------+-------+------------+--------+----------------------+---------+---------+----------+-------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+--------+----------------------+---------+---------+----------+-------+----------+-------------+ | 1 | SIMPLE | b2 | NULL | index | PRIMARY | PRIMARY | 4 | NULL | 12010 | 100.00 | Using index | | 1 | SIMPLE | t1 | NULL | eq_ref | PRIMARY,idx_pk_value | PRIMARY | 4 | d1.b2.id | 1 | 100.00 | Using index | +----+-------------+-------+------------+--------+----------------------+---------+---------+----------+-------+----------+-------------+ 2 rows in set, 2 warnings (0.00 sec) Warning (Code 3128): Unresolved name `t2` for JOIN_PREFIX hint Note (Code 1003): /* select#1 */ select `d1`.`b2`.`id` AS `id` from `d1`.`t1` join `d1`.`t2` `b2` where (`d1`.`t1`.`id` = `d1`.`b2`.`id`)
クエリブロックネームを利用して、
SELECT a1.id FROM (SELECT id FROM t1 ) as a1;
このサブクエリに対して、qb1
,qb2
のようなクエリブロックネームを付与することができます。
> SELECT /*+ QB_NAME(qb1) */ a1.id FROM (SELECT /*+ QB_NAME(qb2) */id FROM t1 ) as a1;
クエリブロックネームは、JOIN_
のようにテーブルネーム@クエリブロックネーム
を用いることでオプティマイザヒント句を利用できます。
クエリブロックネームの詳細な説明については、
STRAIGHT_JOINとの違い
STRAIGHT_
まとめ
今回は、