我知道这是一个常见的问题,但我找不到为什么这两个简单表的外连接需要这么长时间的问题。
我确定他们都是myisam,同样是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 ;
我尝试将'article'更改为varchar(250),因此连接中的两个字段完全相同但不起作用。
感谢
答案 0 :(得分:4)
您的密钥article
和prodcode
使用不同的字符集。
pinventory.article: char(10) CHARACTER SET latin1
products.prodcode: varchar(250) CHARACTER SET utf8
因此,数据库必须在加入时转换每个条目,这会显着减慢它的速度。
尝试在两个字段上使用相同的字符集,您会感觉到不同。