mysql高频操作围绕“连得上、查得到、改得对、跑得稳”展开:连接需确认地址端口及user()/current_user()差异;查询须use库、desc表、加limit;增改须显式字段、先查后改、分批处理;慢查定位靠show processlist和performance_schema。

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 很老实,你糊弄它,它就用锁、超时、空结果来提醒你。










