Почему блокировка на уровне таблицы лучше, чем блокировка на уровне строк для больших таблиц?

Согласно руководству по MySQL:

Для больших таблиц блокировка таблицы часто лучше, чем блокировка строки.

Почему это? Я бы предположил, что блокировка на уровне строк лучше, потому что, когда вы блокируете большую таблицу, вы блокируете больше данных.


person Jason Baker    schedule 11.08.2010    source источник


Ответы (5)


по (предварительно отредактированной) ссылке

Медленнее, чем блокировки на уровне страницы или таблицы при использовании на большой части таблицы, потому что вы должны получить намного больше блокировок

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

person µBio    schedule 11.08.2010
comment
Понимаю. Так что, возможно, было бы лучше, если бы это было более похоже на большие наборы результатов: блокировка таблицы часто лучше, чем блокировка строки. - person Jason Baker; 12.08.2010

  • Для блокировки строк требуется больше памяти, чем для блокировки на уровне таблицы или страницы.

  • Приходится приобретать гораздо больше блокировок с блокировкой строк, что требует больше ресурсов.

Из http://www.devshed.com/c/a/MySQL/MySQL-Optimization-part-2/

  • Преимущества блокировки на уровне строки:

    • Fewer lock conflicts when accessing different rows in many threads.
    • Меньше изменений для откатов.
    • Позволяет заблокировать одну строку на длительное время.
  • Недостатки блокировки на уровне строки:

    • Takes more memory than page-level or table-level locks.
    • Работает медленнее, чем блокировки на уровне страницы или на уровне таблицы, при использовании на большой части таблицы, потому что вы должны получить намного больше блокировок.
    • Это определенно намного хуже, чем другие блокировки, если вы часто выполняете операции GROUP BY для большой части данных или если вам часто приходится сканировать всю таблицу.
    • С блокировками более высокого уровня вы также можете легче поддерживать блокировки разных типов для настройки приложения, поскольку накладные расходы на блокировку меньше, чем для блокировок на уровне строк.
  • Блокировки таблиц лучше, чем блокировки на уровне страницы или строки в следующих случаях:

    • Most statements for the table are reads.
    • Чтение и обновление строгих ключей, когда вы обновляете или удаляете строку, которая может быть извлечена с помощью чтения одного ключа: UPDATE tbl_name SET column=value WHERE unique_key_col=key_value; DELETE FROM tbl_name WHERE unique_key_col=key_value;
    • SELECT в сочетании с параллельными операторами INSERT и очень немногими операторами UPDATE и DELETE.
    • Много сканирований или операций GROUP BY для всей таблицы без каких-либо средств записи.
person DVK    schedule 11.08.2010

Блокировка row на уровне таблицы лучше подходит для больших таблиц, в которых происходят основные изменения данных. Это позволяет системе бороться с одной блокировкой таблицы вместо того, чтобы иметь дело с огромным количеством блокировок (по одной для каждой строки).

СУРБД автоматически повышает уровни блокировки внутри себя.

person Raj More    schedule 11.08.2010
comment
Я думаю, вы имеете в виду, что блокировка строки лучше...: P - person Jon Black; 12.08.2010

Блокировка таблицы позволяет нескольким сеансам читать из таблицы одновременно.

Для достижения очень высокой скорости блокировки MySQL использует блокировку таблицы.

Я бы предположил, что блокировка на уровне строк лучше, потому что [вы блокируете меньше данных].

Первый лучше плохо определен на этой странице. Получается, что лучше значит быстрее.

Блокировка на уровне строк не может (в общем случае) быть быстрее из-за конкуренции за блокировки. Блокировка каждой строки большого набора результатов означает вполне реальную возможность конфликта с другим запросом большого набора результатов и отката.

person S.Lott    schedule 11.08.2010

В общем, если вам нужно заблокировать много данных, то 1 блокировка для большой таблицы дешевле, чем целая куча блокировок на уровне строк или страниц.

person SQLMenace    schedule 11.08.2010