为啥我的 mysql 简单外连接需要这么长时间?
Posted
技术标签:
【中文标题】为啥我的 mysql 简单外连接需要这么长时间?【英文标题】:Why is my mysql simple outer join taking so long?为什么我的 mysql 简单外连接需要这么长时间? 【发布时间】:2013-06-11 13:50:29 【问题描述】:我知道这是一个常见的问题,但我找不到为什么与这 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 ;我尝试将 'article' 更改为 varchar(250),因此连接中的两个字段完全相同,但这无济于事。
谢谢
【问题讨论】:
【参考方案1】:您的密钥article
和prodcode
使用不同的字符集。
pinventory.article: char(10) CHARACTER SET latin1
products.prodcode: varchar(250) CHARACTER SET utf8
因此,数据库必须在加入时转换每个条目,这会显着降低速度。
尝试在两个字段上使用相同的字符集,您会感觉到不同。
【讨论】:
不错的收获!我不知道为什么我让描述中的“相同字符集”欺骗了我。 完美,我不知道列有单独的字符集。我从来没有设置它们,默认情况下 sqlyog 不显示它 - 必须取消单击“隐藏语言选项”。下降到 0.4 秒。正如 ebyrob 所说:“不错的收获!”以上是关于为啥我的 mysql 简单外连接需要这么长时间?的主要内容,如果未能解决你的问题,请参考以下文章
为啥没有网络连接时 Alamofire 需要这么长时间才能超时?