查询中的联接功能使查询运行缓慢

时间:2018-12-20 08:00:12

标签: php mysql sql laravel-5

我有两个表都包含大约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();

此查询给出的结果正确,但是处理时间很长,有时甚至超时。

有人可以帮助我如何优化此查询吗?

1 个答案:

答案 0 :(得分:2)

您需要索引所有应用了连接条件的列。在您的情况下:两个表中的“ compid”,“ c_cod”。

通常,“主键约束” 列会自动在数据库中建立索引,尽管您必须手动索引“外键约束” 列。

一些索引技巧:

  1. 首先在值种类最多的字段上创建索引。可以这么说,这将导致“最物有所值”。
  2. 保持索引较小。最好仅对邮政编码或邮政编码进行索引,而不要对邮政编码和国家/地区进行索引。索引越小,响应时间越好。
  3. 对于高频函数(每天数千次),拥有非常大的索引可能是明智的,因此系统甚至不需要该表来读取函数。
  4. 对于小表,索引可能是不利的。对于可以通过扫描整个表格使系统更好的任何功能,也可以说相同的话。
  

请记住,索引会减慢添加,修改和删除的速度,因为无论何时表都需要更新索引。因此,最佳实践是为经常用于搜索但变化不大的值添加索引。因此,银行帐号的索引要比余额的索引好。

提示参考:https://www.databasejournal.com/features/mysql/article.php/3840606/Maximizing-Query-Performance-through-Column-Indexing-in-MySQL.htm