【问题标题】:How to optimize a MySQL query joining three tables如何优化连接三个表的 MySQL 查询
【发布时间】:2021-07-07 07:00:46
【问题描述】:

我有一个查询连接 3 个销售表,大约有 15000 行。查询大约需要 22 秒才能响应,这对我来说太大了。如何优化此查询?我使用 Laravel 并使用表单中的过滤器。

这是我的查询:

$data = DB::table('crm_donhang as dh')
    ->select('dh.id as id', 'madh', 'dh.created_at as ngaybg', 'ngayxn', 'dh.trangthai', 'dh.createdby as nhanvienbh', 'tongtien', 'dh.updated_at', 'dh.updatedby',
                'ngayyc', 'tenkhachhang', 'tenloai', 'loaidiachi', 'dh.danhgia', 'dh.nguyennhan')
    ->join(DB::raw('(SELECT id_donhang, masp FROM crm_donhang_ct as ct INNER JOIN crm_sanpham  as sp ON sp.id=ct.id_sanpham) as ctdh'), 'ctdh.id_donhang', '=', 'dh.id')
    ->join('crm_khachhang as kh', 'kh.id', '=', 'dh.id_khachhang')
    ->join('crm_cfg_loaidh as ldh', 'ldh.id', '=', 'dh.id_loaidh')
    ->join('crm_cfg_dcgiaohang as dc', 'dc.id', '=', 'dh.id_dcgiaohang')
    ->get();

我有一个旧数据库,我在尝试查询 0.5 秒后将 crm_sanpham 表复制到其中,而在新数据库中则需要 4.7 秒。发生了什么? (虽然两张表是一样的,但是安装的数据库是一样的)。

select `id`, `masp`, `ketcau`, `mota`, `donvitinh`, `dongia`, `trangthai`, `created_at`, `updated_at`, `createdby`, `updatedby` 
from `crm_sanpham` where `masp` != "TANDUNG" order by `masp` desc limit 10 offset 0

【问题讨论】:

  • 请分享更多详细信息,例如该查询的执行计划以及您解决问题的尝试
  • 如果你的记录再高,它会很慢。
  • 是我从 sql 开始的。

标签: mysql laravel laravel-query-builder


【解决方案1】:

在 Laravel 中,您可以将 crm_donhang 表的 id 作为其他表的外键,然后删除这些连接并仅访问您的 crm_donhang 表并在需要时访问这些表。 请访问以下链接:https://laravel.com/docs/8.x/eloquent-relationships

这样,您就不需要在查询中使用 JOIN,JOIN 会减慢查询的运行时间。

【讨论】:

  • 但需要检索数据。我尝试了上述检查(解决了我的问题),请帮我看看发生了什么?
  • 例如,如果您的记录达到 100000 或更多,那么这些 JOIN 并不是一个好主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
  • 2013-07-13
  • 2012-08-01
  • 2021-12-20
  • 1970-01-01
  • 2012-02-15
相关资源
最近更新 更多