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

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

然后

给定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 bycreated_atdesc 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,不知道该怎么优化了

      최신 다운로드
      더>
      웹 효과
      웹사이트 소스 코드
      웹사이트 자료
      프론트엔드 템플릿
      회사 소개 부인 성명 Sitemap
      PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!