mysql必背50条语句
很多人学MySQL,必背条死记硬背一堆语法,语句结果一上生产就懵。必背条我见过一个哥们,语句能把`SELECT * FROM table WHERE id=1`背得滚瓜烂熟,必背条但线上慢查询一出来,语句连`EXPLAIN`都不会看。必背条所以下面这50条,语句我不按字母表排,必背条也不按官方文档顺序,语句就按实际干活时脑子里该有的必背条优先级来。你背完,语句至少能跟DBA正常对话。必背条
先搞清楚数据怎么进去、语句怎么出来
建库建表是必背条第一步,但别上来就`CREATE DATABASE`。先想清楚字符集。utf8mb4是底线,utf8是个坑,存emoji直接报错。建表时`ENGINE=InnoDB`和`DEFAULT CHARSET=utf8mb4`写顺手,省得后面改。
CREATE DATABASE mydb DEFAULT CHARSET utf8mb4; CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, email VARCHAR(100) UNIQUE, created_at DATETIME DEFAULT CURRENT_TIMESTAMP) ENGINE=InnoDB; 插入数据别一条条来,`INSERT INTO users (name,email) VALUES ('a','a@x.com'),('b','b@x.com');` 批量插,性能差十倍。更新记得带WHERE,`UPDATE users SET name='c' WHERE id=1;` 不带WHERE的UPDATE,删库跑路的前奏。删除也一样,`DELETE FROM users WHERE id=1;` 想清空表用`TRUNCATE TABLE users;` 它比DELETE快,但不可回滚。
查询是重头戏,这20条天天用
`SELECT name,email FROM users WHERE id > 10 AND name LIKE '张%';` 这里注意,`LIKE '%张'` 走不了索引。排序`ORDER BY created_at DESC`,去重`SELECT DISTINCT name FROM users;`。分组统计`SELECT name, COUNT(*) FROM users GROUP BY name HAVING COUNT(*) > 1;` HAVING和WHERE的区别,面试必问——WHERE过滤行,HAVING过滤组。
限制条数`LIMIT 10 OFFSET 20;` 深分页慢,改成`WHERE id > 100 LIMIT 10`。连接查询:`SELECT u.name, o.amount FROM users u INNER JOIN orders o ON u.id = o.user_id;` 左连接就是`LEFT JOIN`,右连接反过来。自连接偶尔用,比如找同城用户:`SELECT a.name, b.name FROM users a JOIN users b ON a.city = b.city AND a.id < b.id;`
子查询别写太深,`SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 100);` 能改成JOIN就改。`EXISTS`和`IN`的选择,小表用IN,大表用EXISTS。UNION去重,UNION ALL不去重,能用ALL就别用UNION。
改表结构、索引、事务,这些不熟会出事
加字段`ALTER TABLE users ADD COLUMN age INT DEFAULT 0;` 改类型`ALTER TABLE users MODIFY COLUMN name VARCHAR(100);` 加索引`CREATE INDEX idx_name ON users(name);` 唯一索引`CREATE UNIQUE INDEX idx_email ON users(email);` 删索引`DROP INDEX idx_name ON users;`
看执行计划`EXPLAIN SELECT * FROM users WHERE name='张';` 重点看type列,ALL是全表扫,ref是索引查找。事务开始`START TRANSACTION;` 提交`COMMIT;` 回滚`ROLLBACK;` 保存点`SAVEPOINT sp1;` 回滚到保存点`ROLLBACK TO sp1;`
锁方面,`SELECT ... FOR UPDATE;` 排他锁,`SELECT ... LOCK IN SHARE MODE;` 共享锁。查看当前进程`SHOW PROCESSLIST;` 杀进程`KILL 1234;` 看表状态`SHOW TABLE STATUS LIKE 'users';`
最后10条,救火和调优用
`SHOW VARIABLES LIKE 'max_connections';` 连接数不够就调。`SHOW STATUS LIKE 'Threads_connected';` 看当前连接。慢查询日志`SET GLOBAL slow_query_log = 'ON';` 配合`long_query_time = 2;`。`SHOW INDEX FROM users;` 看索引基数。`ANALYZE TABLE users;` 更新统计信息。`OPTIMIZE TABLE users;` 整理碎片。`SHOW CREATE TABLE users;` 看建表语句。`SELECT VERSION();` 看版本。`SHOW ENGINES;` 看存储引擎。`SET NAMES utf8mb4;` 临时改字符集。
这50条不是让你背完就成专家。我见过背得最熟的人,连`EXPLAIN`里的key_len都解释不清。真正的功夫在背完之后——打开终端,连上库,一条条敲,看报错,看结果。你敲到第30条的时候,手会比脑子快。