Niedawno natknąłem się na ten problem. Problem polegał na dwóch częściach do naprawienia. Najpierw musiałem użyć wewnętrzna wybierz w moim klauzuli FROM, które zrobił mój ograniczania i kompensaty dla mnie na klucz podstawowy tylko:
$subQuery = DB::raw("(SELECT id FROM titles WHERE id BETWEEN {$startId} AND {$endId} ORDER BY title) as t");
Wtedy mógłbym użyć go jako z części mojego zapytania:
'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')
Po pierwszym utworzeniu tego zapytania użyłem funkcji PRZESUNIĘCIE i LIMIT w MySql. To działało dobrze, dopóki nie przeszłam na stronie 100, wtedy przesunięcie zaczęło być nieznośnie powolne. Zmiana tego na BETWEEN w moim wewnętrznym zapytaniu przyspieszyła to dla dowolnej strony. Nie jestem pewien, dlaczego MySql nie przyspiesza OFFSET, ale między wydaje się ponownie go z powrotem.
podejście to działa tylko w instrukcjach, które nie zawierają warunku. moim zdaniem nie jest to dobre rozwiązanie. –
Jak zaktualizować tabelę indeksu? W moim przypadku muszę zamówić przez kolumnę datetime i użyć dużych przesunięć powodujących powolne zapytania. Jeśli utworzę tę tabelę suportów, będę musiał ponownie wstawić za każdym razem, gdy mam nową datę, ponieważ nie jest ona w porządku. Już widzę to rozwiązanie, ale z tabelami tymczasowymi. –