предисловие
О том, что такое индекс и как его использовать, мы говорили в предыдущих статьях.explain
Анализировать использование индексов, способы оптимизации индексов иshow profiles
анализироватьSQL
Обучение потреблению ресурсов выполнения операторов. Сегодня мы поговоримMySQL
Различные блокировки, здесь механизм хранения, который мы используемInnoDB
Готов к работе
Создайте таблицу tb_innodb_lock
drop table if exists test_innodb_lock;
CREATE TABLE test_innodb_lock (
a INT (11),
b VARCHAR (20)
) ENGINE INNODB DEFAULT charset = utf8;
insert into test_innodb_lock values (1,'a');
insert into test_innodb_lock values (2,'b');
insert into test_innodb_lock values (3,'c');
insert into test_innodb_lock values (4,'d');
insert into test_innodb_lock values (5,'e');
создать индекс
create index idx_lock_a on test_innodb_lock(a);
create index idx_lock_b on test_innodb_lock(b);
Демонстрация различных блокировок MySQL
- Во-первых, измените автоматическую транзакцию фиксации на ручную фиксацию:
set autocommit=0;
- Мы запускаем два окна сеанса A и B, имитируя блокировку одного из них и блокировку другого.
блокировка строки (запись и чтение)
- Оконное исполнение
update test_innodb_lock set b='a1' where a=1;
SELECT * from test_innodb_lock;
Мы видим, что окно A может видеть обновленный результат
- исполнение окна B
SELECT * from test_innodb_lock;
Мы видим, что окно B не может видеть обновленные результаты, но старые данные все еще видны, потому что строка a = 1 заблокирована оператором SQL, выполняемым окном A, и операция фиксации не выполняется. Итак, окно B по-прежнему видит старые данные. Это «фиксация чтения» на уровне изоляции MySQL.
- Окно A выполняет операцию фиксации
COMMIT;
- Запрос окна B
SELECT * from test_innodb_lock;
В это время мы обнаружили, что окно B прочитало последние данные
блокировка строки (запись и запись)
- Окно A выполняет обновление для записей с a = 1.
update test_innodb_lock set b='a2' where a=1;
В это время фиксации фиксации нет, и блокировка удерживается окном А.
- Окно B также выполняет обновление записи с a = 1.
update test_innodb_lock set b='a3' where a=1;
Видно, что окно B было в состоянии блокировки, потому что окно A еще не выполнило фиксацию и все еще удерживает блокировку. Окно B не может захватить блокировку строки a = 1, поэтому оно продолжает блокироваться и ждать.
- Окно A выполняет операцию фиксации
COMMIT;
- Окно B меняется
Вы можете видеть, что окно B было успешно выполнено в это время.
блокировка стола
В случае сбоя индекса блокировка строки будет обновлена до блокировки таблицы.Один из способов сделать индекс недействительным — это автоматически или вручную изменить индекс. Поле a само по себе является целым числом. Когда мы добавляем кавычки, оно становится строкой. В это время индекс будет недействительным.
- Окно A обновляет записи с a = 1
update test_innodb_lock set b='a4' where a=1 or a=2;
- Окно B обновляет запись с a = 2
update test_innodb_lock set b='b1' where a=3;
В это время было обнаружено, что, хотя строки, обновленные окнами A и B, были разными, окно B все еще было заблокировано, потому что индекс окна A дал сбой, что привело к обновлению блокировки строки до блокировки таблицы, блокируя всю таблицу. , а индексное окно B заблокировано.
- Окно A выполняет операцию фиксации
COMMIT;
- Окно B меняется
Вы можете видеть, что окно B было успешно выполнено в это время.
гэп замок
- Что такое гэп-лок
Когда мы запрашиваем данные, используя условия диапазона, InnoDB блокирует данные в этом диапазоне. Например, есть 4 куска данных с id: 1, 3, 5, 7, ищем данные в диапазоне 1-7. Тогда 1-7 будут заблокированы. 2, 4, 6 также находятся в диапазоне 1-7, но этих записей данных не существует, эти 2, 4, 6 называются пробелами.
- Опасности щелевых замков
При поиске в диапазоне все данные во всем диапазоне будут заблокированы. Даже некоторые данные, которые не существуют в этом диапазоне, будут безвинно заблокированы. Например, если я хочу вставить 2 в 1, 3, 5 и 7, на этот раз 1-7 все заблокированы, а 2 вообще нельзя вставить. В некоторых сценариях производительность будет сильно снижена.
- Демонстрация Gap Lock
Сначала мы изменяем значение поля a на 1, 3, 5, 7, 9.
- Окно A обновляет данные в диапазоне a = 1~7.
update test_innodb_lock set b='b5' where a>1 and a<7;
- Окно B вставляет данные в a = 2
insert into test_innodb_lock values(2, "b6");
В это время обнаружено, что операция обновления a = 2 в окне B находится в ожидании, поскольку данные в диапазоне 1~7 заблокированы замком промежутка. Только когда окно A выполняет фиксацию, можно успешно обновить a = 2 окна B.
анализ блокировки строк
- Выполнение команд разбора SQL
show status like 'innodb_row_lock%';
-
Имя_переменной Описание
-
Innodb_row_lock_current_waits: количество ожидающих блокировок.
-
Innodb_row_lock_time: время, в течение которого система была заблокирована до настоящего момента.
-
Innodb_row_lock_time_avg: Среднее время ожидания блокировки каждый раз.
-
Innodb_row_lock_time_max: время ожидания самой длинной блокировки с момента запуска системы.
-
Innodb_row_lock_waits: общее количество раз, когда система ожидала блокировки с момента запуска системы.
-
Эпилог
Вы можете рассмотреть возможность оптимизации в соответствии с параметрами Variable_name.Если время блокировки и количество блокировок слишком велико, пора подумать об оптимизации. Методы оптимизации см. в предыдущей статье об оптимизации индекса.
айтишник
一个在大厂做高级Java开发的程序猿
Обратите внимание на публичный аккаунт WeChat: IT-брат
Ответ: полный набор учебных пособий по Java, которые вы можете получить: основы Java, веб-приложение Java, все учебные пособия по JavaEE, включая весеннюю загрузку и т. д.
Re: Шаблон резюме, вы можете получить 100 красивых резюме
Re: Маршрут обучения Java, вы можете получить самую последнюю и самую полную дорожную карту обучения
Re: Java eBook, вы можете получить 13 обязательных к прочтению книг для лучших программистов