I know this is a common problem, but I can't find the problem as to why an outer join with these 2 simple tables takes so long.
I made sure they are both myisam, same charset.
CREATE TABLE `pinventory` (
`article` char(10) CHARACTER SET latin1 NOT NULL,
`inventory` int(11) DEFAULT NULL,
`store_id` char(10) CHARACTER SET latin1 DEFAULT NULL,
`status` char(1) CHARACTER SET latin1 DEFAULT NULL,
`what` int(11) DEFAULT NULL,
PRIMARY KEY (`article`),
KEY `article` (`article`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
-- pinventory has 59310 rows
CREATE TABLE `products` (
`productid` int(11) NOT NULL DEFAULT '0',
`prodcode` varchar(250) NOT NULL DEFAULT '',
`prodname` varchar(250) NOT NULL DEFAULT '',
`prodtype` smallint(6) NOT NULL DEFAULT '0',
...
PRIMARY KEY (`productid`),
KEY `prodcode` (`prodcode`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
-- products has 7978 rows
SELECT prodcode, prodname, "not in inventory"
FROM products
LEFT OUTER JOIN pinventory ON article = prodcode
WHERE article IS NULL
;
-- takes 2 minutes and 33 seconds and returns the correct 476 rows
-- explain
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE products ALL (NULL) (NULL) ( NULL) (NULL) 7978
1 SIMPLE pinventory index (NULL) PRIMARY 10 (NULL) 59310 Using where; Using index; Not exists
inner join takes .22 seconds
SELECT prodcode, prodname, "in inventory"
FROM products
JOIN pinventory ON article = prodcode
;
I tried changing 'article' to a varchar(250) so both fields in the join were exactly the same but that doesn't help.
thanks