mysql плохая производительность запроса несовместима - PullRequest
0 голосов
/ 30 января 2019

У меня есть запрос, который выполняется за 25 секунд на одной машине и 0,00 секунды на другой.

EDIT - просто обновление mysql исправило это.Оставив вопрос в исторических целях.

объяснение расширенного показывает, что он вытаскивает 2084 строки в первой строке в плохой системе и 1 или 2 строки во всех остальных ... шагах?В хорошей системе все они состоят из 1-3 строк.

Медленный запрос выполняется на виртуальном экземпляре (AWS) с версией mysql 5.5.56 и имеет row_format = COMPACT.

Я вытащилвся БД в моей системе с mysqldump.Это более мощный рабочий стол, mysql версии 5.7.22, row_format = DYNAMIC после импорта.

Структура таблицы представляет собой довольно простую настройку внешнего ключа для "пакетных транзакций" и "транзакций с элементами" и "элементы имеют itemexceptions ".

Это запрос (запрос на накопление, автоматически сгенерированный из моделей django)

SELECT  COUNT(DISTINCT `decision_batch`.`id`)
    FROM  `decision_batch`
    INNER JOIN  `decision_transaction`
            ON (`decision_batch`.`id` = `decision_transaction`.`batch_id`)
    INNER JOIN  `decision_item`
            ON (`decision_transaction`.`id` = `decision_item`.`transaction_id`)
    WHERE  `decision_item`.`id` IN (
        SELECT  U0.`id`
            FROM  `decision_item` U0
            INNER JOIN  `decision_transaction` U1
                 ON (U0.`transaction_id` = U1.`id`)
            LEFT OUTER JOIN  `decision_itemexception` U2
                 ON (U0.`id` = U2.`item_id`)
            WHERE  U1.`batch_id` IN (2266)
            GROUP BY  U0.`id`, U0.`transaction_id`, U0.`item_type`,
                      U0.`sequence`, U0.`applied_amount`, U0.`accept`
            ORDER BY  NULL  );

Расширенное объяснение показывает" зависимый подзапрос "в плохой системе, но это"просто "до конца" в хорошей системе:

| id | select_type        | table                | type  | possible_keys       | key                             | key_len | ref                              | rows | filtered | Extra                        |
|  1 | PRIMARY            | decision_batch       | index | PRIMARY       | decision_batch_c81d214          | 4       | NULL                             | 2084 |   100.00 | Using index                        |
|  1 | PRIMARY            | decision_transaction | ref   | PRIMARY,decision_transaction_58f424c5,batch_transaction,transaction_accept | transaction_accept              | 4       | cloudbox.decision_batch.id       |    3 |   100.00 | Using index                        |
|  1 | PRIMARY            | decision_item        | ref   | decision_item_45d19ab3       | decision_item_45d19ab3          | 4       | cloudbox.decision_transaction.id |    1 |   100.00 | Using where; Using index                     
|  2 | DEPENDENT SUBQUERY | U1                   | ref   | PRIMARY,decision_transaction_58f424c5,batch_transaction,transaction_accept | decision_transaction_58f424c5   | 4       | const                            |    2 |   100.00 | Using index; Using temporary; Using filesort |
|  2 | DEPENDENT SUBQUERY | U0                   | ref   | decision_item_45d19ab3       | decision_item_45d19ab3          | 4       | cloudbox.U1.id                   |    1 |   100.00 |                        |
|  2 | DEPENDENT SUBQUERY | U2                   | ref   | decision_itemexception_67b70d25,item       | decision_itemexception_67b70d25 | 4       | cloudbox.U0.id                   |    1 |   100.00 | Using index    |    3 |   100.00 | Using index; End temporary   |

И если это поможет, покажите, как создать вывод таблицы (строки данных пропущены)

solution_batch

CREATE TABLE `decision_batch` (
`id` int(11) NOT NULL AUTO_INCREMENT,
...
PRIMARY KEY (`id`),
KEY `decision_batch_c81d214` (`box_id`),
KEY `decision_batch_1c65f4ce` (`finalized_by_id`),
KEY `dec_opt_idx` (`finalized`,`batch_status`,`box_id`),
CONSTRAINT `decision_batch_ibfk_1`
       FOREIGN KEY (`box_id`) REFERENCES `lockbox_lockbox` (`id`),
CONSTRAINT `finalized_by_id_refs_id_31bb6e9b`
       FOREIGN KEY (`finalized_by_id`) REFERENCES `config_user` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2267 DEFAULT CHARSET=latin1

Solution_transaction

CREATE TABLE `decision_transaction` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`batch_id` int(11) NOT NULL,
...
PRIMARY KEY (`id`),
KEY `decision_transaction_58f424c5` (`batch_id`),
KEY `batch_transaction` (`id`,`batch_id`),
KEY `transaction_accept` (`batch_id`,`accept`),
CONSTRAINT `batch_id_refs_id_24828b6d`
       FOREIGN KEY (`batch_id`) REFERENCES `decision_batch` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19306 DEFAULT CHARSET=latin1

Solution_item

CREATE TABLE `decision_item` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`transaction_id` int(11) NOT NULL,
...
PRIMARY KEY (`id`),
KEY `decision_item_45d19ab3` (`transaction_id`),
CONSTRAINT `transaction_id_refs_id_56c7fe1d`
       FOREIGN KEY (`transaction_id`) REFERENCES `decision_transaction` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=45544 DEFAULT CHARSET=latin1

Solution_itemexception

CREATE TABLE `decision_itemexception` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`item_id` int(11) NOT NULL,
...
PRIMARY KEY (`id`),
KEY `decision_itemexception_67b70d25` (`item_id`),
KEY `item` (`item_id`),
KEY `field` (`field_id`),
CONSTRAINT `field`
       FOREIGN KEY (`field_id`) REFERENCES `decision_field` (`id`)
           ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `item`
       FOREIGN KEY (`item_id`) REFERENCES `decision_item` (`id`)
           ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=44589 DEFAULT CHARSET=latin1
...