Me he encontrado recientemente con este problema. El problema fue dos partes para arreglar. Primero tenía que utilizar un selecto interno en mi cláusula FROM que hicieron mi limitación y compensación para mí en la clave principal única:
$subQuery = DB::raw("(SELECT id FROM titles WHERE id BETWEEN {$startId} AND {$endId} ORDER BY title) as t");
entonces podría usar eso como el de la parte de mi consulta:
'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')
La primera vez que creé esta consulta, utilicé OFFSET y LIMIT en MySql. Esto funcionó bien hasta que pasé de la página 100 a continuación, el desplazamiento comenzó a ser insoportablemente lento. Cambiar eso a BETWEEN en mi consulta interna lo aceleró para cualquier página. No estoy seguro de por qué MySql no ha acelerado el DESPLAZAMIENTO, pero parece entrelazarlo de nuevo.
este enfoque solo funciona en sentencias seleccionadas que no contienen el estado. en mi opinión, no es una buena solución. –
¿Cómo mantener esta tabla de índice actualizada? En mi caso, tengo que ordenar por columna de fecha y hora y usar compensaciones grandes que resultan en consultas lentas. Si creo esta tabla de soporte, tendré que volver a insertar cada vez que tenga una nueva fecha, ya que no está en orden. Ya veo esta solución, pero con tablas temporales. –