如图,person为用户表,person_question为回答问题表,一个用户可多次回答问题。
查询结果:查询全部用户,排序,questionflag不为空,表示该用户回答过问题。
查询近4000条数据却需要6秒多,经反复验证,将left join换其他查询方式会快很多,但是与所需结果背离。
使用数据库为mysql,求大神指点

解决方案 »

  1.   

    以文本方式贴出  不要贴截图
    explain select ...
    show index from ..
    以供分析。
      

  2.   


    你说的没懂,能不能详细说一下。
    代码如下:
    SELECT DISTINCT b.open_id AS questionflag,p.id, p.phone, p.risk_level, p.nickname, p.open_id, 
    p.headimgurl, p.sex, p.city, p.province, p.country,p.use_status, p.create_date, p.source, p.unique_code
    FROM person p LEFT JOIN person_question b ON p.open_id=b.open_id ORDER BY p.create_date desc,p.id
      

  3.   

    distinct 去掉的效果如何?返回的结果有多少?
      

  4.   

    去掉distinct 的话结果有5000多近6000条,和我所要的结果不一样。
    我想要的结果是查询该用户是否回答过问题,而不是把每次回答的记录查询出来
    用户共计4000名
      

  5.   

    试试 select  ... from p left join (select open_id from b group by open_id) a on p.open_id= a.open_id
      

  6.   

    去掉distinct 的话结果有5000多近6000条,和我所要的结果不一样。
    我想要的结果是查询该用户是否回答过问题,而不是把每次回答的记录查询出来
    用户共计4000名主要是评估十效率,如果 DISTINCT 去掉后效率好,说明问题在 DISTINCT 上,想办法调整 DISTINCT 操作
      

  7.   


    谢回,比原来快了近2秒,需要4.822秒,是否有更好的解决方案先不要加排序:
    表 person多大,单独运行 select * from p, 看看多少时间 ,这个是基础时间,减不了的
    表person_question多大,单独运行 select open_id from person_question group by open_id,需要多少时间。  
      

  8.   


    谢回,比原来快了近2秒,需要4.822秒,是否有更好的解决方案先不要加排序:
    表 person多大,单独运行 select * from p, 看看多少时间 ,这个是基础时间,减不了的
    表person_question多大,单独运行 select open_id from person_question group by open_id,需要多少时间。  select * from person需要1.2秒
    select open_id from person_question group by open_id需要0.2秒
    select  ... from person p left join (select open_id from person_question group by open_id) a on p.open_id= a.open_id  5.05秒
    带排序ORDER BY p.create_date desc,p.id需要6.46秒