1个game游戏表,里面有gameid
1个group表,里面是参加游戏的人,同一gameid对应多条具有userid的记录
1个friend表,里面每一条关注记录,有userid和fuserid
要求检索的结果是,列出只有我关注的fuserid(group的userid)参加的game列表。同一条gameid可能有多个我关注的人,只需要列出一条。
加了翻页模式,每次只挑10条。
如图:
$games = Db::table('game')
->join('course', 'game.courseid', '=', 'course.courseid')
->join('game_group_user', 'game_group_user.gameid', '=', 'game.gameid')
->join('friend', 'game_group_user.userid', '=', 'friend.fuserid')
->where('friend.userid', '=', $uid)
->select('game.gameid', 'game.name', 'game.courseid', 'course.name as course', 'game.pre_starttime', 'game.game_group_coverpath as path', 'game.game_group_covername as image', 'game.watchers', 'game.gametype', 'game.teamid', 'game.is_have_gamble')
->orderby('gameid', 'desc')
->distinct()
->offset(($current_page - 1)*$per_page)
->limit($per_page)
->get();
$uid:
传递的我的id
数据库:
mysql Ver 15.1 Distrib 10.3.28-MariaDB, for Linux (x86_64) using readline 5.1
PHP:
PHP 7.2.24 (cli) (built: Oct 22 2019 08:28:36) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.24, Copyright (c) 1999-2018, by Zend Technologies
webman:
最新版
现在的情况是,每次加载都感觉比较慢,请将各位大师,有没有更快的算法
多谢多谢!!
先查group 然后在join friend 、game,然后在看看关联外键索引,么有的加一下。
非常感谢,按照你的先取出10条group信息,再php循环出10条game来,速度就飞起来了。。。感谢六叔叔
又遇到新问题:(,因为某用户的friend表数据太多,他的速度提高很有限,不知还有何良策?
分成2次或3次短查询,再php里组合,配合redis缓存。
不知道具体情况,所以无法给你具体的优化,如果是friend数据库量比较大,拆开查询查下friend 然后limit 1 只查一条看看效果。
这三个表数据量都不算太小。game100多万,group340多万,friend300万。
explain
单独查出来后再in对应ID查关联表再遍历组合会好点吗
可以再加一张结果表,将你需要的数据用定时查询后放在这里面,后面直接查询这张表就行了
可是,那么多用户,要给每个用户建一张表么?
看数据大小,优先考虑表分区,如果分区不能满足,考虑分区加分表的方式. 分表表名可以对userid取模后来取
其实只需要一个表就可以实现其功能
愿闻其详💐