Продвинутые концепции MySQL
1. Движки хранения: InnoDB vs MyISAM
- InnoDB:
- Поддерживает транзакции (ACID-совместимый).
- Блокировка на уровне строк (лучше для конкурентной записи).
- Поддерживает внешние ключи (Foreign Keys).
- Данные хранятся в кластерном индексе (B+Tree).
- Лучшее восстановление после сбоев.
- MyISAM:
- Не поддерживает транзакции.
- Блокировка на уровне таблицы (медленная при конкурентной записи).
- Не поддерживает внешние ключи.
- Может быть быстрее для нагрузок с преобладанием чтения и минимальной записью.
- Поддерживает полнотекстовый поиск (InnoDB также поддерживает его начиная с версии 5.6).
2. Типы индексов
- B-Tree Index: наиболее распространённый тип (в InnoDB используются B+Trees).
- Структура: они «горизонтально широкие» (высокий коэффициент ветвления, fan-out) и неглубокие. Каждый узел может содержать сотни указателей на дочерние элементы, что минимизирует дисковый ввод-вывод за счёт малой глубины дерева.
- Производительность: быстрая фильтрация (O(log n)), поскольку пространство поиска уменьшается вдвое (или более) на каждом уровне.
- Применение: хорош для точных совпадений (
=), диапазонных запросов (>,<,BETWEEN) и сортировки (ORDER BY).
- Hash Index: очень быстрый для точных совпадений, но не может использоваться для диапазонных запросов или сортировки.
- Full-text Index: используется для поиска текста в больших столбцах.
- Spatial Index: используется для географических данных (R-деревья).
3. Свойства ACID
- Atomicity (атомарность): «Всё или ничего». Гарантирует, что все операции в рамках транзакции завершены; если какая-либо операция не удалась, вся транзакция откатывается к предыдущему состоянию.
- Consistency (согласованность): данные должны соответствовать всем правилам базы данных (ограничения, триггеры и т.д.). Гарантирует, что транзакция переводит базу данных из одного корректного состояния в другое.
- Isolation (изоляция): каждая транзакция независима. Предотвращает взаимное влияние конкурентных транзакций, гарантируя, что промежуточное состояние одной транзакции невидимо для других.
- Durability (долговечность): зафиксированные данные сохраняются навсегда. После фиксации транзакции её изменения сохраняются даже при сбое системы.
4. Команды управления транзакциями
START TRANSACTIONилиBEGIN: обозначает начало блока транзакции.COMMIT: сохраняет все изменения, сделанные в текущей транзакции, делая их постоянными и видимыми другим пользователям.ROLLBACK: отменяет все изменения, сделанные в текущей транзакции, возвращая базу данных к состоянию до начала транзакции.SAVEPOINT name: создаёт точку внутри транзакции, к которой можно вернуться позже, не затрагивая всю транзакцию.ROLLBACK TO name: откатывает транзакцию к указанной точке сохранения.RELEASE SAVEPOINT name: удаляет точку сохранения из текущей транзакции.
Режим Autocommit
По умолчанию MySQL работает с включённым режимом autocommit. Это означает, что как только вы выполняете запрос, изменяющий таблицу, MySQL сохраняет изменение на диск, делая его постоянным. Чтобы сгруппировать несколько запросов в одну транзакцию, необходимо:
- Использовать
START TRANSACTION; - Отключить autocommit:
SET autocommit = 0;