mysql查询索引数组_mysql查询当in里的数组过大时,索引(explain)不好使的问题...

1、t_track表设计:

d8f9593c60d57ea7ef90fbfefa8f391a.png

2、t_sales表设计无t_track_id,通过t_track表的t_sale_id关联

3、查询语句:

explain SELECT COUNT(*) FROM ((SELECT `t_sales`.`t_id`, `t_sales`.`t_company`, `t_sales`.`t_fenlei`, `t_sales`.`t_tel`, `t_sales`.`province`, `t_sales`.`city`, `t_track`.`t_id` AS `track_id`, `t_track`.`t_content`, `t_track`.`t_dateline`, `t_track`.`contact_id`, `trace_cat`.`name` AS `cat_id`, `t_city_2`.`city_name`, `t_user`.`t_realname` FROM `t_sales` right join (select *from t_track where t_track.t_uid in (216,220,4507,4508,4509,4510,4511,4629,5292,5602,6186,6187,301,337,2770,1114,2144,2482,2587,336,2848,3386,1910,1970,955,3091,3148,3924,3951,4302,4467,5374,5668,5736,6041,6092,6093,6130,6131,6470,6662,6663,6793,1992,2642,3620,3639,3882,3917,4948,6244,6807) ORDER BY t_track.t_dateline DESC) t_track ON t_sales.t_id = t_track.t_sale_id left join `t_city_2` ON t_sales.t_city = t_city_2.t_id left join `t_user` ON t_track.t_uid = t_user.t_id left join `trace_cat` ON t_track.cat_id = trace_cat.id WHERE (`t_user`.`t_id` IN ('216', '220', '4507', '4508', '4509', '4510', '4511', '4629', '5292', '5602', '6186', '6187', '301', '337', '2770', '1114', '2144', '2482', '2587', '336', '2848', '3386', '1910', '1970', '955', '3091', '3148', '3924', '3951', '4302', '4467', '5374', '5668', '5736', '6041', '6092', '6093', '6130', '6131', '6470', '6662', '6663', '6793', '1992', '2642', '3620', '3639', '3882', '3917', '4948', '6244', '6807')) AND (t_track.t_sale_id IS NOT NULL and (t_track.contact_id IS NULL or t_track.contact_id=0)) GROUP BY `t_track`.`t_sale_id`) UNION ( SELECT `t_sales`.`t_id`, `t_sales`.`t_company`, `t_sales`.`t_fenlei`, `t_sales`.`t_tel`, `t_sales`.`province`, `t_sales`.`city`, `t_track`.`t_id` AS `track_id`, `t_track`.`t_content`, `t_track`.`t_dateline`, `t_track`.`contact_id`, `trace_cat`.`name` AS `cat_id`, `t_city_2`.`city_name`, `t_user`.`t_realname` FROM `t_sales` right join (select *from t_track where t_track.t_uid in (216,220,4507,4508,4509,4510,4511,4629,5292,5602,6186,6187,301,337,2770,1114,2144,2482,2587,336,2848,3386,1910,1970,955,3091,3148,3924,3951,4302,4467,5374,5668,5736,6041,6092,6093,6130,6131,6470,6662,6663,6793,1992,2642,3620,3639,3882,3917,4948,6244,6807) ORDER BY t_track.t_dateline DESC) t_track ON t_sales.t_id = t_track.t_sale_id inner join `contact` ON contact.id = t_track.contact_id left join `t_city_2` ON t_sales.t_city = t_city_2.t_id left join `t_user` ON t_track.t_uid = t_user.t_id left join `trace_cat` ON t_track.cat_id = trace_cat.id WHERE (`t_user`.`t_id` IN ('216', '220', '4507', '4508', '4509', '4510', '4511', '4629', '5292', '5602', '6186', '6187', '301', '337', '2770', '1114', '2144', '2482', '2587', '336', '2848', '3386', '1910', '1970', '955', '3091', '3148', '3924', '3951', '4302', '4467', '5374', '5668', '5736', '6041', '6092', '6093', '6130', '6131', '6470', '6662', '6663', '6793', '1992', '2642', '3620', '3639', '3882', '3917', '4948', '6244', '6807')) AND (t_track.t_sale_id IS NOT NULL and t_track.contact_id!=0 and t_track.contact_id IS NOT NULL) GROUP BY `t_track`.`contact_id` )) `tmpA`

4、执行结果:

t_track的type为All,是非常糟糕的。

759da6cecd466c396617d257b18e4e3c.png

注:1、t_uid已经加了索引;2、当查询语句in里面的数组小于等于12时,type会有好转。

5、这种问题该怎么解决:

(1)、优化查询语句?

(2)、改变表结构,重新设计?

(3)、除了这两种以外还有别的办法吗?

还望详细说明解释。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值