3个表通过join来查询会很慢,有更好的办法么?

wocall

问题描述

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:
最新版

现在的情况是,每次加载都感觉比较慢,请将各位大师,有没有更快的算法
多谢多谢!!

926 5 1
5个回答

六叔叔

先查group 然后在join friend 、game,然后在看看关联外键索引,么有的加一下。

  • wocall 2023-06-24

    非常感谢,按照你的先取出10条group信息,再php循环出10条game来,速度就飞起来了。。。感谢六叔叔

  • wocall 2023-06-24

    又遇到新问题:(,因为某用户的friend表数据太多,他的速度提高很有限,不知还有何良策?

  • banro512 2023-06-25

    分成2次或3次短查询,再php里组合,配合redis缓存。

  • 六叔叔 2023-06-25

    不知道具体情况,所以无法给你具体的优化,如果是friend数据库量比较大,拆开查询查下friend 然后limit 1 只查一条看看效果。

  • wocall 2023-06-29

    这三个表数据量都不算太小。game100多万,group340多万,friend300万。

chaz6chez

explain

  • 暂无评论
TM

单独查出来后再in对应ID查关联表再遍历组合会好点吗

  • 暂无评论
用户名好难想

可以再加一张结果表,将你需要的数据用定时查询后放在这里面,后面直接查询这张表就行了

  • wocall 2023-09-19

    可是,那么多用户,要给每个用户建一张表么?

  • 用户名好难想 2023-09-19

    看数据大小,优先考虑表分区,如果分区不能满足,考虑分区加分表的方式. 分表表名可以对userid取模后来取

1

其实只需要一个表就可以实现其功能

🔝