为什么Mysql会抖一下
是因为Mysql更新数据只写到redo的log里,达到阈值后会刷脏页,占用CPU资源。脏页是指内存页数据和磁盘页数据不统一的状况。
产生场景
- redolog写满到阈值后,需将对应的内存页数据刷到磁盘上。 须要尽量避免,否则所有更新操作都会被hang主
- 内存不足,刷脏页到磁盘上。常态,最须要关怀的。
- 资源闲暇时,刷页。也会时不时的刷下脏页。资源闲暇期刷脏页,零碎不会有压力。
- Mysql失常敞开的时候,刷脏页到磁盘。敞开时刷脏页,失常操作,也不会关怀性能。
影响性能的几种状况
- 一次刷脏页太多。
- 日志写满了,更新全副梗塞住。
刷脏控制策略
- 设置
innodb_io_capacity
参数,可通过fio
工具测试磁盘IO的IOPS
注意事项
- 比方查问操作,触发刷脏页时,会判断旁边的页是不是脏页,是的话一起刷掉,而且还能够向下传递。将相邻的脏页一起刷掉。 这也就会导致SQL操作时的rt可能被预期的更慢。能够通过参数
innodb_flush_neighbors
来管制,设置为1则会查找街坊脏页,设置为0则不查找街坊脏页。对于机械硬盘,倡议innodb_flush_neighbors
设置为1,对于SSD,倡议设置为0。因为SSD的IOPS比机械硬盘高很多。
为什么表数据删掉一半,表文件大小不变
参数innodb_file_per_table
管制着表数据寄存为值,ON
示意表数据放在.idb后缀文件中。OFF
示意零碎共享空间,默认值为ON
。而且如果为OFF,则即便删除表,表空间也不会开释。举荐设置为ON
。
delete 记录和表都不会开释表空间,会使得被开释的页被复用,也就是会产生空洞。
那如何去去掉空洞呢?
- 重建表。 应用
alter table A engine=InnoDB
命令。其隐含意思是alter table t engine=innodb,ALGORITHM=inplace;
analyze table t
只是对表的索引信息做从新统计,没有批改数据optimize table
等于 recreate+analyze
COUNT(*) 这么慢,我怎么办?
几种获取总数的形式
- count(*) 会扫描全表,可能会影响性能。 Mysql做了优化,不取值,按行累加
- count(字段) 示意满足条件的数据里,参数"字段"不为NULL的数量
- count(id) 因为主键id不能为空,会按主键行累加
- count(1) innodb遍历整个表,但不取值,返回给server后,server放入一个1,按行累加
依照效率排序的话,count(字段)
<count(主键 id)
<count(1)
≈count(*)
,所以我倡议你,尽量应用 count(*)
写Binlog后,commit前解体掉怎么保证数据残缺。
解体复原的判断规定
- 如果 redo log 外面的事务是残缺的,也就是曾经有了 commit 标识,则间接提交;
- 如果 redo log 外面的事务只有残缺的 prepare,则判断对应的事务 binlog 是否存在并残缺。 binglog残缺则提交事务,否则回滚事务。
redo log 和 binlog 是怎么关联起来的?
它们有一个独特的数据字段,叫 XID
。解体复原的时候,会按程序扫描 redo log:
- 如果redo log中有commit则间接提交
- 如果redo log中只有prepare,但没有commit,则带着
XID
去binlog中寻找,在binlog中通过checksum判断binlog是否残缺
为什么还要两阶段提交呢?罗唆先 redo log 写完,再写 binlog。解体复原的时候,必须得两个日志都残缺才能够。是不是一样的逻辑?
如果必须要举一个场景,来阐明这么做的必要性的话,那就是事务的持久性问题。对于 InnoDB 引擎来说,如果 redo log 提交实现了,事务就不能回滚(如果这还容许回滚,就可能笼罩掉别的事务的更新)。而如果 redo log 间接提交,而后 binlog 写入的时候失败,InnoDB 又回滚不了,数据和 binlog 日志又不统一了。
能不能只用redo log,不必binlog
不能。
- 归档。 redo log循环写,起不到归档的作用。
- mysql零碎依赖,mysql的高可用根底就依赖binlog的复制
为什么这些SQL语句逻辑雷同,性能却差别微小?
对索引字段做函数操作,会使得Mysql放弃走树搜寻索引
变种状况包含:
- 隐式类型转换。 mysql反对字符串转数字的优化,是能够走索引的,反之则不走树索引。
select * from user where id = '123'; id为int类型,是能够走索引的。 - 隐式字符编码转化,如果两张表join,且其编码不同,则会进行编码转换,也不走所用了。
同步公布博客: 疯狂小兵