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

sdf*_*for 2 mysql character-encoding outer-join

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

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

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

-- pinventory 有 59310 行

创建表“产品”(
  `productid` int(11) NOT NULL 默认 '0',
  `prodcode` varchar(250) NOT NULL DEFAULT '',
  `prodname` varchar(250) NOT NULL DEFAULT '',
  `prodtype`smallint(6) NOT NULL DEFAULT '0',
 ...
  主键(`productid`),
  关键“产品代码”(“产品代码”)
) 引擎=MyISAM 默认字符集=utf8

-- 产品有 7978 行

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

-- 花费 2 分 33 秒并返回正确的 476 行

-  解释

    id select_type 表类型 possible_keys key key_len ref rows Extra
    1 简单产品 全部 (NULL) (NULL) ( NULL) (NULL) 7978
    1 SIMPLE pinventory 索引 (NULL) PRIMARY 10 (NULL) 59310 使用 where; 使用索引;不存在

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

我尝试将“article”更改为 varchar(250),因此连接中的两个字段完全相同,但这没有帮助。

谢谢

Bjo*_*ern 5

您的按键articleprodcode使用不同的字符集。

pinventory.article: char(10) CHARACTER SET latin1
products.prodcode: varchar(250) CHARACTER SET utf8
Run Code Online (Sandbox Code Playgroud)

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

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