Команды для ежедневной работы с MySQL 8.4. Сделай закладку. Подробные разборы - в статьях про безопасность MySQL и индексы и оптимизацию.

Подключение

mysql -u root -p                          # локально
mysql -h 10.0.0.5 -P 3306 -u app -p shop  # удалённо, конкретная БД
mysql --ssl-mode=REQUIRED -u app -p       # принудительный SSL
mysql -u app -p shop < dump.sql           # выполнить файл

Базы и таблицы

SHOW DATABASES;
CREATE DATABASE shop CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
USE shop;
SHOW TABLES;
DESCRIBE orders;            -- структура таблицы
SHOW CREATE TABLE orders\G  -- полный DDL
SHOW TABLE STATUS\G         -- размер, движок, строки

Пользователи и права

CREATE USER 'app'@'%' IDENTIFIED BY 'strong-pass';
GRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO 'app'@'%';  -- минимум прав
FLUSH PRIVILEGES;
SHOW GRANTS FOR 'app'@'%';
ALTER USER 'app'@'%' IDENTIFIED BY 'new-pass';
DROP USER 'app'@'%';
SELECT user, host FROM mysql.user;        -- кто есть

Никогда не давай приложению ALL PRIVILEGES или root. Подробно: безопасность MySQL.

Индексы

SHOW INDEX FROM orders;
CREATE INDEX idx_user_created ON orders(user_id, created_at);  -- составной
CREATE UNIQUE INDEX idx_email ON users(email);
ALTER TABLE orders DROP INDEX idx_user_created;

Правило ESR: сначала колонки из WHERE (равенство), потом ORDER BY, потом диапазоны. Порядок в составном индексе критичен.

EXPLAIN - почему запрос медленный

EXPLAIN SELECT * FROM orders WHERE user_id = 42;
EXPLAIN ANALYZE SELECT ...;   -- реальное время выполнения (8.0+)

На что смотреть:

type Значение
const / eq_ref Отлично - поиск по ключу
ref / range Хорошо - используется индекс
index Скан всего индекса
ALL Плохо - полный скан таблицы, нужен индекс

key: NULL + rows большое = индекс не используется. Подробно: индексы и оптимизация.

Медленные запросы

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;           -- логировать > 1 сек
SHOW PROCESSLIST;                          -- что выполняется сейчас
KILL <id>;                                 -- убить зависший запрос
mysqldumpslow -s t -t 10 /var/log/mysql/slow.log   # топ-10 медленных

Бэкап и восстановление

# Дамп
mysqldump -u root -p --single-transaction shop > shop.sql
mysqldump -u root -p --all-databases > all.sql
mysqldump -u root -p shop orders > orders.sql       # одна таблица

# Восстановление
mysql -u root -p shop < shop.sql

# С сжатием
mysqldump -u root -p shop | gzip > shop.sql.gz
gunzip < shop.sql.gz | mysql -u root -p shop

--single-transaction - консистентный бэкап InnoDB без блокировки таблиц.

Диагностика

SELECT VERSION();
SHOW STATUS LIKE 'Threads_connected';     -- активные подключения
SHOW VARIABLES LIKE 'max_connections';
SHOW ENGINE INNODB STATUS\G               -- дедлоки, буферы
SELECT * FROM information_schema.INNODB_TRX;  -- активные транзакции

Полезное

-- Размер таблиц в МБ
SELECT table_name,
       ROUND(data_length/1024/1024, 1) AS data_mb,
       ROUND(index_length/1024/1024, 1) AS index_mb
FROM information_schema.tables
WHERE table_schema = 'shop'
ORDER BY data_length DESC;

Защита от инъекций и продакшн-настройка - в статье про безопасность MySQL 8.4.