我需要运行一个查询以获取透视表上的所有朋友ID和他们朋友的ID。
该表有两列(与此问题相关),即请求者id和接受者id。
要获取用户的所有朋友,我必须获取accepter_id == currentUserIdrequester_id == currentUserId的所有行,因为当前用户可以是请求者或接受者。
问题是:
要获取好友id的所有好友,我需要对每个当前用户的好友id(whereaccepter_id == currentUsersFriendId和whererequester_id == currentUsersFriendId)运行查询。
很多时候,查询量超过200次(取决于当前用户的朋友数量)当我对它进行基准测试时,我总是得到2.2到2.7秒的时间来完成交朋友和朋友的过程。显然这需要很长时间。
问题是:
如何减少完成此查询所需的时间?
注:我用的是拉维的口才。
更新
对于表,我使用的是laravel模式构建器(我不是sql专家)。所以我可以向您展示create table语句的php代码表示。以下是架构生成器的laravel文档:http://laravel.com/docs/4.2/schema。希望能帮上忙?

Schema::create('friends', function (Blueprint $table)
    {
        $table->increments('id');
        $table->integer('requester_id', false, true);
        $table->integer('accepter_id', false, true);
        $table->tinyInteger('status');

        $table->unique(['requester_id', 'accepter_id']);

        $table->timestamps();
        $table->softDeletes();
    });

以下是一些吸引朋友的精选语句。注意,我正在运行一个单独的where requester_id = userIdwhere accepter_id = userId查询。我不知道如何将两者结合起来,所以我运行了单独的查询并将它们结合起来。
select `requester_id` from `friends` where `accepter_id` = ? and `status` = ?
select `accepter_id` from `friends` where `requester_id` = ? and `status` = ?

最佳答案

您需要两个单独的复合索引:

INDEX(requester_id, status, accepter_id)
INDEX(accepter_id, status, requester_id)

然后这个联盟会跑得更快:
( select `requester_id` from `friends` where `accepter_id` = ? and `status` = ? )
UNION ALL
( select `accepter_id` from `friends` where `requester_id` = ? and `status` = ? )

如果这两个选项返回重复项,并且需要对列表进行重复数据消除,则使用UNION DISTINCT而不是UNION ALL

关于php - 查询好友和优化好友,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29336668/

10-11 03:31
查看更多