这个sql查询如何优化?

lengmianshi 发布于 2017/03/27 22:41
阅读 276
收藏 2

explain下:

EXPLAIN SELECT
        company1_.cc_id AS col_0_0_,
        company1_.cc_company_name AS col_1_0_,
        company1_.cc_logo AS col_2_0_,
        recruitmen0_.cr_id AS col_3_0_,
        recruitmen0_.cr_position_name AS col_4_0_,
        recruitmen0_.cr_post_date AS col_5_0_,
        recruitmen0_.cr_welfware AS col_6_0_,
        recruitmen0_.cr_salary_range AS col_7_0_,
        recruitmen0_.cr_city_id AS col_8_0_,
        recruitmen0_.cr_county_id AS col_9_0_,
        recruitmen0_.cr_lat AS col_10_0_,
        recruitmen0_.cr_lng AS col_11_0_,
        recruitmen0_.cr_reward AS col_12_0_,
        recruitmen0_.cr_reward_flag AS col_13_0_,
        recruitmen0_.cr_chosen AS col_14_0_ 
    FROM
        co_recruitment recruitmen0_ CROSS 
    JOIN
        co_company company1_ CROSS 
    JOIN
        co_job job2_ 
    WHERE
        recruitmen0_.cr_company_id=company1_.cc_id 
        AND recruitmen0_.cr_is_delete=0 
        AND recruitmen0_.cr_check=1
        AND recruitmen0_.cr_job_category=job2_.cj_id 
        AND job2_.cj_type=545
        AND recruitmen0_.cr_city_id=198
    ORDER BY
        recruitmen0_.cr_reward_flag DESC,
        recruitmen0_.cr_chosen DESC,
        recruitmen0_.cr_post_date DESC LIMIT 1,10
结果:

表数据只上百条,查询最快7 百多毫秒,慢则要1.9秒。已为所有连接字段或是查询字段添加索引,为何会这么慢呢?该如何优化,求大神指点一下!

加载中
0
您的好友
您的好友

1. 不要用 CROSS  JOIN  
2. 把两表关联的条件放在ON
3. 给ON里的条件做索引,或者补充成现有的索引

 

SELECT * FROM co_recruitment recruitmen0_ 
LEFT JOIN  co_company company1_ ON  recruitmen0_.cr_company_id=company1_.cc_id 
LEFT JOIN  co_job job2_ ON job2_.cj_type=545 AND recruitmen0_.cr_job_category=job2_.cj_id
WHERE  
    recruitmen0_.cr_is_delete=0 
    AND recruitmen0_.cr_check=1
    AND recruitmen0_.cr_city_id=198

 

l
lengmianshi
回复 @您的好友 : 之前是hibernate的,我换成jdbc后响应快很多了
l
lengmianshi
回复 @您的好友 : 多谢
您的好友
您的好友
你查询的结果肯定是一样的啊 既然是优化 总是也有不一样的地方啊
l
lengmianshi
回复 @您的好友 : mysql下cross join+where与left join+on是一回事的
您的好友
您的好友
你删除一个join看看 是哪个表的问题 检查一下索引
下一页
0
蓝水晶飞机
蓝水晶飞机

最慢的就是各种join。

最简单的就是SELECT,按ID查数据,也是最快的。

为了效率不用join,在应用里面去实现关联查询,配上缓存系统,数据库真的就像一个仓库。

l
lengmianshi
之前是hibernate的,我换成jdbc后响应快很多了
0
l
lengmianshi

引用来自“蓝水晶飞机”的评论

最慢的就是各种join。

最简单的就是SELECT,按ID查数据,也是最快的。

为了效率不用join,在应用里面去实现关联查询,配上缓存系统,数据库真的就像一个仓库。

按条件来搜索查询的,如何用得上id呢?

0
m
mzmlx2009

order by 应该也需要

l
lengmianshi
ordey by也需要什么啊,索引吗,已经加了
0
l
lengmianshi

这个方法我改用jdbc来替代hibernate,发现响应会快很多,可能是表的字段比较吧

返回顶部
顶部