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

有如下两张表:

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内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部