【已解决】mysql left join使用不了索引问题
2017-08-22 10:26
543 查看
前言
在本地建了两张表,一张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
图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
图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
再执行一下图1.1的sql:
图3.2
问题解决。
相关文章推荐
- mysql left( right ) join使用on 与where 筛选的差异 博客分类: mysql MySQLSQL数据结构 有这样的一个问题mysql查询使用mysql中left(
- 解决MySQL中IN子查询会导致无法使用索引问题
- 使用solr的DIHandler 构建mysql大表全量索引,内存溢出问题的解决方法
- JSP,mysql,tomcat下(基于struts2)中文及其乱码问题的解决 5大配置点 使用UTF-8编码
- chm文件的索引无法使用问题解决方法
- 解决rails与mysql结合使用时的中文乱码问题
- 解决使用MySQL C-API开发应用时的连接超时问题
- 解决 c3p0 和 MySQL 集成情况下,连接长时间闲置后重新使用时报错的问题
- 编译安装mysql 5.1使用utf8解决乱码问题
- 使用NEWSEQUENTIALID解决GUID聚集索引问题
- 使用NEWSEQUENTIALID解决GUID聚集索引问题 SQLServer数据表主键的另一个方案
- 解决MySQL在使用命令时中文字符出现乱码的问题
- 使用NEWSEQUENTIALID解决GUID聚集索引问题
- mysql c++ connector 1.0.5 getString方法 使用过程中遇到汉字产生的乱码问题的解决方法
- jsp servlet mysql fckeditor等配合使用时出现中文乱码的解决问题!
- 取从textarea中存到MYSQL的数据以原格式显示问题以及解决MySQL日期处理和标签的使用
- 关于MySql 4.0.12左联接left outer join的一些问题
- 使用Hibernate和Mysql中文乱码问题解决
- spring hibernate mysql 使用中的问题及解决方法
- 使用Explain关键字来确认是否可以通过索引来解决Order BY速度问题。