mysql where uid in (2000个uid) 的优化或更好的存储方案
天蓬老师
天蓬老师 2017-04-17 13:04:06
0
2
411

有这样一个需求,要存储千万级的帖子,十万级的用户

然后

给定2000个用户ID,需要按照帖子发表时间,从这2000个用户发过的帖子中查出最新的10000个帖子

PS:极端情况

给定的2000各用户中,其中10个非常活跃,可能这最新10000个帖子只是这10个用户发表的

请教诸位大神,

这种情况该如何存储,如何查询

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(2)
黄舟

只说查询,和我最近用的一个sql类似,在一张近百万数据的表中,通过一个文章id(docId),找出对应的word(word是根据文章标题分词得到的),再根据这些word,查找所有的相关的文章id。一开始的做法是select docId from tab1 where word in (select word from tab1 where docId=123) group by docId limit 1000;
各个字段都建了索引,执行过后,花了35s左右时间。后来换成join查询,能达到50ms左右,经过讨论,问题是出在in上,导致查询时没用上索引,优化后的sql是:select docId from (select word from tab1 where docId=123) as t2 join tab1 t on t.word=t2.word where t2.word is not null GROUP BY docId limit 1000

说了这么多,是想说 用in查询 貌似不太好~~~

PHPzhong

加上一个测试结果

初步的测试结果

select * from dynamics where uid in ({$uidStr}) order by created_at desc limit 10000

上面这种查询,其中dynamics表记录在3百万左右,$uidStr是2000个

mysql(5.5)

0.19s 左右(where in 情况下,created_at索引好像没有用上)

mongodb

$cursor = $dyCollection->find(array("uid" => array('$in' => $selectedUid)))->sort(array("created_at"=>-1))->limit(10000);

对created_at建立索引后,0.09s 左右

另外如果插入mongodb是按时间顺序插入的话,其实可以不用再排序了,查出来的就是当时插入的顺序,但是mysql where in的话,取出来的结果好像是按in那个字段升序排的

另外

limit减少到3000以下的时候,mysql只需要0.04s,mongodb只需要0.02s,不知道该怎么优化了

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板