为了账号安全,请及时绑定邮箱和手机立即绑定

如何优化MySQL in查询

如何优化MySQL in查询

料青山看我应如是 2019-04-14 11:28:31
MySQL的范围查询:$id_list=implode(',',$arr);$sql="selectname,idfromuserwhereidin($id_list)";//可能还会leftjoin连表//如果$arr数组非常大会很慢,对这种查询如何优化?
查看完整描述

2 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

提供几个方案:
1)如果内存足够用的话(这个表都没有特别大),可以使用mysql的memoryengine,即把查询都放到内存里就行了。memoryengine可以使用hashindex。
2)使用memcache或者redis作为cache,相当于每次查询时都要multi_get一次,没有命中的再回mysql查,可以大大的降低mysql的in后面跟的数量。查询回来之后,再multi_set一次。如果memcache或者redis被sharding了,那么这个效率也没太高,因为要一个serverquery一部分。
3)可以采用一些分布式key-value存储,比如在可以订阅或者follow种情形下,比如数据A修改了,那么把订阅A的全部人都异步的写到他们自己的一个inbox里面,那个inbox每次只要O(1)的get就OK了。在一些大V很多的地方(少数用户的follower特别多),会把一堆followers最多的人数据单拿出来cache好用类似in的方法查询,剩下的少的newsfeed直接塞到inbox里,这一在存储和时间上折中一下。
                            
查看完整回答
反对 回复 2019-04-14
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

我曾经目睹过csdn的in,那一大长窜子in数字,我都被吓尿了。虽然我不知道这个怎么优化,但我知道一般需要这个的最好考虑中间加上一层高速cache,或者干脆将这些I/O全部放到redis中,定期写入到数据库。然后,等大神怎么回答这个问题。
                            
查看完整回答
反对 回复 2019-04-14
  • 2 回答
  • 0 关注
  • 281 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信