以下是我的表结构:这三张表我需要做三表联合查询。目前遇到的问题是:user表和role_user表的数据分别是10万左右,而取出10条数据却需要3秒多。SQL语句如下:
SELECT user.id,user.regdate,role.name FROM `user` LEFT JOIN `role_user` ON user.id = role_user.uid LEFT JOIN `role` ON role_user.rid=role.id WHERE user.pid=1 AND role.type=1 GROUP BY user.id ORDER BY user.id desc LIMIT 10上面的SQL语句如果不加where条件中的role.type=1,耗时是0.0008秒。一旦加上,就需要3秒多。我使用explain看了下,如下所示:请教各位大侠,该条SQL语句应该怎样优化呢?

解决方案 »

  1.   

    上面的SQL语句如果不加where条件中的role.type=1,耗时是0.0008秒。贴出不加这个时的 explain select 不要以图的方式贴,以文本方式贴出以便分析。
      

  2.   


    id :1
    select_type:  SIMPLE   
    table: user      
    type: index     
    possible_keys: pid    
    key: PRIMARY         
    key_len:4     
    ref: NULL    
     rows: 10    
    Extra:Using where
    --------------------------------------------------------------------------------
    id :1
    select_type:  SIMPLE   
    table: role_user      
    type: ref     
    possible_keys: uid   
    key: uid        
    key_len:4     
    ref: dchope_db.user.id   
     rows: 1    
    Extra:
    --------------------------------------------------------------------------------
    id :1
    select_type:  SIMPLE   
    table: role      
    type: eq_ref   
    possible_keys: PRIMARY  
    key: PRIMARY        
    key_len:2     
    ref: dchope_db.role_user.rid  
     rows: 1    
    Extra:
      

  3.   

    UID与USER。ID没EQ——REF???类型不一致?按道理来说加上限定应该更快的
      

  4.   

    说明在扫描role表耗时了,建议将where的两个条件的先后顺序换下试试。我也是猜的
      

  5.   

    现在最纳闷的就是,不加条件 role.type=1  查询速度是很快的,可一旦加上,速度就变慢了。不知道问题出在哪里了?
      

  6.   

    在ROLE的ID、TYPE上建立复合索引,并强制使用此索引试试
      

  7.   


    已建立ID,TYPE的复合索引,同时也强制使用了,但还是不起作用。
      

  8.   

    把带条件,和不带那个条件下语句的explain select ...均以文本方式贴出一下, 不要用/G参数。
      

  9.   


    已建立ID,TYPE的复合索引,同时也强制使用了,但还是不起作用。
    贴你的SQL语句、SHOW INDEX