1. in型子查询引出的陷阱:(扫更少的行,不要临时表,不要文件排序就快)
  2.  
  3. 题: ecshop商城表中,查询6号栏目的商品, (注,6号是一个大栏目)
  4. 最直观的: mysql> select goods_id,cat_id,goods_name from goods where cat_id in (select cat_id from category where parent_id=6);
  5.  
  6. 误区: 给我们的感觉是, 先查到内层的6号栏目的子栏目,如7,8,9,11
  7. 然后外层, cat_id in (7,8,9,11)
  8.  
  9. 事实: 如下图, goods表全扫描, 并逐行与category表对照,看parent_id=6是否成立

  1. 原因: mysql的查询优化器,针对In型做优化,被改成了exists的执行效果.
  2. goods表越大时, 查询速度越慢.
  3.  
  4. 改进: 用连接查询来代替子查询
  5. explain select goods_id,g.cat_id,g.goods_name from goods as g
  6. inner join (select cat_id from category where parent_id=6) as t
  7. using(cat_id) \G
  8.  
  9. 内层 select cat_id from ecs_category where parent_id=6 ; 用到Parent_id索引, 返回4
  10. +--------+
  11. | cat_id |
  12. +--------+
  13. | 7 |
  14. | 8 |
  15. | 9 |
  16. | 11 |
  17. +--------+ 形成结果,设为t
  18.  
  19. *************************** 3. row ***************************
  20. id: 2
  21. select_type: DERIVED
  22. table: ecs_category
  23. type: ref
  24. possible_keys: parent_id
  25. key: parent_id
  26. key_len: 2
  27. ref:
  28. rows: 4
  29. Extra:
  30. 3 rows in set (0.00 sec)
  31.  
  32. 2次查询,
  33. t goods 通过 cat_id 相连,
  34. 因为cat_id goods表中有索引, 所以相当于用7,8,911,快速匹配上 goods的行.
  35. *************************** 2. row ***************************
  36. id: 1
  37. select_type: PRIMARY
  38. table: g
  39. type: ref
  40. possible_keys: cat_id
  41. key: cat_id
  42. key_len: 2
  43. ref: t.cat_id
  44. rows: 6
  45. Extra:
  46.  
  47. 1次查询 :
  48. 是把上面2次的中间结果,直接取回.
  49. *************************** 1. row ***************************
  50. id: 1
  51. select_type: PRIMARY
  52. table: <derived2>
  53. type: ALL
  54. possible_keys: NULL
  55. key: NULL
  56. key_len: NULL
  57. ref: NULL
  58. rows: 4
  59. Extra:
  60. exists子查询:
  61. 题: 查询有商品的栏目.
  62. 按上面的理解,我们用join来操作,如下:
  63. mysql> select c.cat_id,cat_name from ecs_category as c inner join goods as g
  64. on c.cat_id=g.cat_id group by cat_name; (见36)
  65.  
  66. 优化1: group时, 用带有索引的列来group, 速度会稍快一些,另外,
  67. int char 分组,也要快一些.(见37)
  68.  
  69. 优化2: group时, 我们假设只取了A表的内容,group by 的列,尽量用A表的列,
  70. 会比B表的列要快.(见38)
  71.  
  72. 优化3: 从语义上去优化
  73. select cat_id,cat_name from ecs_category where exists(select *from goods where goods.cat_id=ecs_category.cat_id) (见40)
  74.  
  75. | 36 | 0.00039075 | select c.cat_id,cat_name from ecs_category as c inner
  76. join goods as g on c.cat_id=g.cat_id group by cat_name
  77. |
  78. | 37 | 0.00038675 | select c.cat_id,cat_name from ecs_category as c inner
  79. join goods as g on c.cat_id=g.cat_id group by cat_id
  80. |
  81. | 38 | 0.00035650 | select c.cat_id,cat_name from ecs_category as c inner
  82. join goods as g on c.cat_id=g.cat_id group by c.cat_id
  83. |
  84. | 40 | 0.00033500 | select cat_id,cat_name from ecs_category where exists
  85. (select * from goods where goods.cat_id=ecs_category.cat_id)
  86. |
  87.  
  88. from 型子查询:
  89. 注意::内层from语句查到的临时表, 是没有索引的.因为是一个临时形成的结果。
  90. 所以: from的返回内容要尽量少.

mysql优化---in型子查询,exists子查询,from 型子查询的更多相关文章

  1. 8.2.1.2 How MySQL Optimizes WHERE Clauses MySQL 优化WHERE 子句

    8.2.1.2 How MySQL Optimizes WHERE Clauses MySQL 优化WHERE 子句 本节讨论优化用于处理WHERE子句, 例子是使用SELECT 语句,但是相同的优化 ...

  2. MySQL 子查询 EXISTS 和 NOT EXISTS(转)

    MySQL EXISTS 和 NOT EXISTS 子查询 MySQL EXISTS 和 NOT EXISTS 子查询语法如下: SELECT ... FROM table WHERE EXISTS ...

  3. MySql优化子查询

    用子查询语句来影响子查询中产生结果rows的数量和顺序. For example: SELECT * FROM t1 WHERE t1.column1 IN (SELECT column1 FROM ...

  4. MYSQL优化派生表(子查询)在From语句中的

    Mysql 在5.6.3中,优化器更有效率地处理派生表(在from语句中的子查询): 优化器推迟物化子查询在from语句中的子查询,知道子查询的内容在查询正真执行需要时,才开始物化.这一举措提高了性能 ...

  5. MySQL开发——【联合查询、多表连接、子查询】

    联合查询 所谓的联合查询就是将满足条件的结果进行拼接在同一张表中. 基本语法: select */字段 from 数据表1 union [all | distinct] select */字段 fro ...

  6. MySQL之多表查询一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习

    MySQL之多表查询 阅读目录 一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习 一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 首先说一下,我们写项目一般都会建 ...

  7. SQL 子查询 EXISTS 和 NOT EXISTS

    MySQL EXISTS 和 NOT EXISTS 子查询语法如下: SELECT … FROM table WHERE EXISTS (subquery) 该语法可以理解为:将主查询的数据,放到子查 ...

  8. (5)MySQL的查询:模糊查询(通配符查询like)、限制符查询(limit)、排序查询(order by)、分组查询(group by)、(子查询)

    注意事项 指令语法的优先级: where > group by >order by > limit 例:select count(id) as cnt,age from tablen ...

  9. Mysql优化系列之——优化器对子查询的处理

    根据子查询的类型和位置不同,mysql优化器会对查询语句中的子查询采取不同的处理策略,其中包括改写为连接(join),改写为半连接(semi-join)及进行物化处理等. 标量子查询(Scalar S ...

随机推荐

  1. BZOJ 3130 [Sdoi2013]费用流 ——网络流

    [题目分析] 很容易想到,可以把P放在流量最大的边上的时候最优. 所以二分网络流,判断什么时候可以达到最大流. 流量不一定是整数,所以需要实数二分,整数是会WA的. [代码] #include < ...

  2. [BZOJ1575] [Usaco2009 Jan]气象牛Baric(DP)

    传送门 DP f[i][j]表示前i个中选j个的最优解 预处理g[i][j]表示选i~j对答案的贡献 那么就可以n^3乱搞了! 注意边界 #include <cstdio> #includ ...

  3. Garbage First介绍

    本文摘自<构建高性能的大型分布式Java应用>一书,Garbage First简称G1,它的目标是要做到尽量减少GC所导致的应用暂停的时间,让应用达到准实时的效果,同时保持JVM堆空间的利 ...

  4. 【BZOJ3514】Codechef MARCH14 GERALD07加强版(LCT)

    题意:N个点M条边的无向图,q次询问保留图中编号在[l,r]的边的时候图中的联通块个数. 询问加密,强制在线 n,m,q<=200000 题意:RYZ作业 以下转载自hzwer http://h ...

  5. unity的List构造函数在IOS平台存在缺陷

    当迩使用一个int[]或者string[]类似的数组时,以数组来初始化List对象,有可能在IOS平台上会出现初始化对象为空,比如 , }; List<int> listTest = ne ...

  6. iOS7 毛玻璃效果

    转自:http://prolove10.blog.163.com/blog/static/138411843201391401054305/ 原图:  效果图:  实现:首先需要导入Accelerat ...

  7. HUNAN 11562 The Triangle Division of the Convex Polygon(大卡特兰数)

    http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11562&courseid=0 求n边形分解成三角形的 ...

  8. 属性font-family:Font property font-family does not have generic default

    以前定义字体都是用的常用的字体,也没注意过会有这个提示,昨天在写界面的时候重新定义了一个本地没有的字体,发现会有提示. W3C的文档: font-family:<family-name>, ...

  9. @InsertProvider 根据bean属性,自动生成插入sql语句

    以Test为例,用mybatis的@InsertProvider的注解插入数据的时候,每次都要写类似于 Mapper类 @Mapper public interface TestDao { @Inse ...

  10. 前端进阶之路:初涉Less

    阅读目录 一.Less介绍 1.官方介绍 2.自己理解 3.Less.Sass.Stylus 二.Less使用入门 1.开发模式下使用Less 2.运行模式下使用Less 三.常见用法示例 1.从第一 ...