【发布时间】:2015-06-02 21:43:35
【问题描述】:
我需要运行查询以获取数据透视表上的所有朋友 ID 及其朋友的 ID。
该表有两列(与此问题相关),请求者 ID 和接受者 ID。
要获取用户的所有朋友,我必须获取 accepter_id == currentUserId 和 requester_id == currentUserId 的所有行,因为当前用户可以是请求者或接受者。
问题:
要获取朋友 ID 的所有朋友,我需要对每个当前用户朋友的 ID 运行查询(accepter_id == currentUsersFriendId AND requester_id == currentUsersFriendId)。
很多时候查询量超过200(取决于当前用户的好友数量)。当我对它进行基准测试时,我总是在 2.2 到 2.7 秒左右完成获得朋友和朋友的朋友。显然这需要很长时间。
问题:
我可以做些什么来减少完成此查询所需的时间?
注意:我使用的是 Laravel 的 Eloquent ORM。
更新
对于表格,我使用的是 Laravel Schema builder(而且我不是 sql 专家)。因此,我可以向您展示的是 create table 语句的 php 代码表示。这是 Schema 构建器的 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 = userId 和where accepter_id = userId 运行单独的查询。无法弄清楚如何将两者结合在一起,所以我运行了单独的查询并将它们结合起来。
select `requester_id` from `friends` where `accepter_id` = ? and `status` = ?
select `accepter_id` from `friends` where `requester_id` = ? and `status` = ?
【问题讨论】:
-
你对这些列有索引吗?
-
我有一个用于请求者和接受者 ID 的复合唯一键。
-
我会尝试在这两列上放置一个索引; 2.2到2.7是直接在DB里面执行查询吧?
-
唯一的键是索引,我相信?我不确定你的第二个问题是什么意思。你的意思是我直接与数据库通信,而不是使用数据库查询的 php 代码表示?
-
SHOW CREATE TABLE并向我们展示您正在使用的SELECT。
标签: php mysql algorithm laravel optimization