我需要哪些索引才能通过Laravel Eloquent提高mysql查询性能

时间:2018-02-23 00:43:47

标签: mysql laravel eloquent

我有一个db快速增长的应用程序 - 目前许多表大约有7万行并且正在上升。我的查询是使用Laravel的口才运行的,所以我理解那里的一些开销,但即使在mysqlworkbench中运行单个连接,也导致我因为花了多长时间而不得不停止查询。

我正在使用的表格:

posts:
id, session_id, cat_id, name, lat, long

cats:
id, session_id, name

sessions:
id, member_id, token, created_at, updated_at

members:
id, memnum, email, name, state, postcode

每个id字段都有自己的主键索引,我的第一步是为每个FK添加索引,但令人惊讶的是我没有看到任何好处。

我也尝试过添加复合索引,比如

create index `sid` on posts(`session_id`, `cat_id`);

这似乎也没有帮助。为了测试这些性能差异,我运行了一个类似于eloquent使用EXPLAIN执行的连接查询:

explain select p.name, t.name, m.member_num from posts p, cats c, members m
left join sessions s on m.id = s.member_id
where p.created_at > date('2017-12-31');

在添加索引之前和添加索引之后,行数似乎根本没有从大约75k发生变化 - 如果索引有帮助,我希望这会显着减少吗?我做错了吗?

如果有人认为雄辩可以解决的一些背景,请问:

        $offers = Post::with(['session.member', 'cat'])
        ->where('created_at', '>=', $dates[0])
        ->where('created_at', '<', $dates[1])
        ->orderBy('created_at', 'desc')
        ->get();

1 个答案:

答案 0 :(得分:1)

您的数据库中有太多记录,因此您必须限制从eloquent获得的结果数量。您可以在with中使用闭包,并限制可能对您有帮助的记录数。

 $offers = Post::with(['session.member'=> function($query){
           return $query->take(10); // Limit the number of records
 }, 'cat'])
->where('created_at', '>=', $dates[0])
->where('created_at', '<', $dates[1])
->orderBy('created_at', 'desc')
->get();