在日常优化过程中,发现一个怪事情,同一个SQL出现两个完全不一样执行计划,left join 连驱动表都可以变成不一样。

对于left join,如果where条件里有被关联表过滤,left join有可能被转成inner join ,本案例中shopInfo有ShopCategory = 'LOC'过滤条件; 保证shopInfo的记录非NULL,因此left join在优化过程中可以转为inner join。 那么O和S的JOIN顺序就是可以交换的。

验证结论:

创建表:

--班级表CREATE TABLE T_CLASS(  class_id int not null,  class_name VARCHAR2(100));添加索引alter table T_CLASS add index inx_class_id(class_id);

案例2: A表和B表均有where条件且不为null

案例3:A表和B表均有where条件且不为null,删除B表索引

结论:

left join 只有被关联表有where条件,且其过滤条件优于关联表的情况下,mysql优化器才转成inner join.

更多相关文章

  1. MySQL系列多表连接查询92及99语法示例详解教程
  2. Linux下MYSQL 5.7 找回root密码的问题(亲测可用)
  3. MySQL 什么时候使用INNER JOIN 或 LEFT JOIN
  4. Android(安卓)多媒体扫描过程(Android(安卓)Media Scanner Proces
  5. Android(安卓)Chromium WebView html js 开发系列
  6. Android(安卓)Calendar使用过程中遇到的问题
  7. CyanogenMod 编译 Google Galaxy Nexus (GSM) 全过程
  8. Android(安卓)启动过程
  9. Android(安卓)启动过程(2)

随机推荐

  1. Android中如何自定义view
  2. android 倒计时
  3. Android(安卓)EditText样式
  4. Android CheckBox控件使用OnClickListene
  5. 《android的事件分发机制》
  6. Android getSystemService
  7. Momo自定义DialogFragment
  8. Android Studio NDK Opencv fatal error:
  9. Android学习笔记_20_访问应用权限汇总
  10. Android应用程序启动过程源代码分析(3)