2

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

我确保它们都是 myisam,相同的字符集。

创建表`pinventory`(
  `article` char(10) CHARACTER SET latin1 NOT NULL,
  `inventory` int(11) 默认为空,
  `store_id` char(10) CHARACTER SET latin1 DEFAULT NULL,
  `status` char(1) CHARACTER SET latin1 DEFAULT NULL,
  `what` int(11) 默认为空,
  主键(`article`),
  关键`文章`(`文章`)
) 引擎=MyISAM 默认字符集=utf8

-- pinventory 有 59310 行

创建表`产品`(
  `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',
 ...
  主键(`productid`),
  KEY `prodcode` (`prodcode`)
) 引擎=MyISAM 默认字符集=utf8

-- 产品有 7978 行

选择产品代码,产品名称,“不在库存中”
来自产品
LEFT OUTER JOIN pinventory ON article = prodcode
WHERE 文章为空
;  

-- 耗时 2 分 33 秒并返回正确的 476 行

-  解释

    id select_type table type possible_keys key key_len ref rows Extra
    1 SIMPLE 产品 ALL (NULL) (NULL) (NULL) (NULL) 7978
    1 SIMPLE pinventory index (NULL) PRIMARY 10 (NULL) 59310 使用 where;使用索引;不存在

内部连接需要 0.22 秒
选择产品代码,产品名称,“库存中”
来自产品
在文章上加入 pinventory = prodcode
;  

我尝试将“文章”更改为 varchar(250),因此连接中的两个字段完全相同,但这无济于事。

谢谢

4

1 回答 1

5

你的键articleprodcode使用不同的字符集。

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

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

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

于 2013-06-14T20:19:47.137 回答