предисловие
Неудивительно, что мы, как бэкенд-обезьяны, каждый день имеем дело с mysql. Помимо утверждения CURD, которое не скучно писать каждый день, какие базовые знания мы должны знать о mysql?
Сразу к делу
Просто нарисовать схему логической архитектуры mysql?
接 入 层
-----------------------
⬆ ⬆
⬇ ⬇
缓 存 解 析 器
⬆
⬇
优 化 器
-----------------------
引 擎
Каковы общие механизмы mysql и в чем различия?
- InnoDB
- Поддержка транзакций
- блокировка строки
- кластеризованный индекс
- Вторичный индекс (вторичный индекс) индекс хранит первичный ключ
- MyISAM
- Транзакции не поддерживаются
- блокировка стола
- Сбой не может быть безопасно восстановлен
- некластеризованный индекс
- Вспомогательный индекс (вторичный индекс) индекс хранит адрес фактических данных
- Memory
- на основе памяти
- блокировка стола
- Длина поля фиксированная, блоб, текст не поддерживается, даже если указано фактическое хранилище vachar, оно будет преобразовано в char
- Archive
- Поддерживает только операции вставки/выбора
- Хорошо для журналов и т. Д.
- ...
Какова концепция транзакций ACDI?
- A: атомарность, атомарность, все операции транзакции рассматриваются как единое целое, либо все они выполняются успешно, либо все они терпят неудачу.
- C: Непротиворечивость, непротиворечивость, Все изменения состояния данных в транзакции, все изменения только после успешной фиксации транзакции.
- D: Надежность, постоянство. После успешного завершения транзакции результирующие изменения данных будут постоянно сохранены в базе данных.
- I: Изоляция, изоляция, транзакция не видна другим транзакциям, пока она не будет зафиксирована.
Что такое грязное чтение, фантомное чтение и неповторяемое чтение?
- Грязное чтение: чтение данных незафиксированных транзакций, данные могут быть отброшены, что не соответствует определению изоляции.
- Фантомное чтение: когда транзакция читает пакет данных в пакетах, другая транзакция отправляет новые данные.Когда предыдущая транзакция снова читает, будет сгенерирована фантомная строка.
- Неповторяющееся чтение: выполнение одного и того же запроса дважды может привести к разным результатам.
Каковы уровни изоляции транзакций MySQL? Каков уровень изоляции по умолчанию?
- Незафиксированное чтение: одна транзакция еще не зафиксирована, другая транзакция может читать, следствием этого является грязное чтение.
- Фиксированное чтение (также известное как неповторяемое чтение): незафиксированная транзакция невидима для других транзакций, но будет генерировать фантомные и неповторяемые чтения.
- Повторяющееся чтение (уровень изоляции mysql по умолчанию): убедитесь, что результаты нескольких чтений в рамках одной и той же транзакции согласованы, но будут происходить фантомные чтения.
- Сериализуемый: строгая последовательная блокировка, плохой параллелизм.
уровень изоляции | грязное чтение | неповторяемое чтение | галлюцинации |
---|---|---|---|
Read Uncommitted | √ | √ | √ |
Read Committed | × | √ | √ |
Repeatable Read | × | × | √ |
Serializable | × | × | × |
Что такое МВЦК? Кратко опишите роль и принцип работы MVCC?
MVCC: Multi Version Concurrency Control, Multi-version Concurrency Control, техническое средство для mysql для предотвращения фантомного чтения. Для каждой строки данных существует строка пробела, а в строке пробела хранятся данные строки данных.время создания,удалить время, время здесь на самом делеНомер версии транзакции. когда,
- При выборе данных: запрашивать только строки, время создания которых меньше или равно текущему номеру версии транзакции -> текущая транзакция или строки, вставленные до текущей транзакции, а также строки, время удаления которых больше текущего номера версии - > строки, которые не были удалены до текущей версии транзакции.
- При обновлении данных: скопировать строку а' на основе исходной строки а, время удаления строки а устанавливается равным текущему номеру версии транзакции, а время создания строки а' устанавливается равным текущему номеру версии транзакции.
- При вставке данных: время создания записи — номер текущей версии транзакции.
- При удалении данных: Время удаления записи — номер текущей версии транзакции.
Как появился дедлок, и напишите простой пример?
Причина взаимоблокировки заключается в том, что две транзакции ждут, пока друг друга освободит друг друга, что приводит к циклическим зависимостям.обнаружение взаимоблокировки(круговая зависимость обнаружила ошибку возврата) итайм-аут взаимоблокировки(откатите транзакцию, которая содержит наименьшее количество блокировок строк с течением времени), чтобы максимально избежать взаимоблокировок. Например:
行锁:
UPDATE `table_demo` SET `a` = 'test' WHERE `b` = 'lalala';
UPDATE `table_demo` SET `b` = 'test' WHERE `a` = 'lalala';
UPDATE `table_demo` SET `b` = 'test' WHERE `a` = 'lalala';
UPDATE `table_demo` SET `a` = 'test' WHERE `b` = 'lalala';
Что такое кластеризованные и некластеризованные индексы?
- Кластеризованный индекс: InnoDB, сохраняется конечный узел дерева B+.Фактические данные.
- Некластеризованный индекс: MyISAM, сохраняется конечный узел дерева B+.адрес фактических данных.
Что такое индекс покрытия?
Покрывающий индекс: запрашиваемая строка покрывается индексом, который можно прочитать непосредственно из индекса, не возвращаясь к таблице для запроса. Например:
CREATE TABLE `demo_table`(
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
`username` char(32) NOT NULL DEFAULT '' COMMENT '用户名',
`password` char(32) NOT NULL DEFAULT '' COMMENT '密码',
PRIMARY KEY (`id`),
KEY `idx_username` (`username`)
)ENGINE=InnoDB DEFAULT CHARSET=UTF8;
explain select `username` from `demo_table` where `username` = 'demo';
+----+-------------+------------+------+---------------+--------------+---------+-------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+------+---------------+--------------+---------+-------+------+--------------------------+
| 1 | SIMPLE | demo_table | ref | idx_username | idx_username | 96 | const | 1 | Using where; Using index |
+----+-------------+------------+------+---------------+--------------+---------+-------+------+--------------------------+
Использование индекса в Extra означает использование покрывающего индекса.
Каков принцип сопоставления крайнего левого префикса для индексации?
Личное текущее понимание: например, использование совместного индекса, сопоставление слева направо, несоответствие полю индекса или поиск по первому диапазону (между, например, больше, меньше, чем), и эта часть индекса действительна.
Почему InnoDB использует не красно-черное дерево, а дерево B+ в качестве индекса для хранения структуры данных и кратко рисует дерево B+? (В настоящее время мое личное понимание относительно неглубокое, пожалуйста, активно исправьте его~)
Красно-черное дерево по сути является бинарным деревом, и каждый узел имеет не более двух дочерних узлов, поэтому глубина красно-черного дерева больше.
Каждый узел B-дерева может иметь до n дочерних узлов, корневой узел находится в памяти, и каждый узел применяется только для размера страницы 1. Если каждый узел имеет 100 дочерних узлов, то нам в основном нужна только глубина миллионов Если 3, то можно сохранить => 100^3, что уменьшает количество операций ввода-вывода (размер узла обычно равен размеру страницы на диске).
Существует также «принцип локальности» (после того, как данные запрошены, данные рядом с ними также могут быть запрошены), и, во-вторых, листовые узлы дерева B+ образуют связанный список, так что мы можем легко запросить диапазон данных. Во-вторых, корневой узел и внутренний узел дерева B+ хранят только указатель положения следующего дочернего узла индекса, а данные хранятся только в листовом узле, так что нелистовой узел может иметь больше места для хранения позиции индекса и диапазона индекса. Он может быть как можно больше, так что глубина дерева может быть как можно меньше.
Эпилог
Последующие исправления и дополнения будут продолжаться.Если что-то не так, вы можете активно меня поправлять, спасибо.