Я думал, что знаком с делами Mysql, пока не встретил интервьюера Али.

MySQL

предисловие

Подошел запыленный мужчина в клетчатой ​​рубашке, держа в руке MacBook Pro, глядя на редкие волосы и его спокойные глаза.

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

Конечно же, он взял мое резюме в руку, быстро просмотрел его, затем взглянул на меня краем глаза и спросил.

Введение в транзакции Mysql

"Интервьюер:"Увидев, что вы хорошо разбираетесь в методах оптимизации Mysql в своем резюме, давайте сначала поговорим о вашем понимании транзакций Mysql.

Я обрадовался, это просто, мы с братом из Пекинского университета (с большой спиной).

"Я:"Что ж, транзакция базы данных относится к логической единице обработки базы данных, состоящей из группы операторов SQL.В этой группе операций SQL либо все они выполняются успешно, либо все они не выполняются.

"Я:"Простым и классическим примером набора sql операций здесь является перевод.Если перевод должен быть выполнен в транзакции А, то нужно вычесть переданный счет, а добавить переданный счет.Обе операции должны быть выполнены в то же время Успех, чтобы обеспечить согласованность данных.

"Интервьюер:"Вы только что упомянули согласованность данных, знаете ли вы характеристики транзакций? Говорите о своем понимании.

Введение в КИСЛОТУ

"Я:"Четыре основные характеристики транзакций в Mysql в основном включают:"атомарность","Последовательный","изоляция","Прочный", Упоминается какACID.

"Я:"Атомарность относится к атомарной операции транзакции. Модификация данных либо выполняется успешно, либо все не удается. Атомарность транзакции реализуется на основе журнала.Redo/Undoмеханизм.

"Я:"Непротиворечивость означает, что состояние до и после выполнения транзакции должно быть непротиворечивым, что можно понимать как согласованность данных. Изоляция подчеркивает, что транзакции изолированы друг от друга и не затрагиваются, что тесно связано с уровнем изоляции, установленным транзакцией.

"Я:"Постоянство означает, что после фиксации транзакции ее состояние будет сохранено в базе данных, то есть транзакция зафиксирована, а новые и обновленные данные будут сохранены в библиотеке.

"Я:"В моем понимании, атомарность, изоляция и долговечность существуют для обеспечения согласованности, а согласованность также является конечной целью.

Я втайне радовался в душе. Закончив зазубривание, я обычно много читал. Во время интервью я говорил: «К счастью, это меня не беспокоило».

КИСЛОТНЫЙ принцип

"Интервьюер:"Только что вы сказали, что атомарность основана на логах.Redo/Undoмеханизм, не подскажете?Redo/Undoмеханизм?

а? Что я сказал, я случайно закопал большой гром для себя. Не паникуйте, у брата еще товар в голове, он сделал вид, что задумался, и помолчал несколько десятков секунд, а потом продекламировал.

"Я:"Механизм Redo/Undo относительно прост, они записывают все обновления данных в лог.

"Я:"Журнал повторов используется для записи измененного значения блока данных, который можно использовать для восстановления данных, обновленных успешными транзакциями, которые не были записаны в файл данных; Журнал отмен используется для записи значения перед обновлением данных, чтобы гарантировать что сбой обновления данных можно откатить.

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

"Интервьюер:"Можете ли вы привести сценарий и рассказать о конкретном процессе реализации?

"Я:"Да, если в какой-то момент происходит сбой базы данных, транзакция A и транзакция B выполняются до сбоя, транзакция A была зафиксирована, но транзакция B еще не зафиксирована. Когда база данных перезапускается для аварийного восстановления, изменения зафиксированных транзакций будут записаны в файл данных через журнал повторов, а те, которые не были зафиксированы, будут отброшены через журнал отмены.

Уровень изоляции транзакции

"Интервьюер:"Вы также упоминали об уровне изоляции транзакции, можете ли вы рассказать об этом?

"Я:"Да, уровень изоляции транзакций в Mysql делится на четыре уровня,"READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE".

"Я:"Read uncommitted будет читать незафиксированные данные другой транзакции, что приводит к проблеме грязного чтения.Read commit решает грязное чтение, и происходит неповторяемое чтение, то есть данные, считанные в любой момент транзакции, могут быть разными, и это может быть связано с другими транзакциями после фиксации модификации данных, как правило, для операции обновления.

"Я:"Повторяемое чтение решает предыдущие проблемы неповторяющихся и грязных чтений, но приводит к проблеме фантомных чтений, которые обычно нацелены на операции вставки.

"Я:"Например: первая транзакция запрашивает таблицу User с id=100 и обнаруживает, что строки данных не существует.В это время снова приходит вторая транзакция, добавляет новую строку данных с id=100 и отправляет транзакцию.

"Я:"В это время, когда первая транзакция добавляет строку данных с идентификатором = 100, будет сообщено о конфликте первичного ключа.Выберите первую транзакцию еще раз и обнаружите, что строка данных с идентификатором = 100 уже существует, что является фантомным чтением.

"Интервьюер:"Можешь продемонстрировать, парень? Я не очень хорош, ты можешь научить меня? Мой компьютер здесь, ты показываешь мне взглянуть.

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

"Я:"Сначала создайте таблицу пользователей, последняя - тестовая таблица, в тестовой таблице есть три поля и вставьте два тестовых данных.

CREATE TABLE User (
  id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(20),
  age INT	DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;

INSERT INTO user VALUES (1, 'zhangsan', 23); INSERT INTO user VALUES (2, 'lisi', 20);

"Я:"В Mysql вы можете сначала запросить его уровень изоляции по умолчанию.Видно, что уровень изоляции по умолчанию MysqlREPEATABLE-READ. "Я:"Давайте сначала продемонстрируем незафиксированное чтение, сначала изменим уровень изоляции по умолчанию наREAD UNCOMMITTED. "Я:"Он задает уровень изоляции в операторе set global transactionisolation level read uncommitted, где global также можно заменить на session, global означает глобальный, а session означает текущую сессию, то есть текущее окно допустимо.

"Я:"Когда уровень изоляции установлен, он недействителен для ранее открытого сеанса и вступит в силу только после повторного открытия окна для установки уровня изоляции. "Я:"Затем нужно открыть транзакцию.Есть два способа открыть транзакцию в Mysql.begin/start transactionи, наконец, отправьте транзакцию для выполнения фиксации или отката транзакции.

"Я:"в исполненииbegin/start transactionКоманды, они не являются отправной точкой транзакции, и первое sql-выражение после их выполнения указывает на реальное начало транзакции.

"Я:"Здесь сразу открываются два новых окна и одновременно открывается транзакция.В первом окне имя строки данных с id=1 обновляется до «неклассовый класс», и выполнение выполняется успешно. "Я:"Затем второе окно выполняет два запроса, а именно запрос до обновления окна и запрос после обновления. "Я:"Состояние незафиксированных транзакций, сгенерированных первой сессией, напрямую повлияет на вторую сессию, то есть грязные чтения.

"Я:"То же самое верно и для фиксации чтения.После запуска транзакции первая транзакция сначала выполняет данные запроса, а затем вторая сессия выполняет операцию обновления, но фиксации еще нет.Это первая сессия, которую нужно снова выбрать, данные не изменились, а затем снова выбирается первый сеанс.После того, как два сеанса выполняют фиксацию, первый сеанс снова выбирает измененные данные. "Я:"Таким образом, на результат запроса первой транзакции будет влиять вторая транзакция, что является проблемой неповторяющихся операций чтения.

"Интервьюер:"Ребят, а можете нарисовать схему процесса, который он выполняет? Я немного запутался в том, о чем вы говорите, и я еще не до конца понял это.

В моем сердце пролетают 10 000 лошадей, и я хочу плакать, но у меня нет слез. Этому интервьюеру действительно трудно служить. Слишком поздно говорить. Он вынул ручку из левого ягодичного кармана, вынул бумагу из правый задний карман и начал рисовать. "Я:"Это диаграмма оси времени чтения и фиксации, чтение оси времени незафиксированного, принцип тот же, данные изменились при втором выборе.

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

"Интервьюер:"Ну, вы продолжаете демонстрировать свое повторяемое чтение.

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

"Я:"Разница здесь в том, что в Mysql уровень изоляции неповторяемого чтения по умолчанию также решает проблему фантомного чтения.

"Я:"Из приведенной выше демонстрации видно, что в первой транзакции сначала выбирается строка данных с идентификатором = 3. Эта строка данных не существует. Возвращается пустой набор, а затем вставляется строка данных с идентификатором = 3. вторая транзакция.И коммит, выбранный снова в первой транзакции, данные также являются строкой данных без id=3.

"Я:"Окончательная сериализация, этапы стиля такие же, а результат такой же, как результат уровня изоляции повторяемого чтения по умолчанию в Mysql.Процесс выполнения сериализации эквивалентен изменению процесса выполнения транзакции на последовательное выполнение.Моя сторона Больше никаких демо.

"Я:"Эти четыре уровня сверху вниз, эффект изоляции постепенно усиливается, но производительность становится все хуже и хуже.

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

"Интервьюер:"Ой? Производительность ухудшается? Почему производительность ухудшается? Ты можешь сказать мне, почему?

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

"Я:"Это должно начаться с блокировки Mysq.Блокировка в Mysql может быть разделена на точки"Общие блокировки/блокировки чтения","Эксклюзивные блокировки/блокировки записи (эксклюзивные блокировки)","гэп замок","Блокировка записи","блокировка стола".

"Я:"Блокировка четырех уровней изоляции определенно потребляет производительность, а чтение незафиксированных не добавляет никаких блокировок, поэтому оно не имеет эффекта изоляции, поэтому его производительность также является лучшей.

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

"Я:"Для фиксации чтения и повторяемого чтения реализация обоих из них заключается в решении проблемы с данными, а затем должно быть определенное количество параллельных выдач, поэтому реализация механизма блокировки будет намного более оптимизирована, чем сериализация, и параллелизм будут улучшены, так что производительность также будет сравниваться хорошо.

"Я:"Базовая реализация двух из них реализована в методе MVCC (многоверсионный контроль параллелизма).

"Интервьюер:"Можете ли вы сначала рассказать о концепции этих замков? Я не очень хорошо понимаю, скажи мне, как ты понял.

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

"Я:"Блокировки строк и блокировки таблиц разделены в соответствии со степенью детализации блокировки. Блокировка строки блокирует текущую строку данных. Степень детализации блокировки мала, блокировка медленная, вероятность конфликта блокировок мала, а степень параллелизма высокий.Блокировка строки также MyISAM и InnoDB.Одно из отличий, InnoDB поддерживает блокировки строк и поддерживает транзакции.

"Я:"Табличные блокировки, с другой стороны, имеют большую степень детализации блокировки, быструю блокировку и низкие накладные расходы, но имеют высокую вероятность конфликта блокировок и низкий уровень параллелизма.

"Я:"Существует два типа гэп-замков:Gap LocksиNext-Key Locks. Gap Locks заблокирует интервал между двумя индексами. Например, выберите * из User, где id>3 и id

"Я:"Next-Key Locks — это блокировка с закрытым интервалом, образованная Gap Locks+Record Locks.Выберите * от пользователя, где id>=3 и id=

"Интервьюер:"Когда будет добавлена ​​блокировка в Mysql?

"Я:"При добавлении, удалении, изменении и запросе базы данных эксклюзивные блокировки добавляются только для добавлений, удалений и модификаций, но только для запросов и только путем явного добавления блокировки в режиме общего доступа после оператора select или для обновления для добавления общей блокировки. или эксклюзивный замок.

Основной принцип сделки

"Интервьюер:"Вы упомянули MVCC (управление многоверсионным параллелизмом) выше, можете рассказать о принципе?

"Я:"Согласованные представления используются в реализации MVCC для поддержки реализации фиксации чтения и повторяемых операций чтения.

"Я:"Чтобы достичь уровня изоляции повторяемого чтения, необходимо только создать непротиворечивое представление, также известное как моментальный снимок, в начале транзакции.Это представление согласованности используется в последующих запросах, а изменения данных в последующих транзакциях невидимы. к текущей транзакции. , так что достигается повторяемое чтение.

"Я:"Для фиксации чтения новое представление пересчитывается перед выполнением каждого оператора, что также является разницей между повторяемым фиксацией чтения и фиксацией чтения на уровне реализации MVCC.

"Интервьюер:"Итак, вы знаете, как снимки (представления) работают в нижней части MVCC?

"Я:"Каждая транзакция в InnoDB имеет свой собственный идентификатор транзакции, который уникален и увеличивается.

"Я:"Для каждой строки данных в Mysql может быть несколько версий.Когда каждая транзакция обновляет данные, будет сгенерирована новая версия данных, и строке trx_id текущей версии будет присвоен собственный идентификатор данных.

"Интервьюер:"Мальчик, ты можешь нарисовать картинку, чтобы я мог видеть? Я не понимаю.

Что я могу сделать? У меня не было другого выбора, кроме как достать из заднего кармана ручку и бумагу, и я быстро начал рисовать, два листа бумаги, ручка и вода для этого интервью были бы пустой тратой, поэтому мне пришлось отказаться от него. .

"Я:"Как показано на рисунке, если три транзакции обновляют одну и ту же строку данных, будет три соответствующих версии данных.

"Я:"На самом деле версии 1 и версии 2 физически не существуют, а U1 и U2 на рисунке — это фактически журналы отмен.Версии v1 и v2 рассчитываются на основе текущих журналов v3 и отмен.

"Интервьюер:"Итак, для моментального снимка есть ли у вас какие-либо правила, пока они не следуют?

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

"Интервьюер:"Если две транзакции выполняют операции записи, как можно гарантировать параллелизм?

"Я:"Если транзакция 1 и транзакция 2 выполняют операцию обновления, то когда транзакция 1 сначала обновляет строку данных, она сначала получает блокировку строки и блокирует данные.Когда транзакция 2 хочет выполнить операцию обновления, она также получает блокировку строки строка данных. , но уже занятая транзакцией 1, транзакция 2 может только ждать.

"Я:"Если транзакция 1 не снимает блокировку в течение длительного времени, транзакция 2 будет иметь исключение тайм-аута.

"Интервьюер:"Это состояние после обновления, где же индекс, да?

"Я:"эм, да.

"Интервьюер:"А если индекса нет? Нет возможности быстро найти строку данных?

"Я:"Если индекса нет, будут получены все строки и будут добавлены блокировки строк, а затем Mysql снова отфильтрует подходящие строки и снимет блокировку. Только подходящие строки будут продолжать удерживать блокировку.

"Я:"Это потребление производительности также будет относительно большим.

"Интервьюер:"Ага

В этот момент интервьюер больше часа смотрел на часы, а уже было время обеда. Думаю, он проголодался и не стал бы дальше задавать вопросы. Они вдвоем замерли на 30 секунд, и он, наконец, заговорил. вверх.

"Интервьюер:"Молодой человек, пора обедать, так что сегодняшнее интервью подходит к концу, можете вернуться и дождаться уведомления.

"Я:". . . . . . . . . .