目录
一、MySQL优化
3、mysql server上的优化
3.1、MySQL查询缓存
3.2、索引和数据缓存
3.2、线程缓存
二、MySQL日志
2.1、redo log 重做日志
2.2、undo log 回滚日志
2.3、错误日志
2.4、查询日志
2.5、二进制日志
2.5.1、基于binlog数据恢复实践操作
六、慢查询日志
文章来源地址https://uudwc.com/A/Pmv3W
一、MySQL优化
1、SQL和索引的优化
2、应用上的优化
3、mysql server上的优化
3.1、MySQL查询缓存
MySQL
的查询缓存是把
select
查询语句上一次的查询结果记录下来放在缓存当中,下一次再查询相同内
容的时候,直接从缓存中取出
来就可以了,不用再进行一遍真正的SQL
查询。但是当两个
select查询中 间出现insert,update,delete
语句的时候,查询缓存就会被
清空。
查询缓存适用更新不频繁的表
,因 为当表更新频繁的话,查询缓存也总是被清空,过多的查询缓存的数据添加和删除,就会影
响MySQL的 执行效率,还不如每次都从磁盘上查来得快(缓存指的就是一块内存,内存I/O比磁盘
I/O
快很多)。 可以在MySQL
上通
过以下命令,来查看查询缓存的设置:
文章来源:https://uudwc.com/A/Pmv3W
通过show status命令,可以查看MySQL查询缓存的使用状况,如下:
3.2、索引和数据缓存
主要指的就是
innodb_buffffer_pool_size
配置项,从名字上就能看到,该配置项是针对
InnoDB
存储引擎 起作用的,这个参数定InnoDB
存储引擎的表数据和索引数据的最大内存缓冲区大小。 innodb_buffffer_pool_size是同时为数据块和索引块做缓存,这个值设得越高,
访问表中数据需要的磁 盘 I/O
就越少。
innodb_buffer_pool_size=512M
3.2、线程缓存
主要指配置文件中
thread_cache_size
配置项。给大家讲过
MySQL Server
网络模块采用经典的
I/O
复用
+
线程池模型,之所以引入线程池,主要就是为了在业务执行的过程中,不会因为临时创建和销毁线
程,造成系统性能降低,因为线程的创建和销毁是很耗费性能的,所以线程池就是在业务使用之前,先
创建一组固定数量的线程,等待事件发生,当有
SQL
请求到达
MySQL Server
的时候,在线程池中取一
个线程来执行该
SQL
请求就可以了,执行完成后,不销毁线程,而是把线程再归还到线程池中,等待下
一次任务的处理(
MySQL
会根据连接量,自动加大线程池的数量)。
thread_cache_size=10
配置完
thread_cache_size
,重启
MySQL Server
服务生效。
二、MySQL日志
2.1、redo log 重做日志
redo log
:重做日志,用于记录事务操作的变化,确保事务的
持久性
。
redo log
是在事务开始后就开始
记录,不管事务是否提交都会记录下来,在异常发生时(如数据持久化过程中掉电),
InnoDB
会使用
redo log
恢复到掉电前的时刻,保证数据的完整性。
MySQL执行的时候都有缓存的辅助,不可能直接和磁盘打交道的
innodb_log_buffffer_size
默认是
16M
,就是
redo log
缓冲区的大小,它随着事务开始,就开始写
redo
log
,如果事务比较大,为了 避免事务执行过程中花费过多磁盘IO
,可以设置比较大的
redo log缓存,节省磁盘IO
。
你
2.2、undo log 回滚日志
undo log
:回滚日志,保存了事务发生之前的数据的一个版本,用于事务执行时的回滚操作,同时也是
实现多版本并发控制(
MVCC
)下读操作的关键技术。
DB_TRX_ID: 事务
ID DB_ROLL_PTR: 回滚指针
2.3、错误日志
错误日志是
MySQL
中最重要的日志之一,它记录了当
mysqld
启动和停止时,以及服务器在运行过程
中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,可以首先查看此日
志。
mysqld
使用错误日志名
host_name.err(host_name
为主机名
)
并默认在参数
DATADIR(
数据目录
)
指定
的目录中写入日志文件。
2.4、查询日志
查询日志记录了客户端的所有语句。由于上线项目
sql
特别多,开启查询日志
IO
太多导致
MySQL
效率
低,只有在调试时才开启,比如通过查看
sql
发现热点数据进行缓存。
mysql> show global variables like "%genera%";
2.5、二进制日志
二进制日志
(BINLOG)
记录了所有的
DDL(
数据定义语言
)
语句和
DML(
数据操纵语言
)
语句,但是不包括
数据查询语句。语句以
“
事件
”
的形式保存,它描述了数据的更改过程。 此日志对于灾难时的数据恢复起
着极其重要的作用。
两个重要的应用场景:主从复制、数据恢复
查看
binlog
:
mysql> show binary logs;
通过
mysqlbinlog
工具(
mysql
原生自带的工具)可以快速解析大量的
binlog
日志文件,如:
shell> mysqlbinlog --no-defaults --database=school --base64-output=decode-rows
-v --start-datetime='2021-05-01 00:00:00' --stop-datetime='2021-05-10 00:00:00'
mysql-bin.000001 | more
2.5.1、基于binlog数据恢复实践操作
六、慢查询日志
MySQL
可以设置慢查询日志,当
SQL
执行的时间超过我们设定的时间,那么这些
SQL
就会被记录在慢查
询日志当中,然后我们通过查看日志,用
explain
分析这些
SQL
的执行计划,来判定为什么效率低下,是
没有使用到索引?还是索引本身创建的有问题?或者是索引使用到了,但是由于表的数据量太大,花费
的时间就是很长,那么此时我们可以把表分成
n
个小表,比如订单表按年份分成多个小表等。
慢查询日志相关的参数如下所示: