Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Блокировки в MySQL InnoDB и MyISAM

Лекция



Привет, сегодня поговорим про блокировки в mysql innodb, обещаю рассказать все что знаю. Для того чтобы лучше понимать что такое блокировки в mysql innodb, myisam , настоятельно рекомендую прочитать все из категории Базы данных, знаний и хранилища данных. Big data, СУБД и SQL и noSQL.

Механизм блокирования в MySQL


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

MySQL от имени одного из клиентов накладывает блокировку на определенный ресурс, при этом другие клиенты ждут освобождения блокировки. Блокировка может быть на уровне таблиц (блокируется таблица) или на уровне строк (блокируются определенные строки таблицы). В механизме хранения MyISAM (используемом по умолчанию) реализована табличная блокировка, а в механизме InnoDB построчная. Построчная блокировка достигается посредством усложнения структуры хранилища: в MyISAM структура файла с данными представляет собой простое перечисление строк таблицы, тогда как хранилище InnoDB структурировано и поддерживает мультиверсионность данных. Поэтому, InnoDB выигрывает в приложениях, в которых происходит многопоточное изменение данных в одну и ту же таблицу, несмотря на необходимые потери на обслуживание более сложного хранилища.

Блокировки бывают двух видов: на чтение и на запись.

  1. Если A хочет читать данные, то другие клиенты тоже могут читать данные, но никто не может записывать, пока А не закончит чтение (read lock).
  2. Если А хочет записать данные, то другие клиенты не должны ни читать ни писать эти данные пока А не закончит(write lock).

Блокировка может быть наложена явно или неявно.

  1. Если клиент не назначает блокировку явным образом, MySQL сервер неявно устанавливает необходимый тип блокировки на время выполнения выражения или транзакции. Например, в случае выполнения оператора SELECT сервер установит READ LOCK, а в случае UPDATE — WRITE LOCK. При неявной блокировке уровень блокировки зависит от типа хранилища данных: для MyISAM, MEMORY и MERGE блокируется вся таблица, для InnoDB — только используемые в выражении строки (в случае, если набор этих строк может быть однозначно определен значениями первичного ключа — иначе, блокируется вся таблица).
  2. Часто возникает необходимость выполнения нескольких запросов подряд без вмешательства других клиентов в это время. Неявная блоктровка не подходит для этих целей, так как устанавливается только на время выполнения одного запроса. В этом случае клиент может явно назначить, а потом отменить блокировку с помощью выражений LOCK TABLES и UNLOCK TABLES. Явной блокировка всегда блокирует всю таблицу, независимо от механизма хранения.

Использование явных блокировок


В случае явной блокировки можно получить выигрыш производительности за счет однократного назначения блокировки и задержки записи обновленных индексов до на время блокировки. При назначении явной блокировки, указываются имя таблицы и тип блокировки:LOCK TABLES Country READ, City WRITE;Оператор UNLOCK TABLES не имеет аргументов и снимает все блокировки, установленные явно в рамках текущей сессии.

Обратите внимание на следующие особенности явных блокировок:

  • Пока клиент удерживает явную блокировку, он не может использовать другие таблицы, поэтому блокировать нужно сразу все что понадобится (одним выражением), так как повторное использование оператора LOCK TABLES отменяет сделанные ранее блокировки.
  • Блокировка может быть установлена на представление (VIEW) начиная с версии 5.0.6. Для ранних версий, необходимо установливать блокировку на все таблицы, входящие в представление.
  • Разрыв соединения или завершение сессии автоматически снимает все установленные в рамках данной сессии блокировки.
  • Блокировка таблиц может быть нарушена транзакцией и наоборот. START TRANSACTION неявным образом осуществляет UNLOCK TABLES и наоборот LOCK TABLES откатывает незаконченную транзакцию.
  • Для установки блокировки требуется иметь привилегии LOCK TABLES и SELECT на каждую блокируемую таблицу.
  • Если одна из требуемых таблиц заблокирована в рамках другой сессии, то оператор блокировки не выполнится пока все таблицы не освободятся.

Типы блокировок:

  • READ — блокирует таблицу для чтения. Об этом говорит сайт https://intellect.icu . Все клиенты могут получать данные одновременно, но никто не может их изменять, даже тот клиент, который установил блокировку.
  • WRITE — блокирует таблицу для записи. Только клиент установивший блокировку может получать и изменять данные.
  • READ LOCAL — блокирует таблицу для чтения, но позволяет осуществлять вставку данных (INSERT). Применимо только к таблицам MyISAM, которые не имеют дыр, образованных в результате изменения или удаления строк. В этом случае, добавление новых данных производится в конец таблицы. Если таблица имеет дыры, то их можно устранить, используя оператор OPTIMIZE TABLE.
  • LOW_PRIORITY WRITE — блокирует таблицу для записи, но во время ожидания блокировки пропускает тех клиентов, которые стоят в очереди на получения блокировки типа READ. Во время ожидания блокировки, новые поступающие запросы на блокировку типа READ также пропускаются вперед, что может потенциально привести к тому, что запись не будет произведена никогда (если всегда есть клиенты в очереди на чтение).

Примечание: системная переменная concurrent_inserts определяет возможность добавления данных в конец таблицы MyISAM, заблокированной для чтения. По умолчанию, эта переменная равна 1, что означает возможность добавления данных при отсутствии в таблице дыр. Таким образом, в случае неявной блокировки, для таблиц MyISAM устанавливается READ LOCAL, а не READ. Значение concurrent_inserts равное 0 запрещает добавление данных параллельно с чтением, а равное 2 разрешает вставку данных в конец таблицы даже при наличии в таблице дыр.

Заключение


В статье рассмотрены лишь основные вопросы использования блокировок в MySQL. Не освещены транзакции, уровни изоляции, advisory lock и др. Напишите в комментариях какие из вопросов вам интересны.

Баннерокрутилки на MySQL

Названием "баннерокрутилки на MySQL" озаглавлена заметка, посвященная примерам некорректного и неэффективного использования сервера MySQL. Типичным примером системы, работа которой с MySQL часто бывает неэффективной, является менеджер рекламных баннеров.

В качестве примера был проведен анализ программы PHP Ad Manager. Программа была выбрана случайно из десятков подобных ей на sourceforge.net.

Основные возможности программы перечислены ниже:

  • Управление рекламными баннерами на нескольких доменах
  • Подсчет количества хитов (показов) и кликов
  • Хранение статистики в MySQL
  • Онлайн-обновление статистики

Запросы, которые выполняются баннерокрутилкой

Ниже приведен сокращенный и упрощенный перечень запросов, который выполняется системой PHP Ad Manager при каждом показе баннера.

Получение домена, для которого выполняется прокручивание баннера

select * from domains where ...

Получение списка рекламных блоков, которые можно пользователю на этом домене показать

select * from ads 
    where active = 'Y' 
    and expiredate > 'ТЕКУЩЕЕ-ВРЕМЯ' 
    and domains LIKE '%ДОМЕН%' 
order by lastdisplay;

Обновление информации о моменте последнего показа этой рекламы:

update ads set lastdisplay = 'ТЕКУЩЕЕ-ВРЕМЯ', hits='КОЛИЧЕСТВО ХИТОВ' WHERE adid = 'ИДЕНТИФИКАТОР'

Запись информации в лог

insert into adlog 
       SET adid = 'ИД-БАННЕРА',
           type = 'hit',
           remotehost = '....',
           remoteaddr = '....',
           site = '.....',
           entrydate = '....';

Блокировки таблиц в MySQL

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

В соответствии с документацией к MySQL, MySQL использует блокировки на уровне таблиц для MyISAM, и блокировки на уровне строк для таблиц InnoDB. MySQL поддерживает два типа блокировок: на запись и на чтение. Блокировки на запись имеют преимущество перед блокировками на чтение. Это с одной стороны, приводит к тому, что запросы на вставку/обновление данных не "зависают" при большом количестве запросов на чтение. С другой стороны, при большом количестве запросов на обновление данных запросы на чтение могут дожидаться своей очереди очень долго.

Для демонстрации проблемы рассмотрим два примера. Первый пример приведен на рисунке, представленном ниже. В этом случае к серверу MySQL почти одновременно приходит четыре запроса на выборку (SELECT). Видно, что поскольку запросы SELECT имеют возможность одновременного выполнения, время ожидания результата каждого запроса фактически зависит только от времени выполнения непосредственно запроса.

Блокировки в MySQL InnoDB и MyISAM

Во втором случае схематично представлена ситуация, в которой к одной и той же таблице MySQL почти одновременно обращаются 4 запроса, из которых два запроса - это запросы на выборку, а другие два - запросы на обновление данных. Из-за того, что запросы на обновление встают в очередь на исполнение перед запросами на выборку, а также потому, что в MyISAM-таблице они не могут выполняться одновременно с другими запросами, время ожидания результата SELECT-а существенно увеличивается.

Блокировки в MySQL InnoDB и MyISAM

Дополнительно нужно отметить, что если бы первый запрос оказался "тяжелым" (с длительным временем исполнения), это еще более усугубило бы ситуацию второго случая. Если бы ни UPDATE, все SELECT-ы бы выполнялись одновременно, однако наличие одного UPDATE приводит к тому, что он разбивает очередь запросов на две: до себя и после, и SELECT-ы на третьем этапе не выполнятся до завершения первых двух этапов.

Оценка количества заблокированных запросов может быть выполнена так:

mysql> SHOW STATUS LIKE 'Table%';
+-----------------------+---------+
| Variable_name         | Value   |
+-----------------------+---------+
| Table_locks_immediate | 1151552 |
| Table_locks_waited    | 15324   |
+-----------------------+---------+

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

Утилита тестирования производительности

Для тестирования производительности можно воспользоваться программой mysqlslap, которая входит в состав MySQL 5.1.4 и выше (для lenny доступен в репозитории dotdeb).

Способы оптимизации производительности

Понижение приоритета UPDATE

Из приведенного выше описания видно, что проблемы возникают в том числе и из-за того, что приоритет операций UPDATE выше приоритета операций на выборку данных. Простое решение, которое, вероятно, временно поможет снизить остроту проблемы состоит в том, чтобы использовать вместо запроса UPDATE запрос UPDATE LOW_PRIORITY. Подробное описание синтаксиса команды доступно в официальной документации

Использование временной таблицы

В ситуации большого количества запросов INSERT, которые могут блокировать запросы SELECT, разработчики MySQL рекомендуют использовать временную таблицу, данные из которой могут переноситься в основную с определенной периодичностью:

mysql> LOCK TABLES real_table WRITE, temp_table WRITE;
mysql> INSERT INTO real_table SELECT * FROM temp_table;
mysql> DELETE FROM temp_table;
mysql> UNLOCK TABLES;

Использование нереляционных баз данных

Нереляционные базы данных (по крайней мере, по заявлениям их разработчиков) в большей степени подходят для работы с информацией в режиме "количество обновлений сопоставимо с количеством выборок", чем MySQL. В качестве примера для такого использования может подойти mongodb.

mongodb умеет выполнять дешевые операции обновления "in-place" (инкрементирование счетчиков и т.п.) без реальной передачи данных по сети, а также имеет режим вставки "upsert" (обновить объект, либо создать, если такой объект еще не найден). За подробностяим по использованию этих команд лучше всего обратиться к документации.

Ниже приведены две ссылки на статьи в блоге MongoDB (на англ.):

  • fast updates with mongodb update in place
  • mongodb is fantastic for logging

При разработке новых систем

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

mysql

Надеюсь, эта статья про блокировки в mysql innodb, была вам полезна, счастья и удачи в ваших начинаниях! Надеюсь, что теперь ты понял что такое блокировки в mysql innodb, myisam и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Базы данных, знаний и хранилища данных. Big data, СУБД и SQL и noSQL

Ответы на вопросы для самопроверки пишите в комментариях, мы проверим, или же задавайте свой вопрос по данной теме.

создано: 2015-02-20
обновлено: 2021-03-14
132853



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей



Комментарии


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

Базы данных, знаний и хранилища данных. Big data, СУБД и SQL и noSQL

Термины: Базы данных, знаний и хранилища данных. Big data, СУБД и SQL и noSQL