Description:
OS: Linux Ubuntu 12.04.2 LTS amd64
MySQL: 5.5.31-ubuntu and 5.6.12-community
Issue:
When using a LEFT JOIN (SELECT), the server will not use the proper index. A full table scan occurs.
How to repeat:
Note: the following commands were done on MySQL 5.6.12-community. Results were the same for MySQL 5.5.31-ubuntu.
SHOW CREATE TABLE cnoths;
CREATE TABLE `cnoths` (
`cnotc` varchar(9) NOT NULL,
`cndate` int(8) DEFAULT NULL,
`cnuser` varchar(8) DEFAULT NULL,
`cntype` varchar(1) DEFAULT NULL,
`unuse1` varchar(1) DEFAULT NULL,
`cncode` varchar(3) DEFAULT NULL,
`blkey` varchar(15) DEFAULT NULL,
`pcbcod` varchar(1) DEFAULT NULL,
`bltocd` varchar(1) DEFAULT NULL,
`nbilto` varchar(5) DEFAULT NULL,
`ccd01` varchar(4) DEFAULT NULL,
`ccd02` varchar(4) DEFAULT NULL,
`ccd03` varchar(4) DEFAULT NULL,
`ccd04` varchar(4) DEFAULT NULL,
`ccd05` varchar(4) DEFAULT NULL,
`ccd06` varchar(4) DEFAULT NULL,
`ccd07` varchar(4) DEFAULT NULL,
`ccd08` varchar(4) DEFAULT NULL,
`ccd09` varchar(4) DEFAULT NULL,
`ccd10` varchar(4) DEFAULT NULL,
`ccd11` varchar(4) DEFAULT NULL,
`ccd12` varchar(4) DEFAULT NULL,
`cna01` decimal(10,2) DEFAULT NULL,
`cna02` decimal(10,2) DEFAULT NULL,
`cna03` decimal(10,2) DEFAULT NULL,
`cna04` decimal(10,2) DEFAULT NULL,
`cna05` decimal(10,2) DEFAULT NULL,
`cna06` decimal(10,2) DEFAULT NULL,
`cna07` decimal(10,2) DEFAULT NULL,
`cna08` decimal(10,2) DEFAULT NULL,
`cna09` decimal(10,2) DEFAULT NULL,
`cna10` decimal(10,2) DEFAULT NULL,
`cna11` decimal(10,2) DEFAULT NULL,
`cna12` decimal(10,2) DEFAULT NULL,
`pcn01` varchar(1) DEFAULT NULL,
`pcn02` varchar(1) DEFAULT NULL,
`pcn03` varchar(1) DEFAULT NULL,
`pcn04` varchar(1) DEFAULT NULL,
`pcn05` varchar(1) DEFAULT NULL,
`pcn06` varchar(1) DEFAULT NULL,
`pcn07` varchar(1) DEFAULT NULL,
`pcn08` varchar(1) DEFAULT NULL,
`pcn09` varchar(1) DEFAULT NULL,
`pcn10` varchar(1) DEFAULT NULL,
`pcn11` varchar(1) DEFAULT NULL,
`pcn12` varchar(1) DEFAULT NULL,
`ntuact` varchar(5) DEFAULT NULL,
`cmmnt1` varchar(50) DEFAULT NULL,
`cmmnt2` varchar(50) DEFAULT NULL,
`cmmnt3` varchar(50) DEFAULT NULL,
`aprval` varchar(8) DEFAULT NULL,
`numfax` varchar(1) DEFAULT NULL,
`postyn` varchar(1) DEFAULT NULL,
`pstdte` int(8) DEFAULT NULL,
`typatu` varchar(5) DEFAULT NULL,
`saildt` int(8) DEFAULT NULL,
`cntvoy` varchar(10) DEFAULT NULL,
`typey` varchar(1) DEFAULT NULL,
`wastpb` varchar(1) DEFAULT NULL,
`usrpst` varchar(8) DEFAULT NULL,
`unuse2` varchar(66) DEFAULT NULL,
`pstfx` varchar(50) DEFAULT NULL,
PRIMARY KEY (`cnotc`),
KEY `cnoths_idx1` (`blkey`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
;
EXPLAIN EXTENDED
SELECT
MAX( ci.cnotc )
FROM cnoths ci
WHERE ci.cnotc LIKE CONCAT( '04', '432618', '%' )
AND ci.cntype = 'A'
;
+----+-------------+-------+-------+---------------+---------+---------+------+------+----------+------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+-------+---------------+---------+---------+------+------+----------+------------------------------------+
| 1 | SIMPLE | ci | range | PRIMARY | PRIMARY | 11 | NULL | 1 | 100.00 | Using index condition; Using where |
+----+-------------+-------+-------+---------------+---------+---------+------+------+----------+------------------------------------+
1 row in set, 1 warning (0.02 sec)
EXPLAIN EXTENDED
SELECT
fclhed.terml,
fclhed.drcpt,
cnoths.cnotc
FROM fclhed
LEFT JOIN cnoths
ON cnoths.cnotc = (
SELECT
MAX( ci.cnotc )
FROM cnoths ci
WHERE ci.cnotc LIKE CONCAT( fclhed.terml, fclhed.drcpt, '%' )
AND ci.cntype = 'A'
)
WHERE fclhed.terml = '04'
AND fclhed.drcpt = '432618'
;
+----+--------------------+--------+--------+---------------+---------+---------+-------------+-------+----------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+--------------------+--------+--------+---------------+---------+---------+-------------+-------+----------+--------------------------+
| 1 | PRIMARY | fclhed | ref | PRIMARY | PRIMARY | 12 | const,const | 2 | 100.00 | Using where; Using index |
| 1 | PRIMARY | cnoths | eq_ref | PRIMARY | PRIMARY | 11 | func | 1 | 100.00 | Using where; Using index |
| 2 | DEPENDENT SUBQUERY | ci | ALL | NULL | NULL | NULL | NULL | 74923 | 100.00 | Using where |
+----+--------------------+--------+--------+---------------+---------+---------+-------------+-------+----------+--------------------------+
3 rows in set, 3 warnings (0.02 sec)
Suggested fix:
Correct dependent subquery to use index as in the first example.