innodb - mysql数据库join优化问题
迷茫
迷茫 2017-04-17 10:58:16
0
1
729

最近在读简朝阳大牛的《MySQL性能调优与架构设计》,看到关于join的优化有个问题不得解,如下:

基本优化原则一:永远用小的结果集驱动大的结果集

他的解释是:因为驱动结果集越大,意味着需要循环的次数越多,也就是说在被驱动结果集上面所 需要执行的查询检索次数会越多。比如,当两个表(表 A 和 表 B) Join 的时候,如果表 A 通过 WHERE 条件过滤后有 10 条记录,而表 B 有 20 条记录。如果我们选择表 A 作为驱动表,也就是被驱动表的结果集为 20,那么我们通过 Join 条件对被驱动表(表 B)的比较过滤就会有 10 次。反之,如果我们选择表 B 作为驱动表,则需要有 20 次对表 A 的比较过滤。

那么,我现在又如下sql语句:

SELECT A.ap_id,A.ap_rank,A.ap_name,
  A.ap_releasedate,A.ap_price,A.ap_permalink,
  A.ap_keyword,A.ap_down,A.ap_size,
  A.ap_score,A.ap_times,A.ap_like,A.ap_description,
  A.sys_time,A.ap_icon,A.ap_httppath,A.ap_path1,
  A.ap_path2,P.pd_name, C.cat_name 
  FROM mb_apps1 AS A  
  LEFT JOIN mb_sys_category AS C 
  ON A.ap_cat=C.cat_no 
  LEFT JOIN mb_product AS P 
  ON A.ap_productid=P.pd_id 
  WHERE A.label>=1 AND A.ap_os=29 
  ORDER BY A.ap_like 
  DESC LIMIT 12

其中A表示主表,数据量100万,C表和P表示从表,C表数据量100,P表数据量10万。请问大家该如何按照他书上说的方式优化查询?不胜感激!

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

reply all(1)
PHPzhong

我把简朝阳同学的微博回复贴过来

注意是结果集不是表,比如你这里说到的C表是100,A表是100万,P表是10万,但是A表有过滤条件(a.label>=1 and a.ap_os=29),过滤完之后有多少才是关键.此外,小的结果集驱动大的结果集是基础,但Join的过程也是一个关键点,join条件上的索引也是关键

你这里A表过滤后如果记录数还是较多,建议可以在A表的ap_cat以及ap_productid上建索引,同时在p表的pd_id上建索引,至于是否需要将a.ap_os以及a.label放到a.ap_cat的索引中建成组合索引就要看后面的实际效果了.


Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template