我是靠谱客的博主 轻松导师,这篇文章主要介绍mysql left join关联字段的类型不一致导致索引失效,现在分享给大家,希望可以做个参考。

有如下两张表:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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

复制代码
1
2
3
4
5
6
7
8
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类型,导致用不到索引。

一种办法是修改字段类型让它们保持一致,
不过修改字段类型有时候会可能遇到一些阻碍。

我们用另外一种办法,在查询中通过函数将它们转换为一样的类型和字符集。

复制代码
1
2
3
4
5
6
7
8
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内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(96)

评论列表共有 0 条评论

立即
投稿
返回
顶部