求个能把一对多变成 一对一,或者更好的方案

qq_40164181 2017-12-31 01:31:11
有个联系表记录, table A
现在要统计,某个月份内,联系各客户等级的数量.
关联 table B 看这个客户的等级

A表一个月内大概 10w条数据 , 然后客户信息表,也是10w条. 每次查询都要20秒左右,才可以

SELECT b.label,count(distinct b.namel) FROM table AS a
RIGHT JOIN table AS b ON a.`relation_id` = b.id
where a.`create_time` >= '2017-04-01 00:00:00'
and a.`create_time` < '2017-05-01 00:00:00'
where a.`type` = 'client'
GROUP BY b.label;

现在的思路就是 看能不能,在 where 的时候就把 重复的 relation_id 给过滤掉?

不过我把 type 和 create_time 和 relation_id 建立成一个索引了
也不知道是不是,索引创建有误,望指点一下.
...全文
1336 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
传说之心 2018-01-20
  • 打赏
  • 举报
回复
用nosql吧,比如mongodb,方便扩展,你想新增几个属性就新增几个属性,没有字段定没定义的限制,要一对一就一对一,要一对多就把属性值保存成数组,反正存储的是json格式
qq_40164181 2018-01-16
  • 打赏
  • 举报
回复
顶顶,看看有高人不
qq_40164181 2018-01-07
  • 打赏
  • 举报
回复
顶顶,这样不能结贴了啊
qq_40164181 2018-01-05
  • 打赏
  • 举报
回复
引用 3 楼 Inter_Ares 的回复:
20秒只是查询的时间还是连显示的时间也包含在内了? 如果检索出来的数据很多,要把这些数据显示出来也是需要时间的
这是 navicat 计算的,还真不清楚
Rotel-刘志东 2018-01-04
  • 打赏
  • 举报
回复
索引创建没有毛病relation_id type create_time
Inter_Ares 2018-01-04
  • 打赏
  • 举报
回复
20秒只是查询的时间还是连显示的时间也包含在内了? 如果检索出来的数据很多,要把这些数据显示出来也是需要时间的
qq_40164181 2018-01-04
  • 打赏
  • 举报
回复
引用 1 楼 zjcxc 的回复:
看起来没毛病,条件都在 a 表上,确保 a 表的条件列是有索引的 如果你的一对多的多是在 a 表,那么试试使用子查询 WHERE b.id IN (SELCT a.relation_id 。。。。 )
IN 里面的数量有点多,好像没效果,不过好像是能做到分开,关联查询的效果
zjcxc 2018-01-02
  • 打赏
  • 举报
回复
看起来没毛病,条件都在 a 表上,确保 a 表的条件列是有索引的 如果你的一对多的多是在 a 表,那么试试使用子查询 WHERE b.id IN (SELCT a.relation_id 。。。。 )

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧