有如下两张表:
CREATE TABLE `order` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'ID',
`order_id` int NULL DEFAULT NULL COMMENT '订单ID',
`order_amount` int NULL DEFAULT NULL COMMENT '订单金额',
PRIMARY KEY (`id`) USING BTREE,
INDEX `order_index_order_id`(`order_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '订单' ROW_FORMAT = DYNAMIC;
CREATE TABLE `order_detail` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'ID',
`order_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '订单ID',
`goods` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '商品名称',
`goods_count` int NOT NULL COMMENT '商品数量',
PRIMARY KEY (`id`) USING BTREE,
INDEX `order_detail_index_order_id`(`order_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '订单明细' ROW_FORMAT = DYNAMIC;
看下这条sql的explain
EXPLAIN
SELECT
t1.order_id, t1.order_amount, t2.goods, t2.goods_count
FROM
`order` t1
LEFT JOIN `order_detail` t2 ON t2.order_id = t1.order_id;
t1和t2通过order_id关联,order_id在t2建有索引order_detail_index_order_id,
但是这里却没有用到。
原因是order_id字段在t1中是int类型,在t2中是varchar类型,导致用不到索引。
一种办法是修改字段类型让它们保持一致,
不过修改字段类型有时候会可能遇到一些阻碍。
我们用另外一种办法,在查询中通过函数将它们转换为一样的类型和字符集。
EXPLAIN
SELECT
t1.order_id, t1.order_amount, t2.goods, t2.goods_count
FROM
`order` t1
LEFT JOIN `order_detail` t2 ON t2.order_id = CONVERT ( CONVERT ( t1.order_id, CHAR ) USING utf8 );
这下索引生效了。
可能会有人不清楚为什么用到了t2的索引,可以看下这个:MySQL join查询的原理。
最后
以上就是轻松导师最近收集整理的关于mysql left join关联字段的类型不一致导致索引失效的全部内容,更多相关mysql内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复