Bug #75457 | Index is ignored with straight_join | ||
---|---|---|---|
Submitted: | 9 Jan 2015 5:41 | Modified: | 24 Feb 2016 15:01 |
Reporter: | Nilnandan Joshi | Email Updates: | |
Status: | Closed | Impact on me: | |
Category: | MySQL Server: Optimizer | Severity: | S2 (Serious) |
Version: | 5.6.21, 5.6.24, 5.7.6 | OS: | Any |
Assigned to: | Paul DuBois | CPU Architecture: | Any |
[9 Jan 2015 5:41]
Nilnandan Joshi
[9 Jan 2015 6:53]
MySQL Verification Team
Hello Nilnandan Joshi, Thank you for the report and test case. Thanks, Umesh
[9 Jan 2015 6:56]
MySQL Verification Team
// 5.6.24 mysql> show variables like '%version%'; +-------------------------+---------------------------------------------------------+ | Variable_name | Value | +-------------------------+---------------------------------------------------------+ | innodb_version | 5.6.24 | | protocol_version | 10 | | slave_type_conversions | | | version | 5.6.24-enterprise-commercial-advanced | | version_comment | MySQL Enterprise Server - Advanced Edition (Commercial) | | version_compile_machine | x86_64 | | version_compile_os | linux-glibc2.5 | +-------------------------+---------------------------------------------------------+ 7 rows in set (0.00 sec) mysql> SELECT STRAIGHT_JOIN * FROM data d WHERE d.Data LIKE '%nil%' AND d.DataKind IN ( SELECT dk.DataKindID FROM a_datakind dk WHERE dk.Transform = 11 ); +--------+----------+------------+------------+-----------------+ | DataID | DataKind | ParentMove | ParentData | Data | +--------+----------+------------+------------+-----------------+ | 6 | 6 | 400 | NULL | /home/nilnandan | | 7 | 6 | 400 | NULL | /home/nilnandan | | 8 | 6 | 500 | NULL | /home/nilnandan | | 9 | 6 | 700 | NULL | /home/nilnandan | +--------+----------+------------+------------+-----------------+ 4 rows in set (0.00 sec) mysql> EXPLAIN SELECT STRAIGHT_JOIN * FROM data d WHERE d.Data LIKE '%nil%' AND d.DataKind IN ( SELECT dk.DataKindID FROM a_datakind dk WHERE dk.Transform = 11 ); +----+-------------+-------+------+-------------------+-----------+---------+-------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+-------------------+-----------+---------+-------+------+-------------+ | 1 | PRIMARY | d | ALL | NULL | NULL | NULL | NULL | 9 | Using where | | 2 | SUBQUERY | dk | ref | PRIMARY,Transform | Transform | 5 | const | 1 | Using index | +----+-------------+-------+------+-------------------+-----------+---------+-------+------+-------------+ 2 rows in set (0.00 sec) mysql> EXPLAIN SELECT * FROM data d WHERE d.Data LIKE '%nil%' AND d.DataKind IN ( SELECT dk.DataKindID FROM a_datakind dk WHERE dk.Transform = 11 ); +----+-------------+-------+------+-------------------+------------+---------+--------------------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+-------------------+------------+---------+--------------------+------+-------------+ | 1 | SIMPLE | dk | ref | PRIMARY,Transform | Transform | 5 | const | 1 | Using index | | 1 | SIMPLE | d | ref | Index_data | Index_data | 4 | test.dk.DataKindID | 1 | Using where | +----+-------------+-------+------+-------------------+------------+---------+--------------------+------+-------------+ 2 rows in set (0.00 sec)
[9 Jan 2015 6:57]
MySQL Verification Team
// 5.7.6 mysql> show variables like '%version%'; +-------------------------+---------------------------------------------------------+ | Variable_name | Value | +-------------------------+---------------------------------------------------------+ | innodb_version | 5.7.6 | | protocol_version | 10 | | slave_type_conversions | | | version | 5.7.6-m16-enterprise-commercial-advanced | | version_comment | MySQL Enterprise Server - Advanced Edition (Commercial) | | version_compile_machine | x86_64 | | version_compile_os | Linux | +-------------------------+---------------------------------------------------------+ 7 rows in set (0.00 sec) mysql> SELECT STRAIGHT_JOIN * FROM data d WHERE d.Data LIKE '%nil%' AND d.DataKind IN ( SELECT dk.DataKindID FROM a_datakind dk WHERE dk.Transform = 11 ); +--------+----------+------------+------------+-----------------+ | DataID | DataKind | ParentMove | ParentData | Data | +--------+----------+------------+------------+-----------------+ | 6 | 6 | 400 | NULL | /home/nilnandan | | 7 | 6 | 400 | NULL | /home/nilnandan | | 8 | 6 | 500 | NULL | /home/nilnandan | | 9 | 6 | 700 | NULL | /home/nilnandan | +--------+----------+------------+------------+-----------------+ 4 rows in set (0.00 sec) mysql> EXPLAIN SELECT STRAIGHT_JOIN * FROM data d WHERE d.Data LIKE '%nil%' AND d.DataKind IN ( SELECT dk.DataKindID FROM a_datakind dk WHERE dk.Transform = 11 ); +----+-------------+-------+------------+------+-------------------+-----------+---------+-------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+-------------------+-----------+---------+-------+------+----------+-------------+ | 1 | PRIMARY | d | NULL | ALL | NULL | NULL | NULL | NULL | 9 | 11.11 | Using where | | 2 | SUBQUERY | dk | NULL | ref | PRIMARY,Transform | Transform | 5 | const | 1 | 100.00 | Using index | +----+-------------+-------+------------+------+-------------------+-----------+---------+-------+------+----------+-------------+ 2 rows in set, 1 warning (0.00 sec) mysql> EXPLAIN SELECT * FROM data d WHERE d.Data LIKE '%nil%' AND d.DataKind IN ( SELECT dk.DataKindID FROM a_datakind dk WHERE dk.Transform = 11 ); +----+-------------+-------+------------+------+-------------------+------------+---------+--------------------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+-------------------+------------+---------+--------------------+------+----------+-------------+ | 1 | SIMPLE | dk | NULL | ref | PRIMARY,Transform | Transform | 5 | const | 1 | 100.00 | Using index | | 1 | SIMPLE | d | NULL | ref | Index_data | Index_data | 4 | test.dk.DataKindID | 1 | 11.11 | Using where | +----+-------------+-------+------------+------+-------------------+------------+---------+--------------------+------+----------+-------------+ 2 rows in set, 1 warning (0.00 sec)
[9 Jan 2015 7:00]
Nilnandan Joshi
Originally reported here: https://bugs.launchpad.net/percona-server/+bug/1405677
[9 Jan 2015 7:00]
MySQL Verification Team
// 5.5.42 mysql> show variables like '%version%'; +-------------------------+---------------------------------------------------------+ | Variable_name | Value | +-------------------------+---------------------------------------------------------+ | innodb_version | 5.5.42 | | protocol_version | 10 | | slave_type_conversions | | | version | 5.5.42-enterprise-commercial-advanced | | version_comment | MySQL Enterprise Server - Advanced Edition (Commercial) | | version_compile_machine | x86_64 | | version_compile_os | linux2.6 | +-------------------------+---------------------------------------------------------+ 7 rows in set (0.00 sec) mysql> SELECT STRAIGHT_JOIN * FROM data d WHERE d.Data LIKE '%nil%' AND d.DataKind IN ( SELECT dk.DataKindID FROM a_datakind dk WHERE dk.Transform = 11 ); +--------+----------+------------+------------+-----------------+ | DataID | DataKind | ParentMove | ParentData | Data | +--------+----------+------------+------------+-----------------+ | 6 | 6 | 400 | NULL | /home/nilnandan | | 7 | 6 | 400 | NULL | /home/nilnandan | | 8 | 6 | 500 | NULL | /home/nilnandan | | 9 | 6 | 700 | NULL | /home/nilnandan | +--------+----------+------------+------------+-----------------+ 4 rows in set (0.00 sec) mysql> EXPLAIN SELECT STRAIGHT_JOIN * FROM data d WHERE d.Data LIKE '%nil%' AND d.DataKind IN ( SELECT dk.DataKindID FROM a_datakind dk WHERE dk.Transform = 11 ); +----+--------------------+-------+-----------------+-------------------+---------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+--------------------+-------+-----------------+-------------------+---------+---------+------+------+-------------+ | 1 | PRIMARY | d | ALL | NULL | NULL | NULL | NULL | 9 | Using where | | 2 | DEPENDENT SUBQUERY | dk | unique_subquery | PRIMARY,Transform | PRIMARY | 4 | func | 1 | Using where | +----+--------------------+-------+-----------------+-------------------+---------+---------+------+------+-------------+ 2 rows in set (0.00 sec) mysql> EXPLAIN SELECT * FROM data d WHERE d.Data LIKE '%nil%' AND d.DataKind IN ( SELECT dk.DataKindID FROM a_datakind dk WHERE dk.Transform = 11 ); +----+--------------------+-------+-----------------+-------------------+---------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+--------------------+-------+-----------------+-------------------+---------+---------+------+------+-------------+ | 1 | PRIMARY | d | ALL | NULL | NULL | NULL | NULL | 9 | Using where | | 2 | DEPENDENT SUBQUERY | dk | unique_subquery | PRIMARY,Transform | PRIMARY | 4 | func | 1 | Using where | +----+--------------------+-------+-----------------+-------------------+---------+---------+------+------+-------------+ 2 rows in set (0.00 sec)
[9 Jan 2015 7:07]
MySQL Verification Team
// 5.1.73 mysql> show variables like '%version%'; +-------------------------+------------------------------+ | Variable_name | Value | +-------------------------+------------------------------+ | protocol_version | 10 | | version | 5.1.73 | | version_comment | MySQL Community Server (GPL) | | version_compile_machine | x86_64 | | version_compile_os | unknown-linux-gnu | +-------------------------+------------------------------+ 5 rows in set (0.01 sec) mysql> SELECT STRAIGHT_JOIN * FROM data d WHERE d.Data LIKE '%nil%' AND d.DataKind IN ( SELECT dk.DataKindID FROM a_datakind dk WHERE dk.Transform = 11 ); +--------+----------+------------+------------+-----------------+ | DataID | DataKind | ParentMove | ParentData | Data | +--------+----------+------------+------------+-----------------+ | 6 | 6 | 400 | NULL | /home/nilnandan | | 7 | 6 | 400 | NULL | /home/nilnandan | | 8 | 6 | 500 | NULL | /home/nilnandan | | 9 | 6 | 700 | NULL | /home/nilnandan | +--------+----------+------------+------------+-----------------+ 4 rows in set (0.00 sec) mysql> EXPLAIN SELECT STRAIGHT_JOIN * FROM data d WHERE d.Data LIKE '%nil%' AND d.DataKind IN ( SELECT dk.DataKindID FROM a_datakind dk WHERE dk.Transform = 11 ); +----+--------------------+-------+-----------------+-------------------+---------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+--------------------+-------+-----------------+-------------------+---------+---------+------+------+-------------+ | 1 | PRIMARY | d | ALL | NULL | NULL | NULL | NULL | 9 | Using where | | 2 | DEPENDENT SUBQUERY | dk | unique_subquery | PRIMARY,Transform | PRIMARY | 4 | func | 1 | Using where | +----+--------------------+-------+-----------------+-------------------+---------+---------+------+------+-------------+ 2 rows in set (0.00 sec) mysql> EXPLAIN SELECT * FROM data d WHERE d.Data LIKE '%nil%' AND d.DataKind IN ( SELECT dk.DataKindID FROM a_datakind dk WHERE dk.Transform = 11 ); +----+--------------------+-------+-----------------+-------------------+---------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+--------------------+-------+-----------------+-------------------+---------+---------+------+------+-------------+ | 1 | PRIMARY | d | ALL | NULL | NULL | NULL | NULL | 9 | Using where | | 2 | DEPENDENT SUBQUERY | dk | unique_subquery | PRIMARY,Transform | PRIMARY | 4 | func | 1 | Using where | +----+--------------------+-------+-----------------+-------------------+---------+---------+------+------+-------------+ 2 rows in set (0.00 sec)
[9 Jan 2015 7:39]
Øystein Grøvlen
Posted by developer: This happens because STRAIGHT_JOIN will disable semi-join transformations. Changing this to a documentation bug since I cannot find anything about this in the manual. A list of requirements for semi-join transformations can be found here: http://roylyseng.blogspot.co.uk/2012/04/semi-join-in-mysql-56.html
[24 Feb 2016 15:01]
Paul DuBois
Thank you for your bug report. This issue has been addressed in the documentation. The updated documentation will appear on our website shortly. Mentioned that STRAIGHT_JOIN prevents index use in the semi-join discussion here: http://dev.mysql.com/doc/refman/5.7/en/subquery-optimization.html