gpt4 book ai didi

php - 查询好友和好友的好友优化

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:23:35 24 4
gpt4 key购买 nike

我需要运行查询以在数据透视表中获取所有 friend ID 及其 friend 的 ID。

该表有两列(与此问题相关),请求者 ID 和接受者 ID。

要获取用户的所有 friend ,我必须获取所有行,其中 accepter_id == currentUserIdrequester_id == currentUserId 因为当前用户可以是请求者或接受者.

问题:

要获取所有 friend 的 friend ID,我需要为每个当前用户 friend 的 ID 运行查询(其中 accepter_id == currentUsersFriendId AND where requester_id == currentUsersFriendId)。

很多时候查询量超过200(取决于当前用户的好友数)。当我对它进行基准测试时,我始终需要大约 2.2 到 2.7 秒才能完成获取 friend 和 friend 的 friend 。显然这需要很长时间。

问题:

我该怎么做才能缩短完成此查询所需的时间?

注意:我使用的是 Laravel 的 Eloquent ORM。

更新

对于表格,我使用的是 Laravel Schema 构建器(我不是 sql 专家)。因此,我可以向您展示的是创建表语句的 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();
});

这里是抓取好友的select语句。请注意,我正在为 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)

那么这个 UNION 会运行得更快:

( select `requester_id` from `friends` where `accepter_id` = ? and `status` = ? )
UNION ALL
( select `accepter_id` from `friends` where `requester_id` = ? and `status` = ? )

如果从这两个 SELECT 返回重复项,并且您需要删除列表的重复项,则使用 UNION DISTINCT 而不是 UNION ALL

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com