Bug #88306 optimizer go through full table scan in join
Submitted: 31 Oct 2017 15:11 Modified: 1 Nov 2017 14:14
Reporter: mohamed atef Email Updates:
Status: Closed Impact on me:
None 
Category:MySQL Server: Optimizer Severity:S3 (Non-critical)
Version:5.7.20 OS:Windows
Assigned to: CPU Architecture:Any
Tags: full table scan

[31 Oct 2017 15:11] mohamed atef
Description:
optimizer didn`t use unique index and go through full table scan
when left join or join
on unique column = primary key in the other table

How to repeat:
CREATE DATABASE DB1;
USE DB1;
CREATE TABLE `tb2` (
  `ID_` bigint(20) unsigned NOT NULL,
  `VAL` double(10,4) NOT NULL DEFAULT '0.0000',
  PRIMARY KEY (`ID_`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
 
CREATE TABLE `tb3` (
  `ID_` bigint(20) unsigned NOT NULL,
  `INVO_NO` bigint(20) unsigned NOT NULL,
  `disc` double(10,4) NOT NULL DEFAULT '0.0000',
  PRIMARY KEY (`ID_`),
  UNIQUE KEY `INVO_NOUN` (`INVO_NO`) USING BTREE,
  CONSTRAINT `INVO` FOREIGN KEY (`INVO_NO`) REFERENCES `tb2` (`ID_`) ON UPDATE CASCADE
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  
INSERT INTO `tb2` (`ID_`,`VAL`) VALUES (10,100.0000);
INSERT INTO `tb2` (`ID_`,`VAL`) VALUES (20,50.0000);
INSERT INTO `tb2` (`ID_`,`VAL`) VALUES (30,70.0000);

INSERT INTO `tb3` (`ID_`,`INVO_NO`,`disc`) VALUES (10,20,100.0000);
INSERT INTO `tb3` (`ID_`,`INVO_NO`,`disc`) VALUES (11,30,200.0000);
INSERT INTO `tb3` (`ID_`,`INVO_NO`,`disc`) VALUES (12,10,300.0000);

 EXPLAIN SELECT 
tb2.ID_,TB2.VAL,
tb3.ID_,tb3.INVO_NO,tb3.disc

 FROM db1.tb3
 LEFT JOIN tb2 ON tb3.INVO_NO=tb2.ID_;

 EXPLAIN SELECT 
tb2.ID_,TB2.VAL,
tb3.ID_,tb3.INVO_NO,tb3.disc

 FROM db1.tb3
  JOIN tb2 ON tb3.INVO_NO=tb2.ID_;
[1 Nov 2017 13:43] MySQL Verification Team
Hi!

Full scan is used because you have too few tuples in the tables.

Try adding hundreds of rows into both tables and run EXPLAIN again.
[1 Nov 2017 14:14] mohamed atef
HI
THX IT WORK CLOSED