Я недавно столкнулся с этой проблемой. Проблема состояла из двух частей, которые нужно было исправить. Сначала я должен был использовать внутреннее выделение в предложении FROM, которое делало мои ограничения и смещения только для первичного ключа:
$subQuery = DB::raw("( SELECT id FROM titles WHERE id BETWEEN {$startId} AND {$endId} ORDER BY title ) as t");
Тогда я мог бы использовать это как часть моего запроса:
'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')
Когда я впервые создал этот запрос, я использовал OFFSET и LIMIT в MySql. Это работало нормально, пока я не прошел страницу 100, затем смещение стало невыносимо медленным. Изменение этого значения между BETWEEN в моем внутреннем запросе ускорило его для любой страницы. Я не уверен, почему MySql не ускорил OFFSET, но между ними, кажется, снова его накатывает.