MySQL 常用操作不是靠死记命令,而是围绕「连得上、查得到、改得对、跑得稳」这四件事展开。下面按真实使用频率和出错概率排序,只列真正高频、易错、有坑的点。
怎么安全连接 MySQL 并确认权限是否够用
很多问题其实卡在第一步:
mysql -u root -p能连上,但执行
SHOW DATABASES;报
Access denied。这不是密码错了,是用户没被授权访问系统库或当前库。 连之前先看目标实例地址和端口:
mysql -h 127.0.0.1 -P 3306 -u app_user -p(注意
-P是大写,小写
-p是密码) 连上后立刻执行
SELECT USER(), CURRENT_USER();——前者是你声明的用户,后者是 MySQL 实际匹配到的账号(可能因 host 匹配规则不同而降级) 权限不足时别急着加
GRANT ALL,先查
SHOW GRANTS FOR CURRENT_USER;看缺哪条,比如少了
SELECT或
EXECUTE
SELECT 怎么避免查慢、查空、查错库
SELECT *在开发阶段很爽,上线后常成性能黑洞;更隐蔽的问题是默认查的是
information_schema或当前没选库的 session,结果返回空或错数据。 执行前务必确认当前库:
SELECT DATABASE();,如果返回
NULL,说明没执行
USE mydb;查表前先看结构:
DESCRIBE users;或
SHOW COLUMNS FROM users;,比猜字段名快得多 加
LIMIT 10不只是防卡顿,更是防止误操作全表扫描;线上环境建议所有
SELECT都带
LIMIT(除非明确要全量) 模糊查询慎用
%keyword%,
LIKE 'keyword%'才能走索引;用
EXPLAIN SELECT ...看
type是否为
range或
ref
INSERT / UPDATE 怎么防止丢数据或锁表
新手常以为
INSERT INTO t VALUES (...)最安全,其实它不校验字段顺序,字段增减后极易插错列;而
UPDATE不带
WHERE条件是线上事故高发动作。 所有
INSERT必须显式写字段名:
INSERT INTO users (name, email) VALUES ('a', 'a@b.c');,否则表结构一变就错
UPDATE操作前先
SELECT验证条件:
SELECT id, name FROM users WHERE status = 0 LIMIT 5;,再执行
UPDATE users SET status = 1 WHERE status = 0;大批量更新别用单条
UPDATE,改用
INSERT ... ON DUPLICATE KEY UPDATE或分批次(每次 1000 行),避免长事务锁表 确认 autocommit 状态:
SELECT @@autocommit;,值为
0时所有 DML 都在事务里,忘了
COMMIT就会一直挂起
如何快速定位慢查询和连接堆积
服务变慢,第一反应不该是重启 MySQL,而是看它自己在忙什么。90% 的“数据库卡”其实是某条 SQL 占满 CPU 或某个连接长期未释放。
查当前活跃连接:SHOW PROCESSLIST;,重点关注
State列为
Sending data、
Locked或长时间
Sleep的线程 查最近慢查询:
SELECT * FROM performance_schema.events_statements_summary_by_digest WHERE AVG_TIMER_WAIT > 1000000000000 ORDER BY AVG_TIMER_WAIT DESC LIMIT 5;(单位是皮秒,1e12 ≈ 1 秒) 临时开启慢日志(不重启):
SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 1;,日志路径看
SELECT @@slow_query_log_file;别依赖
SHOW FULL PROCESSLIST抓不到的隐式锁,用
SELECT * FROM information_schema.INNODB_TRX;看真正持有锁的事务
真正难的不是记住这些命令,而是每次执行前多问一句:这条语句在哪个库、以哪个用户身份、影响多少行、有没有事务包裹、会不会被其他连接阻塞。MySQL 很老实,你糊弄它,它就用锁、超时、空结果来提醒你。
