Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Paginação Precisa com Junções à Esquerda


Aqui está sua consulta original
SELECT l.location_id, l.location_name, 
       t.type_id, t.type_name, 
       i.location_address, i.location_phone 
FROM location AS l 
LEFT JOIN location_information AS i ON (l.location_id = i.location_id) 
LEFT JOIN location_types AS t ON (l.location_type_id = t.type_id) 
ORDER BY l.location_id DESC 
LIMIT 10 

Você executa a paginação por último. Se você refatorar essa consulta, poderá executar a paginação mais cedo.
SELECT l.location_id, l.location_name, 
       t.type_id, t.type_name, 
       i.location_address, i.location_phone 
FROM
    (SELECT location_id,location_type_id FROM location
    ORDER BY location_id LIMIT 10) AS k
    LEFT JOIN location AS l ON (k.location_id = l.location_id)
    LEFT JOIN location_information AS i ON (k.location_id = i.location_id) 
    LEFT JOIN location_types AS t ON (l.location_type_id = t.type_id) 
;

Observe que criei uma subconsulta chamada k . As 10 chaves são apanhadas e encomendadas PRIMEIRO!!!

Então os JOINs podem continuar a partir daí, espero usar apenas 10 location_ids.

O que ajudará a subconsulta k é um índice que carrega location_id e location_type_id
ALTER TABLE location ADD INDEX id_type_ndx (location_id,location_type_id);

Aqui está outra coisa que você pode gostar sobre esta abordagem

Como você consulta os próximos 10 ids (ids 11 - 20) ? Assim:
SELECT l.location_id, l.location_name, 
       t.type_id, t.type_name, 
       i.location_address, i.location_phone 
FROM
    (SELECT location_id,location_type_id FROM location
    ORDER BY location_id LIMIT 10,10) AS k
    LEFT JOIN location AS l ON (k.location_id = l.location_id)
    LEFT JOIN location_information AS i ON (k.location_id = i.location_id) 
    LEFT JOIN location_types AS t ON (l.location_type_id = t.type_id) 
;

Tudo o que você precisa fazer é alterar o LIMIT cláusula na subconsulta k a cada nova página.
  • LIMIT 20,10
  • LIMIT 30,10
  • e assim por diante...

Eu posso melhorar a refatoração removendo a tabela de localização e fazer com que a subconsulta k carregue os campos necessários assim:
SELECT k.location_id, k.location_name, 
       t.type_id, t.type_name, 
       i.location_address, i.location_phone 
FROM
    (SELECT location_id,location_type_id,location_name
    FROM location ORDER BY location_id LIMIT 10,10) AS k
    LEFT JOIN location_information AS i ON (k.location_id = i.location_id) 
    LEFT JOIN location_types AS t ON (k.location_type_id = t.type_id) 
;

Fazer esse índice extra não seria necessário para esta versão.

De uma chance !!!