1. MySQL入门必备:为什么这些命令每天都要用?
刚接触MySQL那会儿,我总在phpMyAdmin里点点鼠标完成操作,直到有次服务器SSH连不上,只能通过命令行操作数据库时才慌了神。那次经历让我明白:图形化工具再方便,也替代不了对基础命令的掌握。以下是八年DBA工作中高频使用的命令清单,包含图形界面不会告诉你的实用技巧。
注意:所有命令示例均基于MySQL 8.0版本,与5.7版本的主要差异会特别标注
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础连接与信息查看
2.1 连接数据库的三种姿势
bash复制# 标准连接(回车后输入密码)
mysql -u root -p
# 指定主机和端口(适用于云数据库)
mysql -h 192.168.1.100 -P 3307 -u admin -p
# 连接时直接选择数据库
mysql -u root -p my_database
避坑指南:
- 密码包含特殊字符时用单引号包裹:
-p'Abc@123#' - 连接阿里云RDS常遇到的SSL错误解决方案:
bash复制mysql -h rds.aliyuncs.com -u test -p --ssl-mode=DISABLED
2.2 查看元信息的实用命令
sql复制-- 查看所有数据库(比SHOW DATABASES输出更规范)
SELECT schema_name FROM information_schema.schemata;
-- 查看表结构(比DESC更详细)
SHOW CREATE TABLE users\G -- \G表示垂直显示
-- 查看进程列表(排查慢查询必备)
SHOW PROCESSLIST;
性能技巧:information_schema库中的表都是内存表,大量查询会影响性能,生产环境慎用。
3. 数据操作核心命令
3.1 增删改查的进阶用法
sql复制-- 插入时处理重复键(比REPLACE更高效)
INSERT INTO users(id,name) VALUES(1,'张三')
ON DUPLICATE KEY UPDATE name='张三';
-- 批量更新(CASE WHEN妙用)
UPDATE products SET price = CASE
WHEN id IN (1,2,3) THEN 99
WHEN id = 4 THEN 199
ELSE price
END;
-- 安全删除(先SELECT验证再删除)
DELETE FROM logs WHERE create_time < '2020-01-01' LIMIT 1000;
重要:生产环境执行DELETE/UPDATE前务必先用相同WHERE条件执行SELECT确认影响范围
3.2 事务控制与锁机制
sql复制-- 显式事务示例(注意隔离级别)
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;
COMMIT;
-- 查看锁等待(死锁排查)
SELECT * FROM performance_schema.events_waits_current;
锁优化经验:
- 短事务尽量用
FOR UPDATE NOWAIT避免等待 - 大批量更新时使用
LIMIT分段提交
4. 数据库管理实战技巧
4.1 用户与权限精细控制
sql复制-- 创建带密码策略的用户(MySQL 8.0+)
CREATE USER 'dev_user'@'192.168.1.%'
IDENTIFIED WITH caching_sha2_password BY 'ComplexPwd123!'
PASSWORD EXPIRE INTERVAL 90 DAY;
-- 精确到列级别的权限控制
GRANT SELECT(name,email), UPDATE(email)
ON mydb.users TO 'api_user'@'%';
-- 查看权限清单(比SHOW GRANTS更直观)
SELECT * FROM mysql.user WHERE user='dev_user'\G
安全规范:
- 生产环境禁止使用
%作为host - MySQL 8.0默认使用
caching_sha2_password插件,旧客户端需要升级
4.2 备份恢复的硬核方案
bash复制# 逻辑备份(适合小数据量)
mysqldump -u root -p --single-transaction --routines mydb > backup.sql
# 物理备份(适合大数据量)
sudo systemctl stop mysql
tar -czvf /backup/mysql_data.tar.gz /var/lib/mysql/
sudo systemctl start mysql
# 只恢复单个表
mysql -u root -p mydb < users_table.sql
备份策略建议:
- 超过50GB的数据库建议使用Percona XtraBackup
- 测试环境恢复前先执行
DROP DATABASE IF EXISTS mydb
5. 性能优化关键命令
5.1 执行计划深度解析
sql复制-- 标准EXPLAIN
EXPLAIN SELECT * FROM orders WHERE user_id = 100;
-- 树状显示执行计划(MySQL 8.0+)
EXPLAIN FORMAT=TREE
SELECT * FROM products WHERE price > 100 ORDER BY sales DESC;
-- 实际执行统计(需开启performance_schema)
EXPLAIN ANALYZE SELECT * FROM logs WHERE create_time > NOW() - INTERVAL 1 DAY;
索引优化案例:
sql复制-- 创建函数索引(MySQL 8.0+)
ALTER TABLE users ADD INDEX idx_name_upper ((UPPER(name)));
-- 隐藏索引测试(不影响生产查询)
ALTER TABLE orders ALTER INDEX idx_user_id INVISIBLE;
5.2 监控与参数调优
sql复制-- 查看慢查询(需先开启慢日志)
SELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 10;
-- 关键性能计数器
SHOW GLOBAL STATUS LIKE 'Innodb_row_lock%';
-- 动态调整参数(无需重启)
SET GLOBAL innodb_buffer_pool_size = 2147483648; -- 2GB
调优黄金法则:
innodb_buffer_pool_size应占物理内存的70-80%- 连接数公式:
max_connections = (可用内存 - 系统开销) / 每个连接内存
6. 开发中的高频实用技巧
6.1 JSON操作(MySQL 5.7+)
sql复制-- 提取JSON字段
SELECT id, JSON_EXTRACT(profile, '$.address.city') AS city FROM users;
-- 修改JSON部分内容
UPDATE products SET specs = JSON_SET(specs, '$.weight', '2kg')
WHERE id = 100;
-- 生成JSON数组
SELECT JSON_ARRAYAGG(name) FROM departments;
6.2 窗口函数实战(MySQL 8.0+)
sql复制-- 计算移动平均
SELECT date, sales,
AVG(sales) OVER (ORDER BY date ROWS 6 PRECEDING) AS 7day_avg
FROM daily_stats;
-- 分组排名
SELECT product_id, category, sales,
RANK() OVER (PARTITION BY category ORDER BY sales DESC) AS rank_in_category
FROM products;
7. 那些官方文档没明说的技巧
\s命令比STATUS更短且显示相同信息- 在mysql客户端中使用
pager less -S可以水平滚动查看宽表结果 - 用
SELECT 1测试连接比SHOW DATABASES更轻量 - 快速计算表记录数(不精确但速度快):
sql复制SELECT TABLE_ROWS FROM information_schema.TABLES WHERE TABLE_NAME = 'big_table'; - 模糊查询优化方案:
sql复制-- 前缀匹配可以用到索引 SELECT * FROM products WHERE name LIKE 'Apple%'; -- 后缀匹配的替代方案 SELECT * FROM products WHERE REVERSE(name) LIKE REVERSE('%Phone');
八年DBA生涯让我深刻体会到:掌握命令只是开始,理解其背后的执行机制才是关键。建议每次执行重要操作前,先到测试环境用EXPLAIN验证执行计划,用SELECT模拟UPDATE/DELETE的影响范围。真正的高手,往往是把最简单的命令用到极致。
