简体   繁体   中英

How can I make this UPDATE query faster?

I need to make this update query more efficient.

UPDATE #table_name# SET #column_name2# = 1 WHERE #column_name1# in (A list of data)

Right now it takes more than 2 minute to finish the job when my list of data is quite large. Here is the result of explain of this query:

+----+-------------+--------------+-------+---------------+---------+---------+------+--------+------------------------------+
| id | select_type | table        | type  | possible_keys | key     | key_len | ref  | rows   | Extra                        |
+----+-------------+--------------+-------+---------------+---------+---------+------+--------+------------------------------+
|  1 | SIMPLE      | #table_name# | index | NULL          | PRIMARY | 38      | NULL | 763719 | Using where; Using temporary |
+----+-------------+--------------+-------+---------------+---------+---------+------+--------+------------------------------+

In class, I was told that an OK query should at least have a type of range and is better to reach ref . Right now mine is index , which is the second slowest I think. I'm wondering if there's a way to optimize that.

Here is the table format:

+--------------------+-------------+------+-----+-------------------+-------+
| Field              | Type        | Null | Key | Default           | Extra |
+--------------------+-------------+------+-----+-------------------+-------+
| #column_name1#     | varchar(12) | NO   | PRI |                   |       |
| #column_name2#     | tinyint(4)  | NO   |     | 0                 |       |
| #column_name3#     | tinyint(4)  | NO   |     | 0                 |       |
| ENTRY_TIME         | datetime    | NO   |     | CURRENT_TIMESTAMP |       |
+--------------------+-------------+------+-----+-------------------+-------+

My friend suggested me that using exists rather than in clause may help. However, it looks like I cannot use exists like exists (A list of data)

For this query:

UPDATE #table_name#
    SET #column_name2# = 1
    WHERE #column_name1# in (A list of data);

You want an index on #table_name#(#column_name1#) .

Do note that the number of records being updated has a very big impact on performance. If the "list of data" is really a subquery, then other methods are likely to be more helpful for improving performance.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM