请问:我把mysql的join改写成两条,但where条件遇到问题

请问:我把mysql的join改写成两条,但where条件遇到问题
比如:
sql = select * from order o join user u on u.user_id = o.user_id where u.type = '微信注册'
因为user 表被迁到其他的数据库,只能通过接口访问。
拆分成:
sql1 = select user_id from user where type = "微信注册";

sql2 = select * from order where user_id in (sql1取出的user_id ) limit 20 offset 0
当user表数据越来越多,sql1取出的user_id有上万条,这样在sql2里,user_id in (上万条),查询太慢了,请问有什么优化的方式?

阅读 2.5k
4 个回答

觉得你这种业务需求很奇怪啊
这种关联查询要联查就不要拆,拆了就不要这种联查嘛
并且这种查微信注册的订单直接在订单里冗余一个订单或者用户类型就好了啊
这种跨实例的join不关用什么方式性能都不会好哪里去,引入中间件就把计算和缓存都放到了中间件层,很危险

新手上路,请多包涵

这里的慢是有原因的
sql1 = select user_id from user where type = "微信注册";

type = "微信注册";这里是否可以优化 ,中文比对。

接口返回数据。

既然 user 迁走了orer 外键怎么做的? user_id 是否该有索引

解决几种方法

  1. 引入中间件可以解决join问题
  2. 引入冗余临时用户表,解决join
  3. 如果只是几万数据子查询是否可做业务上代码处理。不走联表

既然存在关联关系,你还强行把它拆到两个库中,醉醉的。
当然你可以说你决定不了,这是上层拍脑袋决定的。
一个方案就是定时冗余一个UserID表到你当前的数据库中方便联表查询,或者运用第三方搜索软件,整合各个数据库的数据,加快搜索,比如solrsphinx

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题