mysql两个单表都在30万数据的表联合查询,查询时间长,求优化

  现在有两个表,每个表的数据量 30万左右 。表一的id和表2的res_id是关联的,因为表2和另一张表关联,所以无法做外键。
现在需求是 检索条件都在表一,但是排序是根据表二的字段排序。普通写法最后结果,都在5S以上速度太慢。求大神给出优化意见。刚才没有补充,on后面都是主键,where后面的都建立了普通索引,orderby 后面的也是普通索引。

sql 如下:

 SELECT 
    a.id,
    a.title,
    a.type,
    a.digest,
    a.file_type,
    a.file_sufix,
    a.bpackage,
    a.author_name,
    a.source,
    a.source_name,
    a.org_name,
    b.download_count,
    b.preview_count,
    b.favorite_count,
    a.author,
    a.section_name,
    a.subject_name,
    a.version_name,
    a.material_name,
    a.chapter_name,
    b.evaluate_count 
  FROM
    res_resource a 
    LEFT JOIN res_statistics b 
      ON a.id = b.res_id 
  WHERE a.dflag = 0 
    AND a.sflag = 1 
    AND a.publish_status = '1' 
  ORDER BY overall_score DESC LIMIT 0,10

表1
表1


表2
表2

on 条件后边的字段,where条件后边的字段,order by 后边的字段,建索引

建索引能加快查询速度。

加索引,加主键,数据量太大就加分区表,sql关系尽量简洁.

  1. mysql表设计合理且有设置缓存和索引等的话,肯定是比自己程序去逐表查取更简洁,高效。专业的事情让专业的工具去做,关系库就是干这个的。
  2. 不过不建议3表以上的连接查询(可优化表设计,简化业务逻辑和使用程序分步解析数据),sql复杂代码不易维护,且大数据量带来麻烦时,要考虑分库分表或使用分布式框架

根据where条件中使用到的字段进行添加单索引或者联合索引,联合索引使用时注意先后顺序

换逻辑吧,这种方式都不对,排序是最浪费时间的了

索引建太多也不是太好,建议如果数据不是经常变动的话可以使用nosql,避免查询时间过长。分库分表也是不错的选择

select tmp.*,b.download_count,b....
from (
select
a.id,
a.title,
a.......
from res_resource a
where a.dflag = 0
and a.sflag = 1
and a.publish_status = '1'
order by overall_score desc
limit 0,10
) tmp
left join res_statistics b
on tmp.id = b.res_id

试试这样写,还有尽量用inner join

看where后面都是A的条件,你先查处A满足条件的集合然后再order by,也就是使用子查询的方式。
有条件的话楼主把explain的结果贴上来

用EXPLAIN检验一下索引是否生效,这才几十万数据,建索引的话不至于那么慢的。

先考虑所有的条件字段建索引,也可以考虑做range分区,再不行就加es。