SQL-запрос в MySQL занимает слишком много времени - PullRequest
0 голосов
/ 08 июня 2018

У меня проблема с одним запросом, этот запрос занимает слишком много времени, чтобы найти записи, иногда это занимает слишком много времени, отправляя данные, а иногда сортируя результаты. Я говорю о 10-20 секундах, эта таблица неочень большой, у меня есть большие таблицы с миллионами записей, эта таблица мала по сравнению с ними

SELECT idFactura,
       strNombre,
       intFolio,
       CH_razon_social AS strRazonSocial,
       CH_nombre_comercial AS strNombreComercial,
       CH_RFC AS strRFC,
       doubleTotal,
       intTimbrada,
       intCancelada,
       dateFechaHora,
       intStatus,
       strSerie,
       email_enviado,
       strFolioFiscal,
       numero_abonos,
       saldoInsoluto_pagos,
       tipo_comprobante,
       strSerieParc
  FROM tbl_factura2
 WHERE dateFechaHora >= '2018-05-06'
   AND dateFechaHora <= '2018-06-06'
   AND intTimbrada = 1
   AND intCancelada = 0
   AND cfdi_33 = 1
   AND RFC_usuario = 'NUSN900420SS5'
   AND numero_abonos = 0
   AND (strFormaPago = 'PPD'
    OR strMetodoPago = '99')
 ORDER 
    BY idFactura DESC;

, когда я использую команду EXPLAIN, это то, что я получаю, и вы можете видеть, что она принимаетidx_compuesto7 индекс, но иногда требуется другой, я знаю, что это зависит от того, что MySQL лучше для запроса, я хотел бы знать, что я могу изменить или другой способ сделать этот запрос, чтобы получить лучшую производительность, я знаю, чтоOR в запросе может быть проблемой, но я попытался выполнить запрос как два разных, чтобы удалить OR, но у меня возникла та же проблема.

*************************** 1. row *************************** id: 1 select_type: SIMPLE table: tbl_factura2 type: ref possible_keys: idx_fecha,idx_timbrada,idx_cancelada,idx_formaPago,idx_cfdi33,idx_rfc_usuario,idx_strMetodoPago,idx_compuesto3,idx_compuesto4,idx_compuesto5,idx_compuesto6,idx_compuesto7,idx_compuesto8,idx_compuesto9,idx_compuesto10,idx_compuesto11,idx_compuesto12 key: idx_compuesto7 key_len: 52 ref: const rows: 40 Extra: Using where; Using filesort

какВы можете увидеть возможные числа строк 40 records, но при выполнении этого запроса я просто получаю 1 record, я не знаю, является ли это приемлемым или нет, учитывая общее количество записейвся таблица

Это определение целых индексов этой таблицы

+--------------+------------+-------------------------+--------------+---------------------------+-----------+-------------+----------+--------+------+------------+---------+
| Table        | Non_unique | Key_name                | Seq_in_index | Column_name               | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+--------------+------------+-------------------------+--------------+---------------------------+-----------+-------------+----------+--------+------+------------+---------+
| tbl_factura2 |          0 | PRIMARY                 |            1 | idFactura                 | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_contador            |            1 | idContador                | A         |        2248 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_fecha               |            1 | dateFechaHora             | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_timbrada            |            1 | intTimbrada               | A         |           5 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_cancelada           |            1 | intCancelada              | A         |           5 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_contadorSub         |            1 | idContadorSub             | A         |         131 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_folio               |            1 | intFolio                  | A         |        1578 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_formaPago           |            1 | strFormaPago              | A         |          13 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_email_enviado       |            1 | email_enviado             | A         |           5 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_cfdi33              |            1 | cfdi_33                   | A         |          59 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_status              |            1 | intStatus                 | A         |           5 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_serie               |            1 | strSerie                  | A         |         538 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_rfc_usuario         |            1 | RFC_usuario               | A         |       17991 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_facturaexcel        |            1 | facturaExcel              | A         |           5 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_razonSocial         |            1 | CH_razon_social           | A         |       33734 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_nombreComercial     |            1 | CH_nombre_comercial       | A         |        2620 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_RFC                 |            1 | CH_RFC                    | A         |       67469 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_folio_fiscal        |            1 | strFolioFiscal            | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_saldoInsoluto       |            1 | saldoInsoluto_pagos       | A         |           7 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_tipo_comprobante    |            1 | tipo_comprobante          | A         |           5 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_existe_facprincipal |            1 | existe_facturaPrinc_pagos | A         |           5 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_strMetodoPago       |            1 | strMetodoPago             | A         |           7 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto1          |            1 | idFactura                 | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto1          |            2 | idContador                | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto1          |            3 | cfdi_33                   | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto2          |            1 | idContador                | A         |        2306 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto2          |            2 | cfdi_33                   | A         |        3551 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto3          |            1 | dateFechaHora             | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto3          |            2 | intTimbrada               | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto3          |            3 | intCancelada              | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto3          |            4 | cfdi_33                   | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto3          |            5 | RFC_usuario               | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto4          |            1 | RFC_usuario               | A         |        4819 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto4          |            2 | intTimbrada               | A         |        5997 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto4          |            3 | intCancelada              | A         |        8705 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto4          |            4 | cfdi_33                   | A         |       11244 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto5          |            1 | dateFechaHora             | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto5          |            2 | RFC_usuario               | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto5          |            3 | intTimbrada               | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto5          |            4 | intCancelada              | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto5          |            5 | cfdi_33                   | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto6          |            1 | RFC_usuario               | A         |        3551 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto6          |            2 | dateFechaHora             | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto6          |            3 | intTimbrada               | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto6          |            4 | intCancelada              | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto6          |            5 | cfdi_33                   | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto7          |            1 | RFC_usuario               | A         |        8995 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto7          |            2 | dateFechaHora             | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto7          |            3 | intTimbrada               | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto7          |            4 | intCancelada              | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto7          |            5 | cfdi_33                   | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto7          |            6 | numero_abonos             | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto7          |            7 | saldoInsoluto_pagos       | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto7          |            8 | tipo_comprobante          | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto8          |            1 | dateFechaHora             | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto8          |            2 | RFC_usuario               | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto8          |            3 | intTimbrada               | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto8          |            4 | intCancelada              | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto8          |            5 | cfdi_33                   | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto8          |            6 | strMetodoPago             | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto8          |            7 | numero_abonos             | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto9          |            1 | dateFechaHora             | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto9          |            2 | intTimbrada               | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto9          |            3 | intCancelada              | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto9          |            4 | cfdi_33                   | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto9          |            5 | numero_abonos             | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto9          |            6 | strFormaPago              | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto9          |            7 | RFC_usuario               | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto10         |            1 | dateFechaHora             | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto10         |            2 | intTimbrada               | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto10         |            3 | intCancelada              | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto10         |            4 | cfdi_33                   | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto10         |            5 | numero_abonos             | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto10         |            6 | strMetodoPago             | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto10         |            7 | RFC_usuario               | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto11         |            1 | RFC_usuario               | A         |        3696 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto11         |            2 | dateFechaHora             | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto11         |            3 | intTimbrada               | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto11         |            4 | intCancelada              | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto11         |            5 | cfdi_33                   | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto11         |            6 | numero_abonos             | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto11         |            7 | strFormaPago              | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto12         |            1 | RFC_usuario               | A         |       12851 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto12         |            2 | dateFechaHora             | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto12         |            3 | intTimbrada               | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto12         |            4 | intCancelada              | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto12         |            5 | cfdi_33                   | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto12         |            6 | numero_abonos             | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
| tbl_factura2 |          1 | idx_compuesto12         |            7 | strMetodoPago             | A         |      269877 |     NULL | NULL   |      | BTREE      |         |
+--------------+------------+-------------------------+--------------+---------------------------+-----------+-------------+----------+--------+------+------------+---------+

Для меня запрос не принимает правильный индекс, или, возможно, мне нужно сделать другой составной индекс, чтобы исправитьthis.

Это количество различных значений полей, используемых в запросе, если эта информация кому-то полезна, видите ли вы что-то не так с информацией и способом выполнения запроса?Я надеюсь, что вы можете помочь мне улучшить это, спасибо.

*************************** 1. row *************************** count(distinct dateFechaHora): 260117 count(distinct intTimbrada): 2 count(distinct intCancelada): 2 count(distinct cfdi_33): 2 count(distinct RFC_usuario): 3621 count(distinct numero_abonos): 9 count(distinct strFormaPago): 19 count(distinct strMetodoPago): 161 total_records: 263320

1 Ответ

0 голосов
/ 08 июня 2018

Шаг 1. Избавьтесь от любого индекса, в котором есть столбцы после dateFechaHora.Когда в WHERE есть диапазон, использование индекса прекращается после проверки этого столбца.

Шаг 2. Избавьтесь от INDEX(a), если у вас есть INDEX(a,b).Расширьте это «правило» на любой префикс.

Для этого конкретного запроса, вот оптимальный индекс:

INDEX(intTimbrada, intCancelada, cfdi_33, RFC_usuario, numero_abonos, -- in any order
      dateFechaHora)   -- last

См. Index Cookbook.

Что касается удаления OR, это может помочь:

    (
        SELECT  ...
            FROM  tbl_factura2
            WHERE  ...
              AND  strFormaPago = 'PPD'
    )
    UNION DISTINCT
    (
        SELECT  ...
            FROM  tbl_factura2
            WHERE  ...
              AND  strMetodoPago = '99' 
    )
    ORDER BY  idFactura DESC;

плюс эти два индекса:

INDEX(intTimbrada, intCancelada, cfdi_33, RFC_usuario, numero_abonos, strFormaPago,
      dateFechaHora)   -- last
INDEX(intTimbrada, intCancelada, cfdi_33, RFC_usuario, numero_abonos, strMetodoPago,
      dateFechaHora)   -- last

Как правило: если у вас есть OR, мешающий работе,

  • Сделайте 2 SELECTs, вставляя одну сторону OR в каждую;
  • Удалить ORDER BY, если имеется.(LIMIT более сложный; здесь не рассматривается.)
  • Соедините SELECTs с UNION ALL, если вы уверены, что нет перекрытия, или UNION DISTINCT (медленнее), если могут быть дуплексы.
  • Используйте парены, чтобы при добавлении ORDER BY в конец он явно принадлежал UNION, а не последнему SELECT.
  • Создайте 2 новых индекса в соответствии с тем жеправила в моей Кулинарной книге, одно из которых направлено на каждую SELECT.

Но ... UNION имеет некоторые накладные расходы, поэтому может или не ускорить запрос.(Я догадываюсь , что это не будет выгодно для этого запроса.)

...