Gần đây, tôi đã gặp sự cố này. Vấn đề là hai phần cần sửa. Trước tiên tôi đã phải sử dụng một lựa chọn bên trong mệnh đề FROM của tôi rằng đã làm hạn chế và bù đắp cho tôi trên chỉ là khóa chính của tôi:
$subQuery = DB::raw("(SELECT id FROM titles WHERE id BETWEEN {$startId} AND {$endId} ORDER BY title) as t");
Sau đó, tôi có thể sử dụng như là từ một phần của truy vấn của tôi:
'titles.id',
'title_eisbns_concat.eisbns_concat',
'titles.pub_symbol',
'titles.title',
'titles.subtitle',
'titles.contributor1',
'titles.publisher',
'titles.epub_date',
'titles.ebook_price',
'publisher_licenses.id as pub_license_id',
'license_types.shortname',
$coversQuery
)
->from($subQuery)
->leftJoin('titles', 't.id', '=', 'titles.id')
->leftJoin('organizations', 'organizations.symbol', '=', 'titles.pub_symbol')
->leftJoin('title_eisbns_concat', 'titles.id', '=', 'title_eisbns_concat.title_id')
->leftJoin('publisher_licenses', 'publisher_licenses.org_id', '=', 'organizations.id')
->leftJoin('license_types', 'license_types.id', '=', 'publisher_licenses.license_type_id')
Lần đầu tiên tôi tạo truy vấn này, tôi đã sử dụng OFFSET và LIMIT trong MySql. Điều này làm việc tốt cho đến khi tôi đã qua trang 100 sau đó bù đắp bắt đầu nhận được không thể chịu đựng chậm. Thay đổi điều đó thành GIỮA trong truy vấn bên trong của tôi đã tăng tốc nó cho bất kỳ trang nào. Tôi không chắc chắn tại sao MySql không tăng tốc OFFSET nhưng giữa dường như cuộn nó trở lại.
cách tiếp cận này chỉ hoạt động trong các câu lệnh chọn không chứa điều kiện. theo ý kiến của tôi nó không phải là một giải pháp tốt. –
Làm cách nào để giữ bảng chỉ mục này được cập nhật? Trong trường hợp của tôi, tôi phải sắp xếp theo cột datetime và sử dụng các offset lớn dẫn đến các truy vấn chậm. Nếu tôi tạo bảng hỗ trợ này, tôi sẽ cần phải cài đặt lại mỗi khi tôi có một ngày mới, vì nó không đến theo thứ tự. Tôi đã thấy giải pháp này, nhưng với các bảng tạm thời. –