MySQL — практическая работа и API
Другие СУБД в этом цикле: SQLite · PostgreSQL · Microsoft SQL Server · SQL — о разделе.
MySQL — серверная реляционная СУБД. Чаще всего используется с движком InnoDB, который даёт транзакции, внешние ключи, блокировки на уровне строк и надёжность для веб-приложений.
Как работает MySQL
- Запускается сервер
mysqld. - Клиенты подключаются по TCP или Unix socket.
- Данные и индексы хранятся в таблицах выбранного storage engine.
- InnoDB использует redo/undo logs и MVCC.
- Репликация работает в binlog-архитектуре.
SELECT VERSION();
SHOW VARIABLES LIKE 'default_storage_engine';
SHOW VARIABLES LIKE 'transaction_isolation';
Подключение и запуск
mysql CLI
mysql -h localhost -P 3306 -u app_user -p app_db
URI-подключение
mysql://app_user:secret@localhost:3306/app_db
mysql://app_user:secret@localhost:3306/app_db?charset=utf8mb4
Базовая настройка
CREATE DATABASE app_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'app_user'@'%' IDENTIFIED BY 'secret';
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'%';
FLUSH PRIVILEGES;
Типы данных и синтаксис
Основные типы MySQL:
- Числовые —
TINYINT,INT,BIGINT,DECIMAL,FLOAT,DOUBLE - Строковые —
CHAR,VARCHAR,TEXT - Дата/время —
DATE,TIME,DATETIME,TIMESTAMP - Бинарные:
BLOB,VARBINARY - JSON:
JSON - Логические значения обычно задают через
TINYINT(1)илиBOOLEAN(синоним)
CREATE TABLE users (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(255) NOT NULL UNIQUE,
profile JSON,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
Возможности MySQL
- Полный базовый SQL для DDL/DML
- Транзакции (InnoDB)
INSERT ... ON DUPLICATE KEY UPDATEдля upsert-сценариев- Индексы, составные индексы, уникальные ограничения
VIEW,TRIGGER,PROCEDURE,FUNCTION, события (EVENT)- Репликация и кластерные варианты (Group Replication, InnoDB Cluster)
- JSON-тип и JSON-функции
- Партиционирование
Доступные и недоступные команды
| Категория | Команда / конструкция | Статус в MySQL | Комментарий |
|---|---|---|---|
| DML | SELECT, INSERT, UPDATE, DELETE | Доступно | Полная поддержка |
| DDL | CREATE/ALTER/DROP | Доступно | Поддерживается |
| Транзакции | BEGIN, COMMIT, ROLLBACK, SAVEPOINT | Доступно (InnoDB) | Зависит от storage engine |
| Права | CREATE USER, GRANT, REVOKE | Доступно | Развитая модель привилегий |
| Server-side логика | PROCEDURE, FUNCTION, TRIGGER, EVENT | Доступно | Поддерживается |
| Материализованные представления | CREATE MATERIALIZED VIEW | Недоступно | Имитация через таблицы + расписание |
Полноценный RETURNING в DML | Частично/ограничено | Проверяйте версию и совместимость | |
MERGE | Недоступно | Обычно заменяют upsert-паттернами | |
| Нативный тип массивов как в PostgreSQL | Недоступно | Используют JSON или отдельные таблицы | |
PostgreSQL-специфика (DISTINCT ON, ILIKE) | Недоступно | Используют альтернативы MySQL |
Практика SQL в MySQL
CRUD
CREATE TABLE tasks (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
done TINYINT(1) NOT NULL DEFAULT 0
) ENGINE=InnoDB;
INSERT INTO tasks(title) VALUES ('Пройти MySQL');
SELECT id, title, done FROM tasks ORDER BY id;
UPDATE tasks SET done = 1 WHERE id = 1;
DELETE FROM tasks WHERE id = 1;
Upsert
INSERT INTO tasks(id, title, done)
VALUES (1, 'Обновлённая задача', 0)
ON DUPLICATE KEY UPDATE
title = VALUES(title),
done = VALUES(done);
Транзакция
START TRANSACTION;
INSERT INTO tasks(title) VALUES ('A');
INSERT INTO tasks(title) VALUES ('B');
COMMIT;
Клиенты и инструменты
- mysql CLI
- MySQL Workbench
- phpMyAdmin
- DBeaver
- DataGrip
- TablePlus
- Beekeeper Studio
- VS Code + MySQL extensions
API по языкам — подключение, CRUD, библиотеки, классы и функции
В каждом блоке указаны библиотека, ключевые классы/типы, основные свойства и методы, затем минимальный рабочий пример подключения и CRUD.
C# — MySqlConnector
Библиотека
MySqlConnector(NuGet)
Ключевые классы
MySqlConnectionMySqlCommandMySqlTransactionMySqlDataReaderMySqlParameter
Свойства и методы
Open(),BeginTransaction(),Close()CommandText,Parameters.AddWithValue()ExecuteNonQuery(),ExecuteReader(),ExecuteScalar()Read(),GetString(),GetInt64()
Код ITЗагрузка примера кода…
Python — mysql-connector-python или PyMySQL
Библиотеки
mysql-connector-pythonPyMySQL
Ключевые классы
MySQLConnectionCursor
Методы
connect()cursor(),execute(),executemany()fetchone(),fetchall()commit(),rollback(),close()
Код ITЗагрузка примера кода…
Java — MySQL Connector/J
Библиотека
com.mysql:mysql-connector-j
Ключевые классы
ConnectionPreparedStatementResultSetDriverManager
Методы
DriverManager.getConnection("jdbc:mysql://...")prepareStatement(),setAutoCommit(false),commit(),rollback()setString(),executeUpdate(),executeQuery()next(),getLong(),getString()
Код ITЗагрузка примера кода…
C — MySQL C API (libmysqlclient)
Библиотека
libmysqlclient
Ключевые типы
MYSQLMYSQL_RESMYSQL_ROWMYSQL_STMT
Ключевые функции
mysql_init(),mysql_real_connect(),mysql_close()mysql_query(),mysql_store_result(),mysql_fetch_row()- Prepared statements —
mysql_stmt_init(),mysql_stmt_prepare(),mysql_stmt_bind_param(),mysql_stmt_execute() - Ошибки:
mysql_error(),mysql_errno()
Код ITЗагрузка примера кода…
C++ — MySQL Connector/C++ или SOCI
Библиотеки
- MySQL Connector/C++
- SOCI (через backend MySQL)
Ключевые классы (Connector/C++)
sql::Driversql::Connectionsql::PreparedStatementsql::ResultSet
Методы
driver->connect(...)prepareStatement(),execute(),executeQuery()setString(),next(),getString(),getInt64()
#include <iostream>
// Примерный стиль API Connector/C++
// auto* driver = get_driver_instance();
// std::unique_ptr<sql::Connection> conn(driver->connect("tcp://127.0.0.1:3306", "app_user", "secret"));
// conn->setSchema("app_db");
// ...
Go — go-sql-driver/mysql
Библиотеки
database/sqlgithub.com/go-sql-driver/mysql
Ключевые типы
*sql.DB*sql.Tx*sql.Rowssql.Result
Методы
sql.Open("mysql", dsn)Exec(),Query(),QueryRow()Begin(),Commit(),Rollback()Rows.Next(),Rows.Scan()
Код ITЗагрузка примера кода…
PHP — mysqli и PDO_MySQL
Библиотеки
mysqli- PDO (
mysql)
Ключевые классы
mysqli,mysqli_stmt,mysqli_resultPDO,PDOStatement
Методы
new mysqli(...),prepare(),bind_param(),execute(),get_result()new PDO("mysql:host=...;dbname=..."),prepare(),execute(),fetchAll()
<?php
$db = new PDO("mysql:host=localhost;port=3306;dbname=app_db;charset=utf8mb4", "app_user", "secret");
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->exec("CREATE TABLE IF NOT EXISTS users(id BIGINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL) ENGINE=InnoDB");
$stmt = $db->prepare("INSERT INTO users(name) VALUES (:name)");
$stmt->execute([':name' => 'Anna']);
$rows = $db->query("SELECT id, name FROM users")->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $row) {
echo $row['id'] . " " . $row['name'] . PHP_EOL;
}
Kotlin — JDBC (MySQL)
Библиотека
- JDBC + MySQL Connector/J
Ключевые классы
ConnectionPreparedStatementResultSet
Методы
DriverManager.getConnection()prepareStatement(),executeUpdate(),executeQuery()setString(),next(),getLong(),getString()
Код ITЗагрузка примера кода…
Rust — mysql и sqlx
Библиотеки
mysql(синхронный клиент)sqlx(async)
Ключевые типы (mysql crate)
PoolPooledConnTxOptsQueryable
Методы
Pool::new()get_conn()query_drop(),exec_drop(),query()start_transaction(),commit(),rollback()
Код ITЗагрузка примера кода…
JavaScript — mysql2
Библиотека
mysql2(promise API)
Ключевые объекты
ConnectionPool- результаты
RowDataPacket[]
Методы
createConnection(),createPool()execute(sql, params),query()- транзакции —
beginTransaction(),commit(),rollback()
Код ITЗагрузка примера кода…
Минимальный шаблон безопасной работы
- Используйте параметризованные запросы.
- Выбирайте InnoDB для транзакционных таблиц.
- Фиксируйте
charsetкакutf8mb4. - Ограничивайте права пользователей по ролям/схемам.
- Настраивайте таймауты и пул подключений.
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET SESSION innodb_lock_wait_timeout = 10;
SHOW VARIABLES LIKE 'sql_mode';
Когда MySQL подходит и когда выбрать другой путь
MySQL подходит:
- веб-приложения и сервисы с привычным стеком LAMP/LEMP;
- высоконагруженные OLTP-сценарии на InnoDB;
- проекты, где важна простота эксплуатации и большой рынок tooling.
Другой путь выбирают:
- для сложной аналитики и специфических типов удобен PostgreSQL;
- для локального файла внутри приложения удобнее SQLite;
- для специализированного OLAP часто берут колоночные СУБД.