ZackLee 2017-04-11 22:38:18 5073次浏览 2条回复 1 0 0

问题描述: 1、MYSQL语句如下,一大堆的LEFT JOIN,外加一个in的大数组,查询很慢,效率差,如何改造呢?

2、explain不起作用了。

3、采用MYSQL递归查询找出所有下级的方式原来试过,但是不好用,出现的问题是,比如说:前面注册了10个用户,后面再注册1个用户,也就是第11个用户的时候必须是前面用户的下级,要是是他们的上级那就找不出来了,怎么解决?

SELECT COUNT(*) FROM t_sales LEFT JOIN t_user ON t_sales.t_for_sale = t_user.t_id LEFT JOIN company ON t_sales.company_id = company.id LEFT JOIN t_city_2 ON t_sales.t_city = t_city_2.t_id LEFT JOIN t_sales_from ON t_sales.t_from = t_sales_from.t_id LEFT JOIN t_sales_status ON t_sales.t_status = t_sales_status.t_id LEFT JOIN custom_category ON t_sales.t_fenlei = custom_category.id WHERE t_for_sale IN ('216', '220', '4507', '4508', '4509', '4510', '4511', '4629', '5292', '5602', '6186', '6187', '7018', '301', '337', '2770', '1114', '2144', '2482', '2587', '336', '2848', '3386', '1910', '1970', '955', '3148', '3924', '3951', '4302', '4467', '5374', '5668', '5736', '6041', '6092', '6093', '6130', '6131', '6470', '6662', '3091', '6663', '6793', '6882', '7058', '7059', '1992', '2642', '3620', '3639', '3882', '3917', '4446', '4948', '6244') 语句LEFT JOIN和IN的目的: LEFT JOIN 1、根据id获取它表对应name。(注意:可能存在一对多,或者多对多的关系) IN 2、查找我所有下属的数据。

计划改造方案 1、原表结构设计不动,把LEFT JOIN去掉,然后把每一个类型,比如:上面的城市t_city_2数据全部取出来,然后在列表输出的时候通过键值对去匹配输出name。

2、IN方面的处理打算采用EXISTS。效率是不是会高一些?

建议或意见收集 1、针对以上的问题希望能在这里找到答案。

2、关于我们的计划改造方案有何不足之处吗?

  • 回复于 2017-04-12 13:54 举报

    LEFT JOIN company ON t_sales.company_id = company.id
    LEFT JOIN t_city_2 ON t_sales.t_city = t_city_2.t_id
    这里是不必要连表查的,查出id,用缓存查会效率更高,因为公司和城市这种更新不是很频繁,数据量也不是很多
    LEFT JOIN t_sales_from ON t_sales.t_from = t_sales_from.t_id
    LEFT JOIN t_sales_status ON t_sales.t_status = t_sales_status.t_id
    这也不必要连表查,多次查询,减少锁,效果会更好
    LEFT JOIN custom_category ON t_sales.t_fenlei = custom_category.id
    这个也可以用缓存查
    总的来说业务逻辑和程序设计不是很合理,建立灵活运用

    3 条回复
    回复于 2017-04-12 17:45 回复

    那in里面呢,怎么解决?查找所有下属

    回复于 2017-04-13 10:26 回复

    如果按以上方案,会优化不少,in是可以用到索引的,建好索引就好了,这样就差不多了

    回复于 2017-04-20 19:29 回复

    in除了用索引没其它解决方法了?

  • 回复于 2017-06-19 16:47 举报

    In一两百都几乎没有多大影响sql性能,最影响的是你的左关联查询。内关联会比左关联性能要好,单表查询会比多表关联性能好。

您需要登录后才可以回复。登录 | 立即注册