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

Обяснете плана в производителността на mysql, като използвате Using temporary; Използване на сортиране на файлове; Използване на условие за индекс

Моля, предоставете SHOW CREATE TABLE .

Основният филтър изглежда е

            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

Вероятно единственият полезен индекс за това е в следния ред:

INDEX(DSR_BOOKED_BY, dsr_booking_date)

Неща като

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

вероятно трябва да се направи заедно. Помислете за нещо като

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

Или, ако е необходимо, създайте временна таблица с тази подзаявка, след което LEFT JOIN към нея.

(Тъй като не сте квалифицирали всяка колона с таблицата, в която се намира, не мога да бъда по-конкретен.)

Имате ли подходящи „композитни“ индекси за различните JOINs ?

Според EXPLAIN , той сканира 182 милиона реда от dsr_table . Така че моят индекс по-горе вероятно ще ви помогне (ако вече нямате подобен.)

Колебам се да предложа толкова дълъг индекс, но това може да помогне:

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

Лош проблем във втората заявка

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

Може би имахте предвид 31 дни:

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

Или може би 2 дни:

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

Това, което имате, е

        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. Хибернация:каква е разликата между MySQLDialect и MySQLInnoDBDialect?

  2. Как да създадете GraphQL API без сървър за MySQL, Postgres и Aurora

  3. Съкращаване на данни:Данните са твърде дълги за колона „лого“ на ред 1

  4. laravel query php как да получите максимална стойност в рамките на диапазон

  5. Как най-добре да получите нечий „ранг“ от таблица с резултати с php и mysql без цикъл