如何优化连接三个表的MySQL查询



我有一个查询,连接了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

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

这样,您就不需要在查询中使用JOIN,JOIN可以降低查询的运行时间。

最新更新