Mysql
 sql >> база данни >  >> RDS >> Mysql

Точно пагинация с леви присъединявания

Ето оригиналното ви запитване

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 

Извършвате пагинацията последна. Ако преработите тази заявка, можете да извършите пагинацията по-рано.

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

Забележете, че създадох подзаявка, наречена k . 10-те ключа се вземат и поръчват ПЪРВИ !!!

След това JOIN могат да продължат от там, надявам се да използвате само 10 location_id.

Какво ще помогне на подзаявката k е индекс, който носи location_id и location_type_id

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

Ето нещо друго, което може да ви хареса в този подход

Как правите заявка за следващите 10 идентификатора (идентификатори 11 - 20)? Като това:

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

Всичко, което трябва да направите, е да промените LIMIT клауза в подзаявка k с всяка нова страница.

  • LIMIT 20,10
  • LIMIT 30,10
  • и така нататък...

Мога да подобря рефакторинга, като премахна таблицата за местоположение и накарам подзаявката k да носи необходимите полета по следния начин:

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

Създаването на този допълнителен индекс не би било необходимо за тази версия.

Опитайте !!!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Искам да покажа множество изображения от базата данни в jsp (аз картографирам сървлет), така че в jsp m ще се покаже в src на етикета img

  2. Как се заключват innodb таблиците, когато тригерът ON INSERT се обработва?

  3. Вмъкване на запис в колона JSON в postgres

  4. Вмъкване на данни в множество таблици PHP MySQL

  5. zf2 tablegateway избира колони по име на колона