我有一个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();
答案 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();