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),因此连接中的两个字段完全相同,但这没有帮助。
谢谢
您的按键article和prodcode使用不同的字符集。
pinventory.article: char(10) CHARACTER SET latin1
products.prodcode: varchar(250) CHARACTER SET utf8
Run Code Online (Sandbox Code Playgroud)
因此,数据库在加入时必须转换每个条目,这会显着降低速度。
尝试在两个字段上使用相同的字符集,您会感受到差异。
| 归档时间: |
|
| 查看次数: |
271 次 |
| 最近记录: |