Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wyjaśnij plan w wydajności mysql za pomocą Using Temporary; Korzystanie z sortowania plików; Korzystanie z warunku indeksu

Proszę podać SHOW CREATE TABLE .

Wydaje się, że głównym filtrem jest

            where  dsr_booking_date BETWEEN '2017-05-01' AND '2017-06-30'
              AND  LENGTH(dsr_cnno)=9
              AND  DSR_BOOKED_BY ='F'
              AND  dsr_status<>'R'
              AND  dsr_cnno NOT LIKE 'J%'
              AND  dsr_cnno NOT LIKE '@%'
              AND  dsr_cnno NOT LIKE '576%'
              AND  dsr_cnno NOT LIKE 'I3%'
              AND  dsr_cnno NOT LIKE '7%'
              AND  dsr_cnno NOT LIKE 'N%'
              and  d.dsr_dest_pin>0

Prawdopodobnie jedynym przydatnym indeksem jest w tej kolejności:

INDEX(DSR_BOOKED_BY, dsr_booking_date)

Rzeczy takie jak

ifnull((select max(ndsr_ins_amt)     from ndx_dsr_table where ndsr_cnno=dsr_cnno ),0)-
ifnull((select max(ndsr_serv_charge) from ndx_dsr_table where ndsr_cnno=dsr_cnno ),0) -

prawdopodobnie powinno być zrobione razem. Rozważ coś takiego

ifnull(mm.max_nia), 0) -
ifnull(mm.max_nsc), 0) .
...
LEFT JOIN ( SELECT max(ndsr_ins_amt)     AS max_nia,
                   max(ndsr_serv_charge) AS max_nsc
                from ndx_dsr_table
          ) AS mm  ON ndsr_cnno=dsr_cnno

Lub, jeśli to konieczne, utwórz tabelę tymczasową za pomocą tego podzapytania, a następnie JOIN do niej.

(Ponieważ nie zakwalifikowałeś każdej kolumny za pomocą tabeli, w której się znajduje, nie mogę być bardziej szczegółowy.)

Czy masz odpowiednie indeksy „złożone” dla różnych JOINs? ?

Zgodnie z EXPLAIN , skanuje 182 mln wierszy dsr_table . Tak więc mój indeks powyżej prawdopodobnie pomoże (jeśli nie masz jeszcze podobnego).

Waham się sugerować tak długi indeks, ale może to pomóc:

INDEX(DSR_BOOKED_BY, dsr_booking_date,  -- these first, in this order
      dsr_cnno, dsr_status, dsr_cnno, dsr_dist_pin,  -- in any order
      id)   -- (whatever the PK of the table is); last

Zły problem w drugim zapytaniu

        WHERE  dsr_booking_date = '2017-04-30'
          AND  '2017-05-30'

Być może miałeś na myśli 31 dni:

        WHERE  dsr_booking_date BETWEEN '2017-04-30'
                                   AND  '2017-05-30'

A może 2 dni:

        WHERE  dsr_booking_date IN ('2017-04-30', '2017-05-30')

To, co masz, to

        WHERE  dsr_booking_date = '2017-04-30'  -- test for one day
          AND  true  -- that's how '2017-05-30' is interpreted



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Policz i grupuj niepuste wartości w MySQL

  2. Połączenie MySQL nie zamyka się

  3. Błąd składni spowodowany użyciem zastrzeżonego słowa jako nazwy tabeli lub kolumny w MySQL

  4. Dostęp do ostatnio utworzonego wiersza w PHP/MySQL

  5. Plusy i minusy nazwy tabeli zawierającej spacje