MySQL性能瓶颈诊断中常用的系统命令和工具有哪些?

说白了,MySQL性能诊断就是用系统命令扒开墙看里头,CPU、内存、磁盘、网络得一样样盯紧。

先说最重要的几个工具。
top/htop是入门必备,几秒钟就能扫出CPU飙高还是内存爆表。
比如去年我们跑的那个电商大促项目,htop一眼就看到mysqld占用了7 0%CPU,后来查是某个分页查询没优化,用行话说叫雪崩效应,其实就是前面一个小延迟把后面全拖垮了。
另外一点得盯内存,如果vmstat显示si/so老往1 0%以上窜,说明系统在拼命往swap区搬数据,这时候innodb_buffer_pool_size肯定得调小点。
还有个细节挺关键的,比如iostat的await,去年我们一个项目await稳定在5 0ms以上,最后发现是表没建索引,所有查询都在扫全表,把磁盘读死透了的。

我一开始也以为netstat看连接数就行,后来发现不对,TIME_WAIT堆成山才是真问题。
比如某个项目调整了max_connections到3 000,但netstat发现TIME_WAIT有2 000个,把系统TCP缓存占满了,说实话挺坑的,得配合sysctl net.ipv4 .tcp_tw_reuse参数优化。

还有个容易被忽略的mpstat,去年我们一个8 核服务器就卡在单核上,mpstat-PALL1 一跑,嘿,发现CPU使用率在某个核上恒定9 0%以上,查日志是某个定时任务在单线程跑,这个点很多人没注意。

等等,还有个事,这些工具得跟MySQL自带的监控配合着用。
比如用iostat看到await高,就去看slow log里是不是某个查询在搞事情。
用top发现CPU爆表,再执行SHOW PROCESSLIST就能揪出那个慢查询。

最后提醒个坑:别只盯着工具数字,得结合业务场景。
比如某次CPU飙升,发现是客户端程序疯狂连库,虽然工具看不出来,但业务方反馈很明确。

mysql学习(二):常用命令启动停止、登陆退出等

哈,你总结得挺全乎啊,这确实都是MySQL最基本也最常用的操作。
不过跟你唠唠,我上次帮朋友弄的时候,发现光知道命令还不够,还得知道点门道。

就说启动停止服务吧,Windows用net start mysql和net stop mysql是没错。
但你要是装的时候没选"服务"模式,或者装在新版的Windows系统上,可能就得用mysql8 0服务的名称 start/stop这种,得看你具体装的是哪个版本,比如"mysql8 0"或者"mysql8 .0"。
我这机器上是这个样子,记错了版本号别找我哈。

登陆MySQL的时候,mysql -u root -p,这个是标准操作。
但有时候你远程登陆,比如在电脑A上连电脑B上的数据库,光带-u root -p肯定不行。
你得加个-h 电脑B的IP地址,比如-h 1 9 2 .1 6 8 .1 .1 00。
而且,为了安全,现在都推荐用-P 端口号,默认3 3 06 肯定不行,对方服务器可能改过端口。
我记得上次我连一个朋友的云服务器,就得用-P 3 3 00。

退出的时候,exit;、quit;、q;都行,这倒是真的。
不过有时候我忘了退出,或者卡在某个命令行里半天不动了,就得强制关掉那个MySQL的命令窗口。

常用命令那几个,SELECT VERSION();查版本,SELECT NOW();看时间,SELECT USER();当前谁在用,这些确实天天用。
不过我更喜欢用SHOW DATABASES;看看有哪些库,或者SHOW TABLES;看看某个库里有什么表。
你那个命令里没提,但我觉得也挺常用。

还有啊,你说的"确保环境变量配置好",这点特别重要!我上次有个同学,装好了MySQL,但 cmd 里打不出 mysql 命令,就是因为环境变量 PATH 里没加那个 bin 目录。
他折腾半天,最后发现是这步没做好。

权限这块,你说得对,登陆的用户得有操作相应数据的权限。
比如你想创建库,你得有 CREATE DATABASE 的权限。
这个得去数据库里用 GRANT 命令给用户授权,或者让数据库管理员给你开。
忘了授权,你登陆了也干不成事儿。

总之啊,这些命令是基础,但实际用起来,还得结合你自己的环境,有时候会遇到各种奇奇怪怪的问题。
比如有一次我连一个旧数据库,发现得用 mysql5 .7 的客户端工具,结果我用了最新版的,连不上,最后还得换回来。
这种坑,光记命令是过不去的。

你把这些都记下来,先能跑起来就不错了。
以后多用多用,自然就熟了。
还有什么不清楚的,随时再问我哈。

MySQL SQL基础应用

SQL模式(sql_mode)就是规范SQL写法,保证数据严谨。
用select@@sql_mode;查当前设置。

ONLY_FULL_GROUP_BY:GROUP BY要规范,非聚合列必须加进去。
STRICT_TRANS_TABLES:事务表严格,非法数据直接报错。
NO_ZERO_IN_DATE:日期不能有零值,比如2 01 0-00-1 0不行。
NO_ZERO_DATE:禁止0000-00-00这种零日期。
ERROR_FOR_DIVISION_BY_ZERO:除零直接报错。
NO_AUTO_CREATE_USER:禁止自动创建用户,安全。
NO_ENGINE_SUBSTITUTION:建表用不支持的引擎直接报错。

字符集(charset)就是数据的编码方式。
utf8 :最多3 字节,基本多语言够用。
utf8 mb4 :最多4 字节,支持emoji等特殊字符。

校对规则(collation)决定排序方式,还管大小写敏感。
utf8 _bin:区分大小写排序。
utf8 _general_ci:不区分大小写排序。

常用SQL分类:
DDL(数据定义语言): CREATE:创建数据库、表。
DROP:删除数据库、表。
ALTER:修改表结构,比如加列。

DCL(数据控制语言): GRANT:授权用户权限。
REVOKE:撤销用户权限。

DML(数据操作语言): INSERT:插入数据。
UPDATE:更新数据。
DELETE:删除数据。

DQL(数据查询语言): SELECT:查询数据。
SHOW:显示数据库、表信息。

数据库对象属性:
数据类型保证数据准确性。

数值类型: 整数:tinyint、smallint、mediumint、int、h3int。
浮点数:float、double。
定点数:decimal。
BIT:位字段值。

字符类型: 文本:char(固定长度)、varchar(可变长度)。
tinytext、text、mediumtext、longtext:可变长度文本。

枚举与集合: enum:固定值枚举。
SET:固定值集合。

时间类型: DATE:格式YYYY-MM-DD。
TIME:格式hh:mm:ss。
DATETIME:格式YYYY-MM-DDhh:mm:ss。
TIMESTAMP:受时区影响。
YEAR:格式YYYY。

二进制类型: BINARY:固定长度二进制。
VARBINARY:可变长度二进制。
BLOB:二进制大对象。

JSON类型:存储JSON数据。

表属性:
列属性: 约束: primarykey:主键,非空唯一。
notnull:非空。
uniquekey:唯一键。
unsigned:无符号。
其他属性: key:索引,优化查询。
default:默认值。
auto_increment:自增长。
comment:注释。

表属性: 存储引擎:InnoDB默认。
字符集和排序规则:utf8 或utf8 mb4
这块我也还在看,数据记不清了,但大概是这样。