现在有两个表,每个表的数据量 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
on 条件后边的字段,where条件后边的字段,order by 后边的字段,建索引
建索引能加快查询速度。
加索引,加主键,数据量太大就加分区表,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。