2016-09-20 5 views
0

Мне нужно сделать этот запрос обновления более эффективным.Как я могу сделать этот запрос UPDATE быстрее?

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

В классе, мне сказали, что OK запрос должен, по крайней мере, иметь тип 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)

+0

'Exists' хочет выбрать оператор. Это немного отличается от 'in'. Но может быть быстрее, чем 'in'. Но есть разница в обработке значений «null». для получения дополнительной информации: http://stackoverflow.com/questions/14190788/subqueries-with-exists-vs-in-mysql – Nebi

+0

Вы обновляете 763719 записей? это будет медленно, независимо от того, что – e4c5

+0

Вы говорите «когда мой список данных достаточно велик». На сколько огромный? –

ответ

0

Для этого запроса:

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

Вы хотите индекс на #table_name#(#column_name1#).

Обратите внимание, что количество обновляемых записей оказывает очень большое влияние на производительность. Если «список данных» действительно является подзапросом, то другие методы могут быть более полезными для повышения производительности.

+0

Нужно ли сделать это индексом для первичного ключа? Я думаю, что это уже индекс –

+0

@BingGan. , , Если это уже * * первичный ключ, то дополнительный индекс не нужен. Если это первый ключ сложного первичного ключа, то дополнительный индекс не нужен. Если это следующий ключ первичного ключа, вам нужен индекс. –

Смежные вопросы