如何更快地进行此UPDATE查询?

时间:2016-09-20 10:54:20

标签: mysql sql

我需要提高此更新查询的效率。

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

现在,当我的数据列表非常大时,完成工作需要2分钟以上。以下是对此查询的解释结果:

+----+-------------+--------------+-------+---------------+---------+---------+------+--------+------------------------------+
| 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 |
+----+-------------+--------------+-------+---------------+---------+---------+------+--------+------------------------------+

在课堂上,有人告诉我,一个好的查询至少应该有一个range类型,最好到达ref。现在我的是index,这是我认为的第二慢。我想知道是否有办法优化它。

以下是表格格式:

+--------------------+-------------+------+-----+-------------------+-------+
| 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 |       |
+--------------------+-------------+------+-----+-------------------+-------+

我的朋友建议我使用exists而不是in条款可能有所帮助。但是,我似乎无法像exists

那样使用exists (A list of data)

1 个答案:

答案 0 :(得分:0)

对于此查询:

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

您需要#table_name#(#column_name1#)上的索引。

请注意,要更新的记录数对性能有很大影响。如果“数据列表”实际上是一个子查询,那么其他方法可能对提高性能更有帮助。