【问题场景】

有个30多行的大SQL执行效率特别慢,问题集中在一个子查询上,开始没有建索引,可是发现索引都创建了,不走索引,大SQL简化一下,提出不走索引的部分,如下图所示

简单点,有三张表需要关联查询,关联关系如下

A表

B表 关联 A.col = B.id

C表 关联 B.col = C.id

问题出在 B表 关联 A.col = B.id,为啥?执行计划就是不走id主键,C表 关联 B.col = C.id都可以正常走

【解决思路】

1、尝试单表查询,验证索引是否正常 试了一下单表查询B是可以走主键索引,正常,排出索引问题

2、尝试优化SQL 修改了一下SQL,将left join 分别改为inner join,join和子查询,几种方式都不能走索引,排出优化可能

3、尝试在其他环境执行

发现在其他环境下可以正常,走索引,说明不是SQL的问题,排出SQL问题。

TMD !!! 到底哪出问题

既然有环境可以,肯定是哪里配置有问题,慢慢对比一下,于是从表结构,索引创建方式,逐一排查,还是没有发现问题。

没有思路了,困意来袭,下班回家,明日再战


新的一天开始,没办法,在baidu继续搜搜,“SQL 不走索引”

忽然间发现了一篇文章 https://www.cnblogs.com/jarjune/articles/7912722.html

启发了我,是不是两张表的编码方式不一样呢,有思路来,开搞,哈哈 ……

先看表的编码,哇塞,uft8mb4

再看字段的编码,神马,uft8mb4

我们默认都是uft8,谁干的,我的刀呢 …… 修改了表的编码和字段的编码方式,终于可以正常走索引了

【总结】

  • 对于大SQL,不要抱着大西瓜跑步,轻装上路。精确定位问题,简化问题,逐步缩小范围
  • 在一两个人开发的时候,大家都熟悉规范,使用默认的编码方式,一般会忽略编码方式不同的问题,所以团队开发要注意遵守规范
  • 在使用join连接查询的时候,如果编码不一致,就不走索引了

        好久没有写东西,现在自己脑子的思绪也乱乱的。
        今天2016-11-3,天气雾霾,气温2-13度,心情就像这北京的雾霾天一样,有一种抑郁、压抑和挫败感。好久没有出去面试了,在sinosoft一干,转念已有三年多了,从刚出茅庐的小子,到激情燃烧的程序员,再到已有些懒惰的项目经理。最近部门的一些人和事,迫使我有了“世界这么大,我想去看看”的念头。回头看看脚下走过的路,仰望天空,脑海中闪过刚出大学校门时年给自己定下的五年计划,好像离当时的目标还有好远。或许再待在这里无法满足对技术、money、事业的向往。
        来JD面试,是刚刚向外面世界迈出的第一小步,就有了危机感和挫败感。在想,这个步迈出的是不是有些晚了,看来以后每年都让自己出去多面试,肯定是有必要的,一来熟悉行情,二来看看外面世界很多彩。
        面试的职位是JAVA中级开发攻城狮,在去之前对自己还信心满满的,干了这么久,middle level应该不成问题,但是通过这笔试和面试下来,很多技能都退化了。接下的两个月fighting吧!!!
        之前的一年之今一直是在给别人面试,今天再次坐到面试官的对面,说实话这个感觉不太好啊。之前给面试者提的问题大多没有具体答案的问题,在我看来那些固定答案的基础题,只要事先准备好多背一些题,根本看不出来什么能力。但是今天的面试却问了好多基础题,着实答不上来啊!看来以后必需大补了。
        1、hashTable 和 hashMap那个是线程安全的?  我给说反了
        2、分布式事务有接触过吗?   事务我知道,分布式完全不知啊,只好厚着脸说我们的业务不需要这个,所以不清楚。
        3、重新和复写,是怎么回事?   完全懵逼,这个最基础的,竟然搞不清是咋回事了,用到是会用,啥区别来着,啊啊……打脸吧。
        4、什么情况下才会走索引,什么情况下不走索引?
        5、SQL查询优化一般都如何做?   别用or,用and;别用in,用exist;根据条件创建索引,where中条件是索引的,放在条件的最前面,再不行就做个数据库重组。
        6、springMVC有特性? 
        7、jQuery中的post是异步的还是同步的?   不都是异步的吗?难道还能同步,是的能,啊……回去我在学习一下接口文档吧。
        8、常用那些设计模式,说一下使用场景?   我们也就用个单例,在某个项目多线程中使用过。
        ……
        现在真的有点迷了,这一年多时间重点放在带项目上了,好久没有写代码了。带项目也刚刚起步,带这些项目经验到下一家认可吗?技术又退化了这么多,现在不少新技术(例如:mybatis、redis、dubbo、elasticsearch……)现在又不会。
        3年的sinosoft经历,好像并未给简历添彩,眼下脚下的路要怎么走呢?要给自己定一个什么样的岗位呢?是重回开发路,还是沿着现在的项目管理走。现在自己的感觉就是老人常说的那句话,“低不成,高不就”。
        还望高人指点一二。