我是靠谱客的博主 土豪鲜花,最近开发中收集的这篇文章主要介绍【已解决】mysql left join使用不了索引问题前言1.重现问题2.分析和搜索解决办法3.解决问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前言

在本地建了两张表,一张order表和一张zx表,由于order的用户ID是包含所有我需要的用户,所以用order作为驱动表left join zx表。
事先我在两表内都创建了unique的索引(end_date,ownerid),然后用order表 left join zx表。
——按理说应该适用eq_ref的type,结果却根本没有用上ownerid的索引,使用强制索引也没用,但用zx表 left join order表却能顺利用上。

1.重现问题

具体建表就不说了,默认charset=utf8.
截图如下:
图1.1 order left join zx
图1.1

图1.2 zx left join order
图1.2

很明显,这里有两个问题:
1.图1.1中type是ref,ref里面也只用上了const(常量),并没有用上o.ownerid;
2.图1.1中z表遍历的rows竟然达到56793,事实上这个日期的行数仅有28396行,即使全表也仅是56453行。
这样,能想见图1.1执行会有多慢,基本执行不动了。

2.分析和搜索解决办法

不说分析了,换着法的改sql也没用;换着群问大神也没用;各种搜索引擎搜才总算有点思路。
关键点是“索引用不上的原因可能是字符集不相同”。
于是看了了两张表的字符集,当然都是utf8;
再看看两张表这个字段的字符集:

SHOW FULL COLUMNS FROM initial30_order;
SHOW FULL COLUMNS FROM initial30_zx;

图2.1 order表字符集
图2.1

图2.2 zx表字符集
图2.2

可以看到,zx表的ownerid莫名变成了utf8_general_ci.

3.解决问题

找到问题那么更改order表的ownerid的字符集即可:

ALTER TABLE initial30_order CHANGE ownerid ownerid VARCHAR(11) CHARACTER SET utf8 COLLATE utf8_general_ci

图3.1 更改order表ownerid字段的字符集
图3.1

再执行一下图1.1的sql:
图3.2 重复执行图1.1的sql
图3.2

问题解决。


最后

以上就是土豪鲜花为你收集整理的【已解决】mysql left join使用不了索引问题前言1.重现问题2.分析和搜索解决办法3.解决问题的全部内容,希望文章能够帮你解决【已解决】mysql left join使用不了索引问题前言1.重现问题2.分析和搜索解决办法3.解决问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部