Mysql Insert Ignore .. При повторном обновлении ключа вызывает Deadlock - PullRequest
0 голосов
/ 08 декабря 2018

Я использую Mysql версии 5.7, когда я использовал вставку массовых данных в таблицу с помощью вставки игнорировать .. при обновлении дубликата ключа.Если такая же запись найдена, время будет обновлено.Ниже приведена схема моей таблицы.

CREATE TABLE `unauthuserpostview` (
    `postid` bigint(20) unsigned NOT NULL,
    `serial` varchar(255) DEFAULT NULL,
    `createdat` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    UNIQUE KEY `idx_unauthuserpostview_postid_serial` (`postid`,`serial`)
    ) ENGINE=InnoDB 

Ниже приведен мой массовый запрос вставки.

INSERT IGNORE INTO unauthuserpostview(postid,serial) VALUES ( 44654, 'qpmpf' ),( 44653, 'qpmpf' ),( 44652, 'qpmpf' ),( 44651, 'qpmpf' ),( 44650, 'qpmpf' ),( 44649, 'qpmpf' ),( 44648, 'qpmpf' ),( 44647,             'qpmpf' ),( 44646, 'qpmpf' ),( 44645, 'qpmpf' )on duplicate key update createdat = now()

Запрос работает правильно, но иногда вызывает тупик.Почему когда-нибудь это вызывает тупик и как это решить?И для лучшей производительности я использую массовую вставку.Ниже приведен результат взаимоблокировки: -

 LATEST DETECTED DEADLOCK
    ------------------------
    2018-12-08 08:36:10 0x7f3c5794c700
    *** (1) TRANSACTION:
    TRANSACTION 2488051, ACTIVE 0 sec inserting
    mysql tables in use 1, locked 1
    LOCK WAIT 3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1
    MySQL thread id 65, OS thread handle 139897890834176, query id 12946 192.168.1.127 root update
     INSERT IGNORE INTO unauthuserpostview(postid,serial) VALUES ( 44654, 'qpmpf' ),( 44653, 'qpmpf' ),( 44652, 'qpmpf' ),( 44651, 'qpmpf' ),( 44650, 'qpmpf' ),( 44649, 'qpmpf' ),( 44648, 'qpmpf' ),( 44647,            'qpmpf' ),( 44646, 'qpmpf' ),( 44645, 'qpmpf' )on duplicate key update createdat = now()
    *** (1) WAITING FOR THIS LOCK TO BE GRANTED:
    RECORD LOCKS space id 422 page no 79 n bits 592 index idx_unauthuserpostview_postid_serial of table `development`.`unauthuserpostview` trx id 2488051 lock_mode X locks gap before rec insert intention   waiting
    Record lock, heap no 491 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
     0: len 8; hex 000000000000ae6e; asc        n;;
     1: len 5; hex 7172656d73; asc qrems;;
     2: len 6; hex 00000089bb9e; asc       ;;

    *** (2) TRANSACTION:
    TRANSACTION 2488045, ACTIVE 0 sec inserting
    mysql tables in use 1, locked 1
    4 lock struct(s), heap size 1136, 3 row lock(s), undo log entries 1
    MySQL thread id 113, OS thread handle 139897144133376, query id 12936 192.168.1.127 root update
    INSERT IGNORE INTO unauthuserpostview(postid,serial) VALUES ( 44654, 'qfdvj' ),( 44653, 'qfdvj' ),( 44652, 'qfdvj' ),( 44651, 'qfdvj' ),( 44650, 'qfdvj' ),( 44649, 'qfdvj' ),( 44648, 'qfdvj' ),( 44647,             'qfdvj' ),( 44646, 'qfdvj' ),( 44645, 'qfdvj' )on duplicate key update createdat = now()
    *** (2) HOLDS THE LOCK(S):
    RECORD LOCKS space id 422 page no 79 n bits 576 index idx_unauthuserpostview_postid_serial of table `development`.`unauthuserpostview` trx id 2488045 lock_mode X locks gap before rec
    Record lock, heap no 491 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
     0: len 8; hex 000000000000ae6e; asc        n;;
     1: len 5; hex 7172656d73; asc qrems;;
     2: len 6; hex 00000089bb9e; asc       ;;

    *** (2) WAITING FOR THIS LOCK TO BE GRANTED:
    RECORD LOCKS space id 422 page no 79 n bits 592 index idx_unauthuserpostview_postid_serial of table `development`.`unauthuserpostview` trx id 2488045 lock_mode X locks gap before rec insert intention waiting
    Record lock, heap no 491 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
     0: len 8; hex 000000000000ae6e; asc        n;;
     1: len 5; hex 7172656d73; asc qrems;;
     2: len 6; hex 00000089bb9e; asc       ;;

    *** WE ROLL BACK TRANSACTION (1)  

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

SELECT p.postid from postmst p  
left JOIN unauthuserpostview uv on p.postid = uv.postid and uv.serial 
= 'qpmpf' 
where uv.postid is NULL ORDER by p.postid desc LIMIT 50;

То есть мой индекс верен или не подходит для вышеуказанного запроса?

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