
MySQL(InnoDB剖析)
文章平均质量分 91
本专栏是对MySQL的InnoDB存储引擎的剖析,内容包含但不限于InnoDB。专栏的内容大部分来自于读书笔记,感谢姜承尧先生的著作《MySQL技术内幕.InnoDB存储引擎》
董哥的黑板报
90后程序员!
展开
-
MySQL(InnoDB剖析):55---性能调优之(操作系统的选择、不同文件系统对数据库性能的影响)
待续原创 2020-02-19 11:07:38 · 868 阅读 · 0 评论 -
MySQL(InnoDB剖析):54---性能调优之(合理地设置RAID)
待续原创 2020-02-19 11:03:27 · 1028 阅读 · 0 评论 -
MySQL(InnoDB剖析):53---性能调优之(CPU的选择、内存的重要性、磁盘对数据库性能的影响)
一、CPU的选择用户首先需要清楚当前数据库的应用类型。一般而言,可分为两大类:OLTP(Online Transaction Processing,在线事务处理)和OLAP(Online analytical Processing,在线分析处理)。这是两种截然不同的数据库应用 OLAP多用在数据仓库或数据集市中,一般需要执行复杂的SQL语句来进行查询 OLTP多用在日常的事物处理应用中,......原创 2020-02-19 10:11:43 · 2244 阅读 · 0 评论 -
MySQL(InnoDB剖析):52---备份与恢复之(复制)
待续原创 2020-02-19 10:11:19 · 1800 阅读 · 0 评论 -
MySQL(InnoDB剖析):51---备份与恢复之(快照备份(lvcreate、lvdisplay))
待续原创 2020-02-19 09:56:47 · 1149 阅读 · 0 评论 -
MySQL(InnoDB剖析):50---备份与恢复之(热备份:ibbackup、XtraBackup)
一、ibbackup二、XtraBackup三、XtraBackup实现增量备份待续原创 2020-02-18 19:59:48 · 887 阅读 · 0 评论 -
MySQL(InnoDB剖析):49---备份与恢复之(二进制日志备份(mysqlbinlog)、冷备份)
一、二进制日志文件备份与恢复二进制日志非常关键,用户可以通过它完成point-in-time的恢复工作。MySQL数据库的replication同样需要二进制日志开启二进制日志默认情况下并不启用二进制日志 要使用二进制日志必须首先启用它,在配置文件中进行如下的配置:在前面介绍过,对于InnoDB只简单启用二进制日志是不够的,还需要启用一些其他参数来保证最为安全和正确地记录二进......原创 2020-02-18 17:14:33 · 769 阅读 · 0 评论 -
MySQL(InnoDB剖析):48---备份与恢复之(逻辑备份:mysqldump、select...into outfile、load data infile、mysqlimport)
一、mysqldumpmysqldump工具最初由Ifor Romanenko编写完成,通常用来完成转存数据库的备份及不同数据库之间的移植,如从MySQL低版本数据库升级到MySQL高版本数据库,又或者从MySQL数据库移植到Oracle、SQL Server等该工具使用的注意事项①mysqldump工具是MySQL外命令行使用的,不是在MySQL数据库启动使用的 ②该工具使用时需要......原创 2020-02-18 16:58:24 · 902 阅读 · 0 评论 -
MySQL(InnoDB剖析):47---备份与恢复总体概述
一、根据不同的类型来划分备份根据不同的类型来划分备份的方法,可以分为以下几种: Hot Backup(热备) Cold Backup(冷备) Warm Backup(温备) Hot Backup(热备)是指在数据库运行时进行直接备份,对正在运行的数据库没有任何影响 这种方法在MySQL官方手册中被称为Online Backup(在线备份)Cold Backup(冷备)......原创 2020-02-18 12:49:52 · 635 阅读 · 0 评论 -
MySQL(InnoDB剖析):46---事务之(长事务)
长事务概述长事务,就是执行时间较长的事务 比如,对于银行系统的数据库,每过一个阶段可能需要更新对应账户的利息。如果对应账号的数量非常大,例如对有1亿用户的表account,需要执行下列语句:这时这个事务可能需要非常长的时间来完成。可能需要1个小时,也可能需要4、5个小时,这取决于数据库的硬件配置 DBA和开发人员本身能做的事情非常少。然而,由于事务的ACID的特性,这个操作被封装在一......原创 2020-02-18 12:05:12 · 1093 阅读 · 0 评论 -
MySQL(InnoDB剖析):45---事务之(不好的事务习惯:在循环中提交、使用自动提交、使用自动回滚)
一、在循环中提交开发人员喜欢在循环中进行事务提交,这种方法有两个缺点:出现错误难处理以及效率低演示案例创建一个表create table t1( a int not null, b varchar(80))engine=innodb;下面一个存储过程delimiter //create procedure load1(count int unsig......原创 2020-02-18 11:55:03 · 1436 阅读 · 0 评论 -
MySQL(InnoDB剖析):44---事务之(XA事务(分布式事务))
一、MySQL数据库分布式事务InnoDB存储引擎提供了对XA事务的支持,并通过XA事务来支持分布式事务的实现 分布式事务指的是:允许多个独立的事务资源参与到一个全局的事务中。事务资源通常是关系型数据库系统,但也可以是其他类型的资源 全局事务要求在其中的所有参与的事务要么都提交,要么都回滚,这对于事务原有的ACID要求又有了提高。另外,在使用分布式事务时,InnoDB的事务隔离级别必须设置......原创 2020-02-18 10:58:58 · 1925 阅读 · 0 评论 -
MySQL(InnoDB剖析):43---事务之(事务隔离级别:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE)
ISO和ANIS SQL标准指定了4种事务隔离级别的标准,但是很少有数据库厂商循环这些标准。例如Oracle数据库就不支持READ UNCOMMITTED和REPEATABLE READ SQL标准定义的四个隔离级别为: READ UNCOMMITTED READ COMMITTED REPEATABLE READ SERIALIZABLE 一、总体概述READ UNCOM......原创 2020-02-17 17:46:50 · 1131 阅读 · 0 评论 -
MySQL(InnoDB剖析):42---事务之(事务控制语句:begin、commit、rollback、savepoint、transaction)
一、事务的自动提交默认情况下,没有使用begin显式开启事务,事务都是自动提交的autocommit变量该变量用于控制SQL语句是否自动提交(auto commit) 默认值为1,表示自动提交 设置为0后,需要自己手动使用commit或rollback来结束事务-- SQL语句自动提交(默认值)set autocommit=1;-- SQL语句不自动提交set auto......原创 2020-02-17 16:48:46 · 2840 阅读 · 0 评论 -
MySQL(InnoDB剖析):41---事务之(事务的实现:purge、group commit)
一、purgedelete和update操作可能并不直接删除原有的数据例如前一篇文章演示案例中:https://blog.youkuaiyun.com/qq_41453285/article/details/104346372 对表t执行下面的SQL语句。其中a字段为聚集索引,b字段为辅助索引delete from t where a=1;对于上述的delete操作,通过前面关于undo......原创 2020-02-17 12:49:15 · 778 阅读 · 0 评论 -
MySQL(InnoDB剖析):40---事务之(事务的实现:undo log(回滚日志))
事务隔离性可以使用前面介绍的锁来实现。原子性、一致性、持久性通过数据库的redo log和undo log来完成: redo log:称为重做日志。用来保证事务的原子性和持久性 undo log:用来保证事务的一致性 redo和undo的作用都可以视为一种恢复操作: redo恢复提交事务修改的页操作 undo回滚行记录到某个特定版本 因此两者记录的内容也不同: redo通......原创 2020-02-17 11:12:11 · 2432 阅读 · 0 评论 -
MySQL(InnoDB剖析):39---事务之(事务的实现:redo log(重做日志))
事务隔离性可以使用前面介绍的锁来实现。原子性、一致性、持久性通过数据库的redo log和undo log来完成: redo log:称为重做日志。用来保证事务的原子性和持久性 undo log:用来保证事务的一致性 redo和undo的作用都可以视为一种恢复操作: redo恢复提交事务修改的页操作 undo回滚行记录到某个特定版本 因此两者记录的内容也不同: redo通......原创 2020-02-16 13:31:29 · 1208 阅读 · 0 评论 -
MySQL(InnoDB剖析):38---事务之(事务的分类:扁平事务、带有保存点的扁平事务、链事务、嵌套事务、分布式事务)
从事务理论的角度来说,可以把事务分为以下几种类型: 扁平事务(Flat Transactions) 带有保存点的扁平事务(Flat Transactions with Savepoints) 链事务(Chained Transactions) 嵌套事务(Nested Transactions) 分布式事务(Distributed transactions) 对于InnoDB......原创 2020-02-16 10:36:17 · 1338 阅读 · 0 评论 -
MySQL(InnoDB剖析):37---事务之(事务概述、事务的ACID特性)
一、事务概述事务可由一条非常简单的SQL语句组成,也可以由一组复杂的SQL语句组成 事务是访问并更新数据库中各种数据项的一个程序执行单元 在事务中的操作,要么都做修改,要么都不做,这就是事务的目的,也是事务模型区别与文件系统的重要特征之一二、事务的ACID特性理论上说,事务有着极其严格的定义,它必须同时满足四个特性,通常所说的事务的ACID特性 值得注意的是,虽然理论上定义了严格的......原创 2020-02-16 09:12:43 · 456 阅读 · 0 评论 -
MySQL(InnoDB剖析):29---全文检索(倒排索引、全文索引/全文检索)
一、引言演示说明前面介绍过了,B+树索引的特点是可以通过索引字段的前缀进行查找。例如对于下面的查询B+树是支持的select * from blog where content like 'xxx%';但是有时候我们要查询的是博客的内容中含有“xxx”,而不是以“xxx”开头,所以应该是下面的SQL语句select * from blog where content like......原创 2020-02-13 21:27:45 · 5534 阅读 · 1 评论 -
MySQL(InnoDB剖析):28---哈希算法与自适应哈希索引
哈希也可以参阅本文数据结构文章:https://blog.youkuaiyun.com/qq_41453285/article/details/103517420一、哈希算法哈希算法是一种常见算法,时间复杂度为O(1),且不只存在于索引中,每个数据库应用中都存在该数据库结构二、哈希表哈希表也称散列表,由直接寻址表改进而来.先看直接寻址表 当关键字的全域U比较小时,直接寻址是一种简单而有效的技术。加......原创 2020-02-10 11:02:50 · 927 阅读 · 0 评论 -
MySQL(InnoDB剖析):27---B+树索引的使用(联合索引、覆盖索引、优化器不使用索引的情况、索引提示、MRR优化、ICP优化)
前言在了解了B+树索引的本质和实现后,下一个需要考虑的问题是怎样正确地使用B+树索引,这不是一个简单的问题。这里所总结的可能并不适用于所有的应用场合。我所能做的只是概括一个大概的方向。在实际的生产环境使用中,每个DBA和开发人员,还是需要根据自己的具体生产环境来使用索引,并观察索引使用的情况,判断是否需要添加索引。不要盲从任何人给你的经验意见 根据前面的介绍,用户已经知道数据库中存在两种类型......原创 2020-02-10 10:40:36 · 725 阅读 · 0 评论 -
MySQL(InnoDB剖析):26---B+树索引之Cardinality值
关于Cardinality,还可参阅前面介绍过的SHOW INDEX命令:https://blog.youkuaiyun.com/qq_41453285/article/details/104221161一、什么是Cardinality什么时候使用索引比较合适并不是在所有的查询条件中出现的列都需要添加索引。对于什么时候添加B+树索引,一般的经验是:在访问表中很少一部分时使用B+树索引才有意义 例......原创 2020-02-09 09:34:41 · 751 阅读 · 0 评论 -
MySQL(InnoDB剖析):25---B+树索引的管理(索引管理、Fast Index Creation、Online Schema Change、Online DDL)
一、索引管理索引的创建和删除可以通过两种方法: 一种是ALTER TABLE 另一种是CREATE/ DROP INDEX 使用语法例如下面有一个表,创建表时指定了一个主键索引create table t( a int not null, b varchar(8000), primary key(a))engine=innodb;......原创 2020-02-08 18:21:11 · 1087 阅读 · 0 评论 -
MySQL(InnoDB剖析):24---B+树索引(聚集索引与非聚集索引(辅助索引))、B+树索引的分裂
一、B+树索引概述B+树索引的本质就是B+树在数据库中的实现。但是B+索引在数据库中有一个特点就是高扇出性,因此在数据库中,B+树的高度一般都在2~4层,也就是说查找某一键值的行记录最多只需要2~4次IO。因为当前一般的机械磁盘每秒至少可以做100次IO,2~4次IO意味着查询时间只需0.02~0.04秒 B+树索引分类: 聚集索引(clustered index) 辅助索引(seco......原创 2020-02-08 11:58:02 · 758 阅读 · 0 评论 -
MySQL(InnoDB剖析):23---InnoDB索引概述、数据结构与算法概述(二分查找、二叉搜索树、平衡二叉树、B+树)
索引的使用:https://blog.youkuaiyun.com/qq_41453285/article/details/90046913一、索引概述索引是应用程序设计和开发的一个重要方面。若索引太多,应用程序的性能可能会受到影响。而索引太少,对查询性能又会产生影响。要找到一个平衡点二、InnoDB存储引擎索引概述InnoDB支持以下几种常见的索引: B+树索引 全文索引 哈希索引......原创 2020-02-07 11:43:59 · 771 阅读 · 1 评论 -
MySQL(InnoDB剖析):20---table之(视图、物化视图)
一、视图概述在MySQL数据库中,视图(view)是一个命名的虚表,它由一个SQL查询来定义,可以当做表使用。与持久表不同的是,视图中的数据没有实际的物理存储二、视图的作用视图在数据库中发挥着重要的作用。视图的主要用途之一是被用做一个抽象装置,特别是对于一些应用程序,程序本身不需要关心基表的结构,只需要按照视图定义来取数据或更新数据,因此,视图同时在一定程度上起到一个安全层的作用 My......原创 2020-02-03 10:57:45 · 1779 阅读 · 0 评论 -
MySQL(InnoDB剖析):19---table之(约束与数据完整性(唯一/主键/外键/enum/set/触发器约束、约束和索引区别、sql_mode))
约束与完整性可参阅另一篇文章:https://blog.youkuaiyun.com/qq_41453285/article/details/87971552一、数据完整性关系型数据库系统和文件的一个不同点:关系数据库本身能保证存储数据的完整性,不需要应用程序的控制,而文件系统一般需要在程序端进行控制。当前几乎所有的关系型数据库都提供了约束(constraint)机制,该机制提供了一条强大而简易的途径来......原创 2020-02-02 18:27:37 · 2176 阅读 · 0 评论 -
MySQL(InnoDB剖析):18---table之(Named File Formats机制)
一、Named File Formats机制概述随着InnoDB存储引擎的发展,新的页数据结构有时用来支持新的功能特性。比如前面提到的InnoDB 1.0.x版本开始提供了新的页数据结构来支持表压缩功能,完全的溢出(Off page)大变长字符类型字段的存储 这些新的页数据结构和之前版本的页并不兼容,因此从InnoDB 1.0.x版本开始,InnoDB通过Named File Formats......原创 2020-02-02 10:59:50 · 785 阅读 · 0 评论 -
MySQL(InnoDB剖析):17---table之(数据页(B-tree Node)结构)
从前面介绍我们已经知道页是InnoDB存储引擎管理数据库的最小磁盘单位 页类型为B-tree Node的页(数据页)存放的即是表中行的实际数据了InnoDB数据页由以下7个部分组成: File Header(文件头) Page Header(页头) Infimun和Supermum Records User Records(用户记录,即行记录) Free Space(空......原创 2020-02-02 10:39:29 · 871 阅读 · 0 评论 -
MySQL(InnoDB剖析):16---table之(行记录格式(Compact、Redundant、Compressed、Dynamic)、行溢出数据、CHAR的行结构存储)
一、InnoDB行记录格式InnoDB存储引擎和大多数数据库一样,记录是以行的形式存储的,意味着页中保存着表中一行行的数据 在InnoDB 1.0.X版本之前,InnoDB提供了Compact和Redundant两种格式来存放行记录数据。Redundant是为了兼容之前版本而保留的 如果阅读了InnoDB的源代码会发现,代码中分别用PHYSICAL RECORD(NEW STYLE)和PH......原创 2020-02-01 15:11:01 · 3972 阅读 · 2 评论 -
MySQL(InnoDB剖析):14---table之(索引组织表、附_rowid)
一、索引组织表的概念在InnoDB中,表都是根据主键顺序组成存放的,这种存储方式的表称为索引组织表二、表主键的确认规则在InnoDB中,每张表都会有个主键 主键的确认的规则如下: ①创建表时指定的主键 ②如果在创建表时没有显示地定义主键,则按照如下方式来选择或创建主键: 首先判断表中是否有非空的唯一索引(unique、not null)。如果有,则该列即为主键 当表中有......原创 2020-01-31 14:12:40 · 1161 阅读 · 0 评论 -
MySQL(InnoDB剖析):15---table之(表空间:段(segment)、区(extent)、页(page))
一、InnoDB逻辑存储结构从InnoDB的逻辑存储结构看,所有数据都被逻辑地存放在一个空间中,称之为表空间(tablespace) 表空间又由段(segment)、区(extent)、页(page)组成 页在一些文档中有时也称为块(block)二、表空间表空间可以看做是InnoDB存储引擎逻辑结构的最高层,所有的数据都存放在表空间中默认表空间前面文章已经介绍了在默认情况......原创 2020-01-31 16:59:29 · 4135 阅读 · 0 评论 -
MySQL(InnoDB剖析):13---文件之(InnoDB存储引擎文件:表空间文件(.ibd)、重做日志文件(redo log))
前面介绍的文件都是MySQL数据库本身的文件,和存储引擎无关。本文介绍与存储引擎有关的独有的文件。本文将介绍与InnoDB密切相关的文件,这些文件包括重做日志文件、表空间文件一、表空间文件功能:InnoDB采用将存储的数据按表空间(tablespace)进行存放的设计 在默认配置下会有一个初始大小为10MB,名为idbata1的文件(见下图),该文件就是默认的表空间文件 表空间结构介绍参......原创 2020-01-30 21:13:25 · 1447 阅读 · 0 评论 -
MySQL(InnoDB剖析):12---文件之(套接字文件.sock、pid文件.pid、表结构定义文件.frm)
一、套接字文件在前面介绍MySQL通信方式时介绍过套接字文件:https://blog.youkuaiyun.com/qq_41453285/article/details/104083287 在UNIX系统下本地连接MySQL可以采用UNIX域套接字方式,这种方式需要一个套接字文件 套接字文件可由参数socket控制,如下所示:show variables like 'socket'\G;......原创 2020-01-30 16:01:04 · 754 阅读 · 0 评论 -
MySQL(InnoDB剖析):11---文件之(日志文件:错误日志(error log)、慢查询日志(slow query log)、查询日志(query log)、二进制日志(bin log))
日志文件记录了影响MySQL数据库的各种类型活动 常见的日志文件有: 错误日志(error log) 慢查询日志(slow query log) 查询日志(log) 二进制文件(binlog) 一、错误日志错误日志文件对MySQL的启动、运行、关闭过程进行了记录。遇到问题时应该首先查看该文件以便定位问题。该文件不仅记录了所有的错误信息,也记录一些警告信息或正确的信息 用户......原创 2020-01-30 15:48:57 · 1591 阅读 · 0 评论 -
MySQL(InnoDB剖析):10---文件之(参数文件.cnf)
一、参数文件概述当MySQL实例启动时,数据库会先去读一个配置参数文件,用来寻找数据库的各种文件所在位置以及制定某些初始化参数 在默认情况下,MySQL实例会按照一定的顺序在指定的位置进行参数文件的读取,用户只需通过下面的命令来进行查看即可: 通过下图我们可以知道,MySQL在启动时读取配置文件的顺序是:/etc/my.cnf->/etc/mysql/my.cnf->/usr/......原创 2020-01-29 20:41:46 · 2609 阅读 · 0 评论 -
MySQL(InnoDB剖析):09---InnoDB的启动、关闭、恢复
一、概述InnoDB是MySQL的存储引擎之一,因此InnoDB的启动和关闭,更精确的是指在MySQL实例的启动过程中对InnoDB存储引擎的处理过程二、数据库的关闭(innodb_fast_shutdown参数)在数据库关闭时,参数innodb_fast_shutdown影响着表的存储引擎为InnoDB的行为 该参数的取值如下: 0:在MySQL数据库关闭时,InnoDB需要完成所......原创 2020-01-29 15:15:54 · 1598 阅读 · 0 评论 -
MySQL(InnoDB剖析):08---InnoDB关键特性(插入缓冲(Insert Buffer)、两次写(doublewrite)、自适应哈希索引(AHI)、异步IO(AIO)、刷新邻接页)
InnoDB关键特性包括:插入缓冲(Inster Buffer) 两次写(Double Write) 自适应哈希索引(Adaptive Hash Index) 异步IO(Async IO) 刷新邻接页(Flush Neighbor Page)一、插入缓冲下面介绍的插入缓冲有: Insert Buffer Change Buffer 聚集索引与辅助(非聚集/二级)......原创 2020-01-29 14:33:17 · 1106 阅读 · 0 评论 -
MySQL(InnoDB剖析):07---Master Thread(MySQL后台核心线程)
Master Thread通过前面介绍InnoDB体系架构我们知道,InnoDB存储引擎的主要工作都是在一个单独的后台线程Master Thread中完成的,本文就介绍该线程的具体实现以及该线程可能存在的问题一、InnoDB 1.0.x版本之前的Master ThreadMaster Thread具有最高的线程优先级别。其内部由多个循环(loop)组成: 主循环(loop)、后台循环......原创 2020-01-28 11:00:11 · 1619 阅读 · 0 评论