我有两个表都包含大约200,000个数据。我已经编写了如下查询,以使用某些联接检索数据。
这是我尝试过的查询
$dbYTD = DB::table('stdtsum as a')
->join(DB::raw("(select distinct s_id, c_cod, compid from stdcus) b"), function($join){
$join->on('a.compid', '=', 'b.compid')->on('a.c_cod', '=', 'b.c_cod');
})
->select('b.s_id', DB::raw('sum(turnover) as sumturn'))
->whereBetween('date', [$startYTD, $endYTD])
->groupBy('b.s_id')
->get()
->toArray();
此查询给出的结果正确,但是处理时间很长,有时甚至超时。
有人可以帮助我如何优化此查询吗?
答案 0 :(得分:2)
您需要索引所有应用了连接条件的列。在您的情况下:两个表中的“ compid”,“ c_cod”。
通常,“主键约束” 列会自动在数据库中建立索引,尽管您必须手动索引“外键约束” 列。
一些索引技巧:
请记住,索引会减慢添加,修改和删除的速度,因为无论何时表都需要更新索引。因此,最佳实践是为经常用于搜索但变化不大的值添加索引。因此,银行帐号的索引要比余额的索引好。