为什么我的mysql简单外连接需要这么长时间?

时间:2013-06-14 20:09:30

标签: mysql outer-join

我知道这是一个常见的问题,但我找不到为什么这两个简单表的外连接需要这么长时间的问题。

我确定他们都是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),因此连接中的两个字段完全相同但不起作用。

感谢

1 个答案:

答案 0 :(得分:4)

您的密钥articleprodcode使用不同的字符集。

pinventory.article: char(10) CHARACTER SET latin1
products.prodcode: varchar(250) CHARACTER SET utf8

因此,数据库必须在加入时转换每个条目,这会显着减慢它的速度。

尝试在两个字段上使用相同的字符集,您会感觉到不同。