Введение
MySQL — одна из самых популярных реляционных систем управления базами данных (СУБД) с открытым исходным кодом. Она используется в веб-разработке, бизнес-приложениях и аналитике. Благодаря простоте, высокой производительности и богатому набору возможностей MySQL стала стандартом для множества проектов.
История
Первая версия MySQL появилась в 1995 году. Создатели — Микаэль Видениус и Дэвид Аксмарк из компании MySQL AB. В 2008 году MySQL AB была куплена Sun Microsystems, а в 2010 году — Oracle Corporation. Сегодня MySQL продолжает развиваться, предлагая бесплатную Community Edition и коммерческую Enterprise Edition.
Архитектура
- Клиент-серверная модель — клиенты посылают SQL-запросы, сервер их обрабатывает.
- Движки хранения — плагины для таблиц: InnoDB, MyISAM, Memory, CSV и др.
- Кэш запросов — ускоряет повторные выборки.
- Репликация — позволяет масштабировать и повышать отказоустойчивость.
Установка
Linux (Ubuntu/Debian)
sudo apt update
sudo apt install mysql-server
sudo systemctl enable --now mysqlmacOS
brew install mysql
brew services start mysqlПодключение
mysql -u root -pСоздание базы и таблиц
CREATE DATABASE company;
USE company;
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
position VARCHAR(100),
salary DECIMAL(10,2),
hire_date DATE,
email VARCHAR(255) UNIQUE,
INDEX idx_position (position),
INDEX idx_salary (salary)
) ENGINE=InnoDB;CRUD операции
INSERT INTO employees (name, position, salary, hire_date, email)
VALUES ('Иван Иванов', 'Менеджер', 60000.00, '2022-05-01', 'ivan@example.com');SELECT id, name, position, salary
FROM employees
WHERE salary >= 50000
ORDER BY salary DESC;UPDATE employees
SET salary = salary * 1.1
WHERE position = 'Менеджер';DELETE FROM employees WHERE id = 3;Транзакции
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;Индексы
CREATE INDEX idx_salary ON employees(salary);
CREATE UNIQUE INDEX idx_email ON employees(email);Хранимые процедуры и функции
DELIMITER //
CREATE PROCEDURE GetEmployees()
BEGIN
SELECT * FROM employees;
END //
DELIMITER ;
DELIMITER //
CREATE FUNCTION Bonus(salary DECIMAL(10,2))
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
RETURN salary * 0.1;
END //
DELIMITER ;Триггеры
CREATE TRIGGER before_insert_employee
BEFORE INSERT ON employees
FOR EACH ROW
SET NEW.hire_date = CURDATE();Работа с JSON
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
data JSON
);
INSERT INTO products (data)
VALUES ('{"name": "Ноутбук", "price": 75000, "features": {"ram": "16GB", "ssd": "512GB"}}');
SELECT data->'$.name' AS product_name,
data->'$.features.ram' AS ram
FROM products;Полнотекстовый поиск
CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT(title, body)
);
SELECT * FROM articles
WHERE MATCH(title, body)
AGAINST ('базы данных' IN NATURAL LANGUAGE MODE);Репликация
SHOW MASTER STATUS;
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='master.host',
SOURCE_USER='repl_user',
SOURCE_PASSWORD='repl_pass',
SOURCE_LOG_FILE='mysql-bin.000123',
SOURCE_LOG_POS=456789;
START REPLICA;
SHOW REPLICA STATUS\GБэкапы
mysqldump -u root -p company > company_backup.sql
mysql -u root -p company < company_backup.sqlБезопасность
CREATE USER 'developer'@'localhost' IDENTIFIED BY 'StrongPassword!';
GRANT SELECT, INSERT, UPDATE, DELETE ON company.* TO 'developer'@'localhost';
FLUSH PRIVILEGES;Заключение
MySQL — универсальная СУБД, которая подходит как для небольших сайтов, так и для масштабных систем. Используйте движок InnoDB для транзакций, настройте репликацию для отказоустойчивости, делайте регулярные бэкапы.