sql >> Database >  >> RDS >> Mysql

Nauwkeurige paginering met linker joins

Dit is je oorspronkelijke vraag

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 

U voert de paginering als laatste uit. Als u deze zoekopdracht refactoreert, kunt u de paginering eerder uitvoeren.

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) 
;

Merk op dat ik een subquery heb gemaakt met de naam k . De 10 sleutels worden EERST opgehaald en besteld!!!

Dan kunnen de JOINs vanaf daar doorgaan, hopelijk met slechts 10 location_ids.

Wat helpt de subquery k is een index die location_id en location_type_id bevat

ALTER TABLE location ADD INDEX id_type_ndx (location_id,location_type_id);

Hier is nog iets dat je misschien leuk vindt aan deze aanpak

Hoe vraag je naar de volgende 10 ID's (ID's 11 - 20)? Zoals dit:

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) 
;

Het enige wat u hoeft te doen is de LIMIT . wijzigen clausule in subquery k bij elke nieuwe pagina.

  • LIMIT 20,10
  • LIMIT 30,10
  • en ga zo maar door...

Ik kan de refactoring verbeteren door de locatietabel te verwijderen en subquery k de benodigde velden als volgt te laten dragen:

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) 
;

Het maken van die extra index zou voor deze versie niet nodig zijn.

Probeer het eens !!!



  1. SQL Express opstarten vanuit WiX?

  2. Hoe selecteert GROUP BY DESC zijn bestelling?

  3. Alle controlebeperkingen in SQL Server-database inschakelen - SQL Server / TSQL-zelfstudie deel 88

  4. NLS_CHARSET_ID() Functie in Oracle