Jac Mar Jac Mar - 3 months ago 9
SQL Question

Why this MYSQL UPDATE querry takes 2 minutes?

This Query takes almost 2minutes to execute (changing 9 records):

UPDATE table1 t1
SET t1.code_id = null, t1.code_group = null
WHERE t1.another_id IN (SELECT t2.another_id
FROM table2 t2
WHERE ((t2.id_parent= 2658 AND t2.year= 2016)
OR
(t2.id= 2658 AND t2.year= 2016)))


Executing this query alone takes 0.0030s:

SELECT t2.another_id
FROM table2 t2
WHERE ((t2.id_parent= 2658 AND t2.year= 2016)
OR
(t2.id= 2658 AND t2.year= 2016))


and returns 3 results in form of a integer.

Here is info about both tables:

CREATE TABLE IF NOT EXISTS `table1` (
`another_id` int(11) NOT NULL,
`table1_id` int(11) NOT NULL,
`code_group` varchar(1) DEFAULT NULL,
`code_id` int(10) DEFAULT NULL,
PRIMARY KEY (`another_id`,`table1_id`),
KEY `another_id` (`another_id`),
KEY `code_group` (`code_group`,`code_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `table2` (
`id_year` int(11) NOT NULL,
`id` int(11) NOT NULL,
`id_parent` int(11) DEFAULT NULL,
`another_id` int(11) NOT NULL,
`code_group` varchar(1) DEFAULT NULL,
`code_id` int(10) DEFAULT NULL,
PRIMARY KEY (`id_year`,`id`),
KEY `id_parent` (`id_year`,`id_parent`)
KEY `another_id` (`another_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_polish_ci;


Is there anyone, who can tell my why it needs 2 minutes to execute this query?

Answer

IN can sometimes impede optimization. I would start by putting the subquery directly in the FROM clause:

UPDATE table1 t1 JOIN
       (SELECT t2.another_id 
        FROM table2 t2
        WHERE ((t2.id_parent= 2658 AND t2.year= 2016) OR
               (t2.id= 2658 AND t2.year= 2016)
              )
       ) t2
       ON t1.another_id = t2.another_id
    SET t1.code_id = null,
        t1.code_group = null;

Then, looking at this query, I would recommend an index on table1(another_id). In fact, that index might be sufficient for your original query.

Comments