一、MySQL体系结构
1.1、体系结构
#
1.2、查询执行流程
参考:https://www.cnblogs.com/xfeiyun/p/15899990.html
1.3、组件说明
- 管理工具:MySQL服务软件安装后提供的命令
- 连接池:检查本机是否有空闲资源(线程,内存)处理当前的连接请求
- SQL接口:把SQL命令传递给MySQL服务的进程处理(mysqld进程)
- 分析器:检查执行的SQL命令是否有语法错误
- 优化器:优化执行的SQL命令,使其能以最节省系统资源的方式执行
- 查询缓存:存储数据库查询过的查询结果。缓存空间从系统的物理内存里自动划分出来的,
- 存储引擎:自带的功能程序,用来处理表的处理器
- 文件系统:数据盘
二、SQL优化
- 查看监控信息,查看慢日志
- SQL响应慢:检查网络带宽,查看硬件资源的使用情况(cpu,内存,磁盘io)
2.1、连接数查询
max_connections #查看最大默认并发连接数,默认为151个
show global status like "max_used_connections"; #查看曾经最大的连接数量;
show full processlist; #查看当前的进程;
kill id; #删除进程
flush status; #刷新、清零远程连接的值
show global status like "threads_connected"; #查看当前连接数
合理设置最大并发连接公式:有过的最大连接数/并发连接数=0.85
2.2、线程
thread_cache_size #可以重复使用的线程数量,默认为9;指mysqld进程启动的时候
#默认开启9个空闲线程等待客户端连接,加快连接速度,占用内存
table_open_chace #指所有线程打开的表的数量总和,默认为2000,一个连接是一个线程
#mysqld线程--->硬盘中的表--->内存--->硬盘
2.3、查询缓存相关
https://www.cnblogs.com/heruiguo/p/12603825.html
key_buffer_size #索引缓存大小,默认为8M,适用于myisam,(索引好处就是给字段排队)
sort_buffer_size #为每个要排序的线程分配此大小的缓存空间(256k)
read_buffer_size #为顺序读取表记录保留的缓存大小(128k)
query_cache_type = 0|1|2 #查询缓存0:off,1:on(只要不超过限制就自动加入)
#2:(DEMAND)添加缓存时必须添加sql_in_cache参数:select 字段列表 from 表 sql_in_cache;
mysql> show variables like "query_cache%";
query_cache_limit 1M # 允许 Cache 的单条 Query 结果集的最大容量,默认是1MB,超过此参数设置的 Query 结果集将不会被 Cache
query_cache_size 1M #缓存所占用的内存空间大小
query_cache_min_res_unit 4k #缓存在CPU时的最小单位
query_cache_type #类型
query_cache_wlock_invalidate #查询缓存写锁无效,默认为关(产生写锁)
#解读:当读和写同时发生在一个表时,为避免脏读,会产生写锁,
此时读不到数据,等写操作完成后才能进行正常读
2.3、验证缓存:查看缓存统计信息
mysql> show global status like "qcache%"
Qcache_hits | 0 #客户端查询,先从内存中的缓存开始查找,如果在缓存中找到,则+1
Qcache_inserts | 1 #客户端查询总次数
Qcache_lowmem_prunes #查询缓存默认为8M,当缓存满时,就删一次,此值加1。此值越大,就说明查询缓存就越小
qcache_not_cached #不让存入缓存的查询个数,数值越大,代表query_cache_limit越小
2.4、日志:
- binlog日志
- 错误日志:log-error=mysqld.log
- 查询日志:记录所有的SQL命令读写操作
- 慢查询日志:
2.4.1、查询日志相关
general-log #开启查询日志,默认为 主机名.log
general-log-file=路径/名称 #此参数可以不指定
2.4.2、慢查询日志相关参数
slow_query_log #开启慢查询日志,默认为主机名-slow.log
slow_query_log_file #指定慢查询日志文件,可以不指定
long-query-time=10 #默认为10s,查询超过10s的查询记录在慢查询日志里边,包含10s
log-queries-not-using-indexes=1 #启用记录 未使用索引的查询,保存在慢日志里边
mysqldumpslow 慢日志名:统计并输出慢日志