Справочное руководство по MySQL версии 4.1.1-alpha


         

E.4 Методы блокировки


В настоящее время MySQL поддерживает только табличную блокировку для таблиц типов ISAM/MyISAM и HEAP, страничную блокировку для таблиц BDB и строковую блокировку для таблиц InnoDB (see section 5.3.1 Как MySQL блокирует таблицы). Для таблиц MyISAM можно произвольным образом сочетать команды INSERT и SELECT без блокировок, поскольку поддерживается управление версиями (Versioning).

Начиная с версии 3.23.33 имеется возможность анализировать конфликты и конкуренцию блокировок таблиц в системе. Это делается путем проверки переменных Table_locks_waited и Table_locks_immediate.

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

Аргументы в пользу строковой блокировки:

  • Меньше конфликтов блокировок при обращении к различным строкам из множества потоков.

  • Меньше изменений при откатах.

  • Возможна блокировка одной строки на длительное время.

    Аргументы против строковой блокировки

    • Требуется больше памяти, чем при страничной или табличной блокировке.

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

    • Определенно хуже других блокировок, если часто выполняется операция GROUP BY на значительной части данных или если приходится сканировать всю таблицу.

    • Для блокировок более высокого уровня также проще осуществить поддержку различных типов блокировок для настройки приложения, поскольку для них затраты на блокировку менее заметны, чем для строкового уровня блокировки.

      Блокировки на уровне таблиц лучше, чем блокировки страничного/строкового уровня в следующих случаях:

      • Когда производится главным образом чтение.

      • При чтении и обновлении для строго заданных ключей; при обновлении или удалении строки, которая может быть извлечена чтением одного ключа:

        UPDATE table_name SET column=value WHERE unique_key# DELETE FROM table_name WHERE unique_key=#



        Содержание  Назад  Вперед