MySql 多表联合语句优化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shy415502155/article/details/82977801

explain SQL性能测试返回值的具体含义如下:
  

mysql>explain select * from table;

       | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
  table #显示该语句涉及的表
  type #这列很重要,显示了连接使用了哪种类别,有无使用索引,反映语句的质量。
  possible_keys #列指出MySQL能使用哪个索引在该表中找到行
  key #显示MySQL实际使用的键(索引)。如果没有选择索引,键是NULL。
  key_len #显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。使用的索引的长度。在不损失精确性的情况下,长度越短越好
  ref #显示使用哪个列或常数与key一起从表中选择行。
  rows #显示MySQL认为它执行查询时必须检查的行数。
  extra #包含MySQL解决查询的详细信息。
  其中:Explain的type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:
  system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL(优-->差)
  一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题;
多表查询实例:

 SELECT  suser.user_id,suser.org_id,suser.identity,suser.user_loginname,suser.user_mobile,suser.insert_time,GROUP_CONCAT(c.card_no) user_mail, puser.user_mobile FROM org_user suser
 LEFT JOIN student s ON suser.user_id=s.user_id AND suser.org_id=s.org_id AND suser.identity=2 AND suser.is_del=0 AND s.is_del=0 
 LEFT JOIN card c  ON s.stud_id = c.stud_id 
 LEFT JOIN student2parent sp ON sp.stud_id=s.stud_id AND sp.is_del=0 
 LEFT JOIN parent p ON p.parent_id=sp.parent_id AND p.is_del=0 AND p.org_id=s.org_id AND p.org_id=suser.org_id 
 LEFT JOIN org_user puser ON p.org_id=puser.org_id AND p.user_id=puser.user_id AND puser.org_id=suser.org_id AND puser.org_id=s.org_id AND puser.is_del=0 AND puser.identity=0 
 WHERE 1=1
 AND LOCATE('132', puser.user_mobile)>0;

查询的结果:18.969

使用explain查看执行计划:

 EXPLAIN 
 SELECT  suser.user_id,suser.org_id,suser.identity,suser.user_loginname,suser.user_mobile,suser.insert_time,GROUP_CONCAT(c.card_no) user_mail, puser.user_mobile FROM org_user suser
 LEFT JOIN student s ON suser.user_id=s.user_id AND suser.org_id=s.org_id AND suser.identity=2 AND suser.is_del=0 AND s.is_del=0 
 LEFT JOIN card c  ON s.stud_id = c.stud_id 
 LEFT JOIN student2parent sp ON sp.stud_id=s.stud_id AND sp.is_del=0 
 LEFT JOIN parent p ON p.parent_id=sp.parent_id AND p.is_del=0 AND p.org_id=s.org_id AND p.org_id=suser.org_id 
 LEFT JOIN org_user puser ON p.org_id=puser.org_id AND p.user_id=puser.user_id AND puser.org_id=suser.org_id AND puser.org_id=s.org_id AND puser.is_del=0 AND puser.identity=0 
 WHERE 1=1
 AND LOCATE('132', puser.user_mobile)>0;

执行结果为:

从结果可以看出,表c(card)的type为ALL

查看card表的索引

未发现s.stud_id = c.stud_id 中stud_id设为索引,将该列添加索引

重新执行该SQL语句,查看结果:2.688

查看SQL的执行计划:

type由 ALL----->ref,查询结果显著的提升

猜你喜欢

转载自blog.csdn.net/shy415502155/article/details/82977801