作为一个后端工程师,想必没有人没用过数据库,跟我一起复习一下MySQL吧,本文是我学习《MySQL实战45讲》的总结笔记的第六篇,总结了MySQL的InnoDB引擎相关的实践使用问题。

上一篇:MySQL核心知识学习之路(5)

1 MySQL为什么有时会"抖"一下?

啥是抖?

抖即不稳定,一个SQL语句平时速度挺快的,偶尔却会慢一下,称之为“抖”

为何会抖?

因为InnoDB引擎在后台刷“脏页”占用了IO资源。

所谓“脏页”,就是当内存数据页跟磁盘数据页内容不一致的时候就是“脏页”。

由于MySQL使用了WAL机制(Write-ahead logging 预写式日志),会将数据库的随机写转化为顺序写,提高读写性能,但副作用就是“脏页”

所谓“干净页”,就是当内存数据写入磁盘后,内存和磁盘上的数据页的内容一致了。

抖的影响?

会造成系统不稳定,性能突然下降,对业务端不友好。

如何防抖?

(1)设置合理参数配置,如 innodb_io_capacity 设置成磁盘的IOPS值。

平时多关注脏页比例(innodb_max_dirty_pages_pct,默认值75%),不要超过75%

2 为何表数据删掉一半后表文件大小不变?

表文件不变的原因?

因为delete命令指示将记录的位置 或 数据页 标记为了“可复用”,并没有收回表空间

这些被标记为“可复用”但还未被使用的空间被称之为“空洞”。

图片来源:林晓斌《MySQL实战45讲》

使用delete命令删除数据就会产生空洞,被标记为“可复用”。而使用insert命令插入数据可能引起页分裂,也可能产生空洞。

图片来源:林晓斌《MySQL实战45讲》

表数据如何存放?

表数据既可以存放在共享表空间里,也可以放在单独的文件(.ibd)中。

由参数 innodb_file_per_table 控制:

  • = OFF,存放在系统共享表空间

  • = ON,存放在单独的.ibd文件中

  • MySQL 5.6.6 开始,默认值就是ON

如何让删除数据后的表文件变小?

重建表,消除因为进行大量的更新操作而产生的空洞。下图是使用alter table t engine=InnoDB重建表的示意图,MySQL 会自动完成转存数据、交换表名、删除旧表的操作。

图片来源:林晓斌《MySQL实战45讲》

如何正确重建表:

  • alter table t engine=InnoDB

  • optimize table t (等同于 recreate + analyze)

  • truncate table t (等同于 drop + create)

Online DDL

MySQL 5.6开始引入了Online DDL,支持在重建表过程中对表做更新操作。

图片来源:林晓斌《MySQL实战45讲》

其实现原理如下:

  • 在生成临时文件过程中,通过row log记录更新操作,然后再应用到临时文件。

  • 最后用临时文件整体替换表的数据文件。

  • alter语句在启动时获取MDL写锁,但在真正拷贝数据之前退化为MDL读锁,而MDL读锁不会阻塞更新操作。

适用场景:可以考虑在业务低峰期使用

在MySQL 5.5及之前版本,这个命令会阻塞DML。

3 count(*)为何这么慢?

不同引擎对于count(*)的实现方式

select count(*) from t

MyISAM引擎将表的总行数存在了磁盘上,因此效率很高

InnoDB引擎则每次都需要将数据一行一行地从引擎中读出来进行累积计数,因此存在性能问题

那么,问题来了:为什么InnoDB不跟MyISAM一样设计?

InnoDB的事务隔离级别默认是可重复读,而MyISAM不支持事务

那么,第二个问题:能用show table status中的TABLE_ROWS代替吗?

不能,因为它是通过采样估算的,存在40%~50%的误差。

自己计数的实现方法

方式1:用缓存系统如Redis来保存计数,存在丢失更新、逻辑上不精确的问题,因此不建议使用。

方式2:用数据库表来保存计数,不会丢失更新和不精确,建议使用

不同count()用法对比

首先,弄清楚的count()的含义。

count():一个聚合函数,对于返回的结果集,一行行地判断,如果count函数的参数不是NULL,累计值就加1,否则不加。最后返回累计值。

其次,直接给出结论。

按照效率排序:count(字段)<count(主键 id)<count(1)≈count(*)。

建议尽量使用 count(*),因为MySQL对count(*)专门进行了优化

4 小结

本文总结了MySQL的InnoDB引擎相关的实践使用问题,包括MySQL为什么有时候会不稳定的“抖”一下、为何表数据删除了一半但表文件大小没变 和 为何 count(*)会很慢。

参考资料

林晓斌(丁奇),《MySQL实战45讲》

扫码订阅《MySQL实战45讲》

作者:周旭龙

出处:https://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

MySQL核心知识学习之路(6)的更多相关文章

  1. 零基础的学习者应该怎么开始学习呢?Python核心知识学习思维分享

    近几年,Python一路高歌猛进,成为最受欢迎的编程语言之一,受到无数编程工作者的青睐. 据悉,Python已经入驻部分小学生教材,可以预见学习Python将成为一项提高自身职业竞争力的必修课.那么零 ...

  2. MySQL索引知识学习笔记

    目录 一.索引的概念 二.索引分类 三.索引用法 四 .索引架构简介 五.索引适用的情况 六.索引不适用的情况 继我的上篇博客:Oracle索引知识学习笔记,再记录一篇MySQL的索引知识学习笔记,本 ...

  3. MYSQL+PHP的学习之路

    MYSQL+PHP 先从MYSQL开始吧 第一步:SQL语句基础 1.书籍 2.网站: 这个网站在线测试和考试http://sqlzoo.net/wiki/SELECT_basics/zh 3.学习过 ...

  4. mysql 核心知识要点

    整体知识介绍:mysql基本操作和使用,mysql优化(索引,分表等),mysql部署(读写分离,负载均衡等) 数据库基本介绍:数据库概念,常用数据库,web应用三大软件分工,PHP动态语言特点(处理 ...

  5. MySQL核心知识

    MySQL常用的命令 启动:net start mySql; 进入:mysql -u root -p/mysql -h localhost -u root -p databaseName; 列出数据库 ...

  6. Webwork 学习之路【03】核心类 ServletDispatcher 的初始化

    1. Webwork 与 Xwork 搭建环境需要的的jar 为:webwork-core-1.0.jar,xwork-1.0.jar,搭建webwork 需要xwork 的jar呢?原因是这样的,W ...

  7. MySQL学习之路(一)——初涉MySQL。

    MySQL学习之路(一) 1.1MySQL的概述 MySQL由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一个开源的关系型数据库管理系统. MySQL分为社区版和企业版. 1 ...

  8. Docker 与 K8S学习笔记(二)—— 容器核心知识梳理

    本篇主要对容器相关核心知识进行梳理,通过本篇的学习,我们可以对容器相关的概念有一个全面的了解,这样有利于后面的学习. 一.什么是容器? 容器是一种轻量级.可移植.自包含的软件打包技术,使应用程序可以在 ...

  9. 阿里封神谈hadoop学习之路

    阿里封神谈hadoop学习之路   封神 2016-04-14 16:03:51 浏览3283 评论3 发表于: 阿里云E-MapReduce >> 开源大数据周刊 hadoop 学生 s ...

  10. 13本热门书籍免费送!(Python、SpingBoot、Entity Framework、Ionic、MySQL、深度学习、小程序开发等)

    七月第一周,网易云社区联合清华大学出版社为大家送出13本数据分析以及移动开发的书籍(Python.SpingBoot.Entity Framework.Ionic.MySQL.深度学习.小程序开发等) ...

随机推荐

  1. github release 下载文件慢、或者失败的解决方法

    Free Download Manager 下载工具可以解决Github 下载缓慢或失败问题. 扫描下方二维码,关注公众号 回复github,即可获取下载链接.

  2. Tomcat知识点整理

    从学习起就开始接触tomcat, 解压, 点击运行, 然后放文件夹里面会自动部署, 可以通过ip访问. 在这里主要记录一些tomcat相关的知识点 配置文件解析(留位置) server.xml/web ...

  3. 在 Idea 中使用 Git

    以 git-2.21.0 为例说明安装步骤: 双击 Git-2.21.0-64-bit.exe 点击 Next 设置安装路径 点击 Next 点击 Next 点击 Next,选择默认的编辑器 点击 N ...

  4. 开源免费真香!Star 1.4k 这款开源在线教育系统让万人学习零压力,企业培训系统一键搭建神器

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 PlayEdu 是一款基于 SpringBoot3 + Vue3 开发的开源企业培训系统,提 ...

  5. SQL Server 2025 中的改进

    SQL Server 2025 中的改进 当我们接近 SQL Server 2025 的首次公开版本时,开始深入探究 Azure SQL DB 如今(已公布和未公布)但在 SQL Server 盒装产 ...

  6. Android去掉默认的标题栏

    去掉默认的标题栏:在onCreate方法里添加supportRequestWindowFeature(Window.FEATURE_NO_TITLE); @Override protected voi ...

  7. <HarmonyOS第一课10>ArkUI进阶#鸿蒙课程##鸿蒙生态#

    课程介绍 <HarmonyOS第一课:ArkUI进阶>是专为HarmonyOS开发者设计的课程,旨在提升开发者在ArkUI框架中的布局技能.课程将重点讲解如何进行布局性能优化,包括精简节点 ...

  8. Vue技术之“关于sortable排序的使用”

    Vue关于sortable排序的使用 方案1 在使用sortable后要注意给el-table-column中加入prop="overdueDays"参数,不然会找不到需要排序的数 ...

  9. dashboard部署

    1.下载dashboard资源请单 wget  https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/re ...

  10. 队列-Python 实现

    用 Python 来实现 队列和双端队列, 直接上代码理解即可. 队列蛮好理解的, 就是模拟咱生活中的排队. 先进, 先出嘛. """ 队列 - ADT 队列 Queue ...