MySQL技术内幕InnoDB存储引擎-读书笔记
MySQL中MyISAM和InnoDB两种主流存储引擎的特点
MySQL中MyISAM和InnoDB两种主流存储引擎的特点⼀、数据库引擎(Engines)的概念 MySQ5.6L的架构图: MySQL的存储引擎全称为(Pluggable Storage Engines)插件式存储引擎。
MySQL的所有逻辑概念,包括SQL Interface、Parser、Optimizer、Caches和Buffers等,都需要真正转为物理层的实际数据的,怎么存或者以什么⽅式存的问题就需要存储引擎来实现。
存储引擎对关系型数据库来讲是⼀个⾮常重要的概念。
在MySQL中常⽤的⽂件系统有MyISAM、InnoDB、Federated、Archive、Merge、Memory等等。
其中MyISAM和InnoDB最为普遍。
简化的MySQL架构图(图⽚来⾃《⾼性能MySQL_第3版》): 下⾯对MySQL中MyISAM和InnoDB两种引擎做具体对⽐介绍。
⼆、安装MySQL 在CentOS7上的官⽅yum库已经将MySQL换成了MariaDB,要安装MySQL可以去MySQL的官⽹下载安装,安装⽅式有MySQL官⽅yum 源安装、源码编译安装、通⽤⼆进制三种⽅式。
下⾯以第三种⽅式(通⽤⼆进制)为例演⽰MySQL的安装步骤。
1.下载通⽤⼆进制格式的MySQL程序包并解压 通⽤⼆进制格式的程序包安装起来和yum安装同样⽅便快捷,直接解压再做初始化配置就能直接使⽤了,并且和系统耦合性低,很⽅便做数据迁移。
下载并解压 mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz ⾄ /usr/local/ 下~]# tar xf mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz -C /usr/local/ 解压后创建软连接:~]# cd /usr/local~]# ln -sv mysql-5.7.18-linux-glibc2.5-x86_64 mysql2.初始化MySQL添加mysql⽤户,修改 /usr/local/mysql ⽬录的⽤户权限,将属组改为root,属组改为mysql。
《MySQL45讲》读书笔记(三):内存数据刷盘机制
《MySQL45讲》读书笔记(三):内存数据刷盘机制此⽂为极客时间:MySQL实战45讲的12节的学习笔记⼀、mysql 的刷盘机制⽽之前提到过,mysql 使⽤了 WAL 技术,即更新的时候先更新内存中的数据,然后必要的时候再将内存中的数据刷⼊磁盘。
我们把内存中这些被修改过,跟磁盘中的数据页不⼀致的数据页称为脏页。
其中,有四种情况会触发脏页的刷盘:1. redo log 可写空间满了。
2. 内存满了,需要淘汰的数据页恰好是脏页。
3. 系统不繁忙的时候。
4. 关闭数据库的时候。
其中,第三种情况不会为系统带来过多影响的,第四中情况下不会在乎为系统带来的影响。
所以我们只需要关注第⼀和第⼆种情况:对于第⼆种情况,由于 mysql 的更新需要先写⽇志,所以当⽇志满了的情况下,所有的更新都会停⽌,⼀直到刷完盘⽇志腾出了空间为⽌;⽽对于第⼆种情况,当查询的数据在内存中的数据页没有的时候,就需要淘汰旧页释放内存以读⼊新页,所以当⼀次查询导致需要淘汰的脏页过多的时候,就需要先等待较长的刷盘时间,然后才能获取响应。
为了避免上述两种情况,必须要控制脏页在内存中的⽐例。
⼆、刷脏页的控制策略⾸先,我们必须要知道主机磁盘的写⼊能⼒有多强,这样 innodb 才可以知道它刷脏页的速度最快应该是多快。
我们可以通过设置innodb_io_capacity这个参数来告诉 innodb 磁盘的写⼊速度。
这个参数的值不宜过⼩,因为这会导致 innodb 错误的估计刷盘速度,最后导致刷脏页的速度跟不上脏页⽣成的速度。
innodb_io_capacity规定了刷脏页速度的极限,但是实际上磁盘不可能只服务这么⼀个功能,所以还需要参考 redo log 的刷盘速度和允许的内存中的脏页⽐例。
参数innodb_max_dirty_pages_pct是脏页⽐例上限,默认值是 75%。
innodb 会根据当前的脏页⽐例(假设为 M),算出⼀个范围在 0到 100 之间的数字,这个公式是F1(M)。
《Mysql技术内幕》读书笔记
《Mysql技术内幕》读书笔记第⼀章 MySql存储引擎1.Innodb存储引擎⽀持事务,其特点是⾏锁设计、⽀持外键。
Innodb是Mysql默认的存储引擎。
2.MyISAM存储引擎MyIsam存储引擎不⽀持事务和表锁设计,Myisam也不⽀持外键,但是⽀持全⽂索引。
第五章索引与算法1.常见的索引:B+树索引、全⽂索引、哈希索引。
2.B+树,是通过⼆叉查找树,再由平衡⼆叉树,B树演化⽽来。
⼆叉查找树⼆叉查找树:左⼦树的值总是⼩于根的值,右⼦树的值总是⼤于根的值。
可以通过中序遍历得到值的排序输出。
平均查找速度⽐顺序查找来得快。
平衡⼆叉树(AVL树)平衡⼆叉树:⾸先符合⼆叉查找树的定义,其次必须满⾜任何节点的两个⼦树的⾼度的最⼤差为1。
B+树B+树:是为磁盘或其他直接存取辅助设备设计的⼀种平衡树。
在B+树中,所有记录节点都是按键值对的⼤⼩顺序存放在同⼀层的叶⼦节点上,由各叶⼦节点指针进⾏连接。
优点:B+树的⾼度⼀般都在2--4层。
也就是查找某⼀键值的⾏记录时最多只需要2--4次IO就可以了。
B+树索引B+树索引,分为聚集索引和辅助索引。
聚集索引和辅助索引的区别:叶⼦节点存放的是否是⼀整⾏的信息。
聚集索引聚集索引:就是按照每张表的主键构造⼀颗B+树,同时叶⼦节点存放的即为整张表的⾏记录数据,也将聚集索引的叶⼦节点称为数据页。
辅助索引(⾮聚集索引)辅助索引:叶⼦节点并不包含⾏记录的全部数据。
叶⼦节点除了包含键值以外,每个叶⼦节点中的索引⾏中还包含了⼀个书签(bookmark)。
该书签⽤来告诉Innodb存储引擎哪⾥可以找到与索引相对应的⾏数据。
辅助索引的书签就是相应⾏数据的聚集索引键。
Cardinality值1.SHOW INDEX FROM 表名:该语句可以查看表的索引信息。
2.Cardinality值⾮常关键,优化器会根据这个值来判断是否使⽤这个索引。
对于性别,地区类型的字段,可取值的范围⼩,称为“低选择性”,没有必要使⽤B+树索引。
读书笔记-MySQL运维内参07-InnoDB数据存储结构
读书笔记-MySQL运维内参07-InnoDB数据存储结构表空间⽂件组成结构InnoDB存储引擎按照表空间进⾏管理。
在新建⼀个数据时,InnoDB存储引擎会初始化⼀个名为ibdata1的表空间⽂件。
默认情况下,这个⽂件会存储所有表的数据,以及我们所熟知但是看不到的SYS_TABLES, SYS_COLUMNS, SYS_INDEXES,SYS_FIELDS等。
此外,还⽤来存储保证数据完整性的的回滚端数据。
可以通过设置InnoDB_file_per_table来设置,使得每⼀个表都对应⼀个独⽴的表空间⽂件。
段段是表空间⽂件的主要组织结构,它是⼀个逻辑概念,⽤来管理物理⽂件,是构成索引、表、回滚段的基本元素。
创建⼀个索引(B+)树的同时,会创建两个段,分别是内节点段和叶⼦节点段。
索引数据量⼀直在增长过程中,所有新的存储空间的申请,都是从段这个逻辑概念中申请的。
更形象的说,ibd⽂件就是由多个端组成的,没有任何其他空间是脱离了段的管理的。
簇我们已经知道,⼀个索引由两个段组成,段是⼀个逻辑概念。
段中的组织结构师什么样⼦?InnoDB引⼊了簇的概念,在代码中是Extent。
簇是构成段的基本元素,⼀个段有若⼲个簇构成。
⼀个簇是物理上连续分配的⼀段空间,每⼀个段⾄少会有⼀个簇,在创建⼀个段时会创建⼀个默认的簇。
如果存储数据时,⼀个簇已经不⾜以存储更多的数据,此时需要从这个段中分配⼀个新的簇来存放新的数据。
簇的空间⼤⼩是固定的,⼀般是64个页。
⼀个索引由两个段组成,两个段之间的物理位置是没有关系的。
每个段由若⼲个簇组成,多个簇的物理位置也是没有关系的,但是会有指针连接。
页⾯我们已经知道段和簇的关系了。
但是簇的物理空间内部还需要继续被切分并⾼效管理。
页⾯就是簇被细分后的产物,它是组成簇的基本单位。
页⾯是段所管理的最⼩单位,也是数据库⽂件管理的最⼩单位,当然也是⽂件中空间分配的最⼩单位。
⼀个簇中可以包括多个页⾯,默认是64个。
MySQL技术内幕InnoDB存储引擎-读书笔记
MySQL技术内幕InnoDB存储引擎-读书笔记Powered by dyyx007/ajf8/home根据网友读书笔记整理原文参考/space.php?uid=24060319&do=blog&id=145389数据库与实例数据库静态的概念文件的集合数据日志错误配置等文件信息实例动态的概念进程线程和内存区域组成单进程多线程配置文件读取顺序/etc/f/etc/mysql/f/usr/local/mysql/etc/f/f没有找到配置文件MySQL会按照编译时的参数设置启动实例MySQL体系结构及主要存储引擎主要构成:连接池组件管理服务工具SQL接口查询分析器优化器缓冲插入式存储引擎物理存储文件各存储引擎特点InnoDB 后续会有详细介绍此处略过MyISAM 只缓存其索引文件数据库文件缓存由OS本身完成包括MYD和MYI文件通过myisampack解压缩数据文件(霍夫曼编码静态算法压缩) 压缩后只读NDB 集群存储引擎share nothing 数据全部放入内存主键查找速度很快JOIN操作在MySQL数据库层完成而非存储引擎复杂的连接操作需要巨大的网络开销Memory 表数据放入内存易失采用哈希索引只支持表锁并发性能较差不支持TEXT 和BLOB类型以定长空间存varchar注:MysQL使用Memory存储引擎作为临时表来存放SELECT中间结果集若结果集超过Memory存储引擎表容量设置或含有TEXT或BLOB类型将其转换为MyISAM存储引擎表存放到磁盘又因MyISAM不缓存数据文件因此这时产生的临时表的性能对于查询会有损失Archive 只支持INSERT和SELECT 可使用zlib算法进行压缩存储连接方式TCP/IP 基于网络的连接连接进行权限检查命名管道和共享内存Windows系统同一服务器上的两进程可通过命名管道连接需在配置文件中启用--enable-named-pipe选项使用共享内存方式需在f中添加--shared-memory 同时客户端使用--protocol=memory 选项Unix套接字客户端与服务端位于同一服务器时才可使用在f中指定-socket=/tmp/mysql.sock 连接时指定./mysql -S /tmp/mysql.sock主要内容InnoDB存储引擎体系结构和工作原理包括了InnoDB表的存储结构数据页结构分区表种类索引及算法锁事务等内容后台线程内存池show engine innodb status\G 查看运行情况后台线程默认7个4个IO thread 1个master thread 1个锁监控线程1个错误监控线程innodb_file_io_threads innodb_read_io_threads innodb_write_io_threadsInnoDB工作方式将数据文件按页(每页16K)读入InnoDB buffer pool 然后按最近最少使用算法(LRU)保留缓存数据通过一定频率将脏页刷新到文件缓存的数据页类型包括索引页数据页undo页insert buffer 自适应哈希索引InnoDB锁信息以及数据字典信息等master thread 优先级最高由主循环(loop) background loop flush loop和suspend loop组成double write自适应哈希索引InnoDB会监控表上索引的查找根据访问频率和模式为某些页建立哈希索引提高查询性能由InnoDB自动实现通过缓冲池B树构建数据库自优化哈希一般情况下查找时间复杂度为O(1) 常用于JOIN操作但只能用于等值查询启动关闭和恢复innodb_fast_shutdown影响InnoDB表关闭0 MySQL关闭时完成所有的full purge和merge insert buffer操作1 默认值只将缓冲池内的一些脏页刷新至磁盘2 将日志都写入日志文件不会有任何事务丢失但下次启动时会进行recoveryinnodb_force_recovery影响InnoDB的恢复状况默认为0 表示需恢复时执行所有的恢复操作若不能有效恢复则MySQL有可能宕机错误信息会被写入错误日志文件还有1~6等值MySQL中的文件包括参数文件日志文件(错误日志二进制日志慢查日志及查询日志等)socket文件(UNIX 本地连接mysql)pid文件(mysql的进程ID 参数pid_file)表结构文件(frm文件)存储引擎文件日志文件慢查日志记录的为大于long_query_time的慢查记录log_queries_not_using_indexes 查询日志涉及参数LOG GENERAL_LOG GENERAL_LOG_FILE二进制日志相关参数——max_binlog_size /binlog_cache_size /sync_binlog /binlog-do-db /binlog-ingore-db /log-slave-update和binlog_format事务型存储引擎会将所有未提交的二进制日志记录到一个缓存(大小由binlog_cache_size 默认32KB 基于SESSION)事务提交后将其中log写入二进制日志文件(可通过SHOW GLOBAL STA TUS查看binlog_cache(使用缓冲写二进制的次数)和binlog_cache_disk_use(使用临时文件写二进制的次数)状况判读binlog_cache_size合理与否)InnoDB默认事务隔离级别REPEATABLE READbinlog_format三种方式STA TEMENT ROW和MIXEDmysqlbinlog --start-datetime='' --base64-output=decode-rows -v mysql-bin.000001 > binlog.logInnoDB存储引擎文件1.表空间文件默认表空间文件为ibdata1文件innodb_data_file_path 存储数据innodb_file_per_table可以按表分别产生一个表空间.db文件仅存该表的数据索引和插入缓冲等信息其他信息如undo信息系统事务信息double write buffer等还是存放在默认表空间(ibdata1或表空间组)里2.重做日志文件ib_logfile1和ib_logfile2 记录了InnoDB存储引擎的事务日志至少一个redo log group 大小一致并以循环方式使用类似与Oracle四个参数innodb_log_file_size /innodb_log_files_in_group /innodb_mirrored_log_groups和innodb_log_group_home_dir(修改innodb_log_file_size 必须删除原有重做日志文件ib_logfile然后重启MySQL重新生产否则会报错)重做日志记录的关于每页(Page)的更改的物理情况(结构如下)Spaceid PageNo OpCode Data且在事务的过程中依然不断记录重做日志但是二进制日志是在事务提交时记录日志的Innodb_flush_log_at_trx_commit影响重做日志刷新至磁盘的时机推荐一篇文章/view/b9ac81c758f5f61fb7366643.html未明确指定主键先判断是否有非空唯一索引(UNIQUE NOT NULL) 若有则将其默认为主键否则创建一个6字节的ROWID逻辑存储结构tablespace->segment->extent->page行记录格式Compact行格式Redundant行格式Compressed与Dynamic行记录格式Compact Redundant 对于varchar中NULL在列记录中只占NULL标志位不占实际存储空间但对于char中的NULL 两者的处理是不同的Compact格式char中NULL同样不占存储空间而Redundant下占存储空间行记录中还包括两个隐藏列事务ID列(6字节)和回滚指针列(7字节) 若没有定义的Primary Key 会增加一个6字节的RowID列InnoDB在页内部是通过一种链表方式串联各个行记录的。
MySQL数据库各种存储引擎及其作用简介(精)
MySQL数据库各种存储引擎及其作用简介本文我们主要介绍一下MySQL数据库的存储引擎,MySQL有多种存储引擎:MyISAM、InnoDB、MERGE、MEMORY(HEAP、BDB(BerkeleyDB、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。
MySQL支持数个存储引擎作为对不同表的类型的处理器。
MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎:MyISAM管理非事务表。
它提供高速存储和检索,以及全文搜索能力。
MyISAM在所有MySQL配置里被支持,它是默认的存储引擎,除非你配置MySQL 默认使用另外一个引擎。
MEMORY存储引擎提供“内存中”表。
MERGE存储引擎允许集合将被处理同样的MyISAM表作为一个单独的表。
就像MyISAM一样,MEMORY和MERGE存储引擎处理非事务表,这两个引擎也都被默认包含在MySQL中。
注释:MEMORY存储引擎正式地被确定为HEAP引擎。
InnoDB和BDB存储引擎提供事务安全表。
BDB被包含在为支持它的操作系统发布的MySQL-Max二进制分发版里。
InnoDB也默认被包括在所有MySQL 5.1二进制分发版里,你可以按照喜好通过配置MySQL来允许或禁止任一引擎。
EXAMPLE存储引擎是一个“存根”引擎,它不做什么。
你可以用这个引擎创建表,但没有数据被存储于其中或从其中检索。
这个引擎的目的是服务,在MySQL源代码中的一个例子,它演示说明如何开始编写新存储引擎。
同样,它的主要兴趣是对开发者。
NDB Cluster是被MySQL Cluster用来实现分割到多台计算机上的表的存储引擎。
它在MySQL-Max 5.1二进制分发版里提供。
这个存储引擎当前只被Linux, Solaris, 和Mac OS X 支持。
在未来的MySQL分发版中,我们想要添加其它平台对这个引擎的支持,包括Windows。
《快速念咒:MySQL入门指南与进阶实战》笔记
《快速念咒:MySQL入门指南与进阶实战》阅读记录1. 第一章数据库基础在开始学习MySQL之前,了解一些数据库的基础知识是非常重要的。
数据库是一个用于存储和管理数据的计算机软件系统,它允许用户通过关键字或特定的查询语言来检索、更新和管理数据。
在数据库中,数据是以表格的形式进行组织的,每个表格都包含了一组相关的数据项,这些数据项被称为记录。
表(Table):表是数据库中存储数据的基本单位。
每个表都有一个唯一的名称,并由行(Row)和列(Column)组成。
每一行代表一个数据记录,每一列代表一个特定的数据属性。
字段(Field):字段是表中的一列,代表了数据的一种属性。
每个字段都有一个唯一的名称和一个数据类型,用于定义该字段可以存储的数据种类。
主键(Primary Key):主键是表中的一个特殊字段,用于唯一标识表中的每一行记录。
主键的值必须是唯一的,且不能为NULL。
外键(Foreign Key):外键是一个表中的字段,它的值引用了另一个表的主键值。
外键用于建立两个表之间的联系,确保引用完整性。
索引(Index):索引是一种数据库优化技术,用于提高查询性能。
通过创建索引,数据库可以更快地定位到表中的特定记录,而不必扫描整个表。
SQL(Structured Query Language):SQL是用于与数据库进行交互的编程语言。
它包括用于数据查询、插入、更新和删除的操作符和语法结构。
理解这些基本概念是学习MySQL的前提。
通过掌握SQL语言的基本语法和操作,你将能够有效地管理和操作数据库中的数据。
在接下来的章节中,我们将深入探讨MySQL的具体应用,包括如何创建和管理数据库、表、以及如何执行复杂的查询操作。
2. 第二章数据库设计《快速念咒:MySQL入门指南与进阶实战》是一本全面介绍MySQL 数据库的书籍,其中第二章详细阐述了数据库设计的基础知识和实践技巧。
在这一章节中,作者首先介绍了数据库设计的基本概念和目标,包括数据模型、实体关系模型(ER模型)等,并解释了如何通过这些模型来描述现实世界中的数据和业务逻辑。
读书笔记Mysql是怎样运行的
读书笔记Mysql是怎样运⾏的| Mysql是怎样运⾏的⼀、mysql基本知识1. 查看表的基本信息show table status使⽤show table status like tableName可以查看指定表的基本信息,包括存储引擎,⾏格式等2. MySQL数据类型的⼤⼩tinyint1字节int,integer4字节bigint8字节float4字节double8字节varchar(n)表⽰n个字符,⽆论汉字和英⽂,Mysql都能存⼊n个字符,仅是实际字节长度有所区别char(n),定长,表⽰该列占⽤n个字符,根据不同的字符集,实际占⽤字节⼤⼩不⼀样对于定长字符集如ascii,char(n)固定占⽤n个字节,如果实际数据不⾜n个字节,会在末尾补上空字符(0x00)对于变长字符集如utf8(1~3),gbk(1~2),也会在变长字段长度列表中存储该列的长度3. update的⼤致流程⼆、InnoDB记录存储结构InnoDB中数据的存储是在磁盘上的,⽽数据处理的过程则在内存中.InnoDB将数据划分为若⼲个页,以页作为磁盘和内存之间交互的基本单位,InnoDb中页的⼤⼩⼀般为16KB拓展阅读:1. InnoDB⾏格式1-1. InnoDB中的⾏格式类别1. compact,version 5.6 默认使⽤2. redundant,3. dynamic,version 5.7默认使⽤4. compressed1-2. 如何指定⾏格式CREATE TABLE 表名 (列的信息) ROW_FORMAT=⾏格式名称ALTER TABLE 表名 ROW_FORMAT=⾏格式名称1-3. 各种⾏格式的区别1-3-1. compact⾏格式compact⾏格式的内容:变长字段⻓度列表+ NULL列表+ 记录头信息+ 列值1-3-1-1. 变长字段⻓度列表在mysql中,变长字段中存储多少字节的数据是不固定的,所以在存储时,需要将这些数据占⽤的字节数也存起来,所以这些变长字段占⽤的存储空间分为两部分:1.真正的数据内容2.字段的长度在compact⾏格式中,把所有变长字段的真实数据占⽤的字节长度都存放在记录的开头部位,从⽽形成⼀个变长字段长度列表,各变长字段数据占⽤的字节数按照列的顺序逆序存放.注意,如果某个变长字段内容为null,是不会放⼊这个列表中的,⽽是放在了NULL列表中.字段的长度⽤1或2个字节表⽰,具体规则如下:当字段最⼤长度 <= 255字节时⽤⼀个字节表⽰字段最⼤长度 > 255,但实际使⽤字节 <= 127,也使⽤1个字节表⽰其他情况使⽤2个字节表⽰1-3-1-2. NULL列表存储每条记录中允许为NULL的字段,将实际为NULL的字段⽤1表⽰,实际不为NULL的字段⽤0表⽰,也是逆序存放,每个允许为NULL的列⽤⼀个位来表⽰,如果记录中所有的列都不允许为null,则null列表就不存在.MySQL规定NULL值列表必须⽤整数个字节的位表⽰,如果使⽤的⼆进制位个数不是整数个字节,则在字节的⾼位补0.1-3-1-3. compact记录头信息5字节记录头信息由5个字节组成,也就是40个⼆进制位名称⼤⼩(bit)描述预留位11没有使⽤预留位21没有使⽤delete_mask1表⽰该记录是否被删除min_rec_mask1B+树的每层⾮叶⼦节点中的最⼩记录都会添加该标记n_owned4表⽰当前页⽬录中拥有的记录数heap_no13表⽰当前记录在本⻚中的位置,因为页中会⾃动记录最⼩记录和最⼤记录,分别放在第0位和第1位,所以⽤户添加的记录在页中的位置是从2开始的record_type3表⽰当前记录的类型,0表⽰普通记录,1表⽰B+数⾮叶⼦节点记录,2表⽰最⼩记录,3表⽰最⼤记录next_record16表⽰从当前记录的真实数据到下⼀条记录的真实数据的地址偏移量1-3-1-4. 列值MySQL⾃动添加的隐藏列MySQL会为每个记录添加⼀些隐藏列,如DB_ROW_ID,DB_TRX_ID,DB_ROLL_POINTER,具体情况如下:列名是否必须占⽤空间描述row_id否6字节⾏ID,当我们创建的表中没有明确指定主键,且表中没有unique修饰的列时,会⾃动创建这个列,⽤来唯⼀标识⼀条记录transaction_id是6字节事务IDroll_pointer是7字节回滚指针列名是否必须占⽤空间描述⾏溢出数据在compact和redundant⾏格式中,对于占⽤存储空间⾮常⼤的列,在记录的真实数据处只会存储该列的⼀部分数据,把剩余的数据分散存储在⼏个其他的页中,然后记录的真实数据处⽤20个字节存储指向这些页的地址,dynamic⾏格式对于⾮常⼤的数据,会把它的全部数据存储到其他页中,然后在记录的真实数据处存储这些页的地址1-3-2. redundant⾏格式redundant⾏格式是MySQL5.0之前⽤的⼀种⾏格式,字段长度偏移列表+ 记录头信息+ 列值1-3-2-1. 字段长度偏移列表redundant⾏格式会把记录中所有列的长度信息都按照逆序存储到字段长度偏移列表中.⽽且存储长度的⽅式是采⽤相邻数值的差值来计算各个列值得长度1-3-2-2. redundant记录头信息6字节与compact⾏格式的记录头信息对⽐来看,有两处不同:1. redundant⾏格式多了n_field和1byte_offs_flagn_field:表⽰记录中列的数量1byte_offs_flag:标记字段长度偏移列表中的偏移量是使⽤1字节还是2字节表⽰的2. redundant⾏格式没有record_type属性1-3-2-3. redundant中null的处理如果变长数据类型的列值为null,则在字段长度偏移列表中记录偏移量为0即可,也就是会重复上⼀个偏移量的值,不⽤占⽤记录的真实数据部分如果存储null值的字段是char(M)数据类型的,则占⽤记录的真实数据部分,并把该字段对应的数据使⽤0x00字节填充.1-3-2-4. 列值和compact类似1-3-3. dynamic⾏格式和compressed⾏格式这两种⾏格式类似于compact⾏格式,只不过在处理⾏溢出数据时有点不⼀样,它们把该列的所有字节都存储到其他页上,只在记录的真实数据处存储其他页的地址,另外compressed⾏格式会采⽤压缩算法对页⾯进⾏压缩.2. InnoDB数据页结构2-1. 常见的数据页类型1. 存放表空间头部信息的页2. 存放insert buffer信息的页3. 存放inode信息的页4. 存放undo⽇志信息的页5. 存放记录的页(索引页)2-2. 索引页2-2-1. 索引页结构名称中⽂名占⽤空间简单描述File Header⽂件头部38字节页的⼀些通⽤信息(上⼀页,下⼀页等) Page Header页⾯头部56字节数据页专有的⼀些信息Infinum + Supremun最⼩记录和最⼤记录26字节两个虚拟的⾏记录User Records⽤户记录动态改变实际存储的⾏记录内容Free Space空间空间动态改变页中尚未使⽤的空间Page Directory页⽬录动态改变页中的某些记录的相对位置File Trailer⽂件尾部8字节校验页是否完整2-2-1-1. File Header⽂件头部38字节⽂件头部的组成部分名称占⽤空间(字节)描述fil_page_space_or_chksum4页的校验和fil_page_offset4页号fil_page_prev4上⼀页的页号fil_page_next4下⼀页的页号fil_page_lsn8页被最后修改时对应的⽇志序列位置(Log Sequence Number)fil_page_type2当前页的类型fil_page_file_flush_lsn8仅在系统表空间的⼀个页中定义,代表⽂件⾄少被刷新到了对应的lsn值fil_page_arch_log_no_or_space_id4页属于哪个表空间名称占⽤空间(字节)描述fil_page_type当前页的类型:类型名称⼗六进制描述fil_page_type_allocated0x0000最新分配,还没使⽤fil_page_undo_log0x0002Undo⽇志⻚fil_page_inode0x0003段信息节点fil_page_ibuf_free_list0x0004Insert Buffer空闲列表fil_page_ibuf_bitmap0x0005Insert Buffer位图fil_page_type_sys0x0006系统页fil_page_type_trx_sys0x0007事务系统数据fil_page_type_fsp_hdr0x0008表空间头部信息fil_page_type_xdes0x0009扩展描述页fil_page_type_blob0x000A blob页fil_page_index0x45BF索引页,也就是我们所说的数据页2-2-2. Page Header页⾯头部56字节名称占⽤空间(字节)描述page_n_dir_slots2本页中页⽬录的数量page_heap_top2还未使⽤的空间的最⼩地址,也就是说从该地址之后就是Free Spacepage_n_heap2本页中记录的数据(包括最⼩和最⼤记录以及被标记为删除的记录)page_free2第⼀个被标记为删除的记录地址(各个已删除的记录通过next_record也会组成⼀个单链表,这个单链表中的记录可以被重新利⽤)page_garbage2已删除记录占⽤的字节数page_last_insert2最后插⼊记录的位置page_derection2记录插⼊的⽅向page_n_direction2⼀个⽅向连续插⼊的记录数量page_n_recs2该页中记录的数量(不包括最⼩和最⼤记录以及被标记为删除的记录)page_max_trx_id8修改当前页的最⼤事务ID,该值仅在⼆级索引中定义page_level2当前页在B+树中所处的层级page_index_id8索引ID,表⽰当前页属于哪个索引page_btr_seg_leaf10B+树叶⼦段的头部信息,仅在B+树的Root页定义page_btr_seg_top10B+树⾮叶⼦段的头部信息,仅在B+树的Root页定义2-2-2-1. 页⽬录Page Derectory页⽬录的作⽤页⽬录将页中记录按顺序划分为⼏组,并在页⽬录中记录每组的中的最⼤值,这样就可以通过⼆分查找法快速定位要查找⽬标所在的组,然后遍历该组中数据即可查到.页⽬录的划分规则对于最⼩记录所在的分组只能有⼀条记录,最⼤记录所在的分组可有有1~8条记录,其他分组中可以有4~8条记录.⼀开始数据页中只有最⼩纪录和最⼤记录两个记录,它们分属于两个分组之后每插⼊⼀条记录,都会从⻚⽬录中找到主键值⽐本记录的 主键值⼤并且差值最⼩的槽,然后把该槽对应的记录的 n_owned值加1,表⽰本组内⼜添加了⼀条记录,直到该组中 的记录数等于8个在⼀个组中的记录数等于8个后再插⼊⼀条记录时,会将组中 的记录拆分成两个组,⼀个组中4条记录,另⼀个5条记录。
MySQL中的存储引擎及其特性对比
MySQL中的存储引擎及其特性对比数据库是我们常用的数据存储和管理工具之一,而MySQL作为一种强大的关系型数据库管理系统,广泛应用于各类应用开发中。
而MySQL中的存储引擎则是数据库存储和管理的核心组件之一。
本文将介绍MySQL中常用的几种存储引擎,包括InnoDB、MyISAM、MEMORY以及更多其他类型的引擎,并对它们的特性进行对比分析。
1. InnoDB引擎:InnoDB是MySQL的一个事务性存储引擎,支持ACID(原子性、一致性、隔离性、持久性)事务,以及行级锁定和外键约束等功能。
它是MySQL 5.5版本起的默认存储引擎。
InnoDB引擎的特点:- 支持事务处理:InnoDB具有非常强大的事务处理能力,可以确保数据的完整性和一致性。
- 支持行级锁定:InnoDB采用了行级锁定机制,可以大大提高多用户并发操作时的性能。
- 支持外键约束:InnoDB可以定义外键来维护多个表之间的完整性关系。
- 支持崩溃恢复功能:InnoDB具有自动崩溃恢复和日志功能,可以保证数据库在异常终止后的可靠恢复。
2. MyISAM引擎:MyISAM是MySQL最早的存储引擎之一,它不支持事务处理和行级锁定,但在一些特定场景下仍然有其独特的优势。
MyISAM引擎的特点:- 较高的性能:MyISAM不支持事务处理和行级锁定,这使得它在某些读写比例较低、对性能要求较高的应用中表现得更加出色。
- 支持全文搜索:MyISAM支持全文索引功能,可以快速进行全文搜索。
- 表级锁定:MyISAM使用表级锁定,这在多用户并发操作时可能导致一些性能上的瓶颈。
3. MEMORY引擎:MEMORY引擎将数据存储在内存中而不是磁盘上,所以在某些特定场景下可以获得更高的性能表现,但同时也有其局限性。
MEMORY引擎的特点:- 高速读写:由于数据存储在内存中,所以MEMORY引擎具有非常高的读写速度。
- 不支持事务处理和持久性:MEMORY引擎不支持事务处理和持久性,数据在数据库服务重启后将丢失。
MySQL技术内幕:InnoDB存储引擎(第2版)
5.2.1 二分 查找法
5.2.2 二叉 查找树和平
衡二叉树
5.2 数据结构与算法
5 索引与算法
5.3 B+树
5.3.1 B+树的插 入操作
A
5.3.2 B+树的删 除操作
B
5 索引与算法
01
5.4.1 聚集索 引
04
5.4.4 B+树 索引的管理
02
5.4.2 辅助索 引
03
5.4.3 B+树 索引的分裂
4.3.2 Redundant行记录格 式
4.3.4 Compressed和 Dynamic行记录格式
4表
0 1
4.4.1 File Header
0 4
4.4.4 User Record和 Free Space
0 2
4.4.2 Page Header
0 5
4.4.5 Page Directory
0 3
10.2 InnoDB源代码
21%
结构
10.1 获取InnoDB
存储引擎源代码
15%
10.3.1 Windows下的调试 10.3.2 Linux下的调试
2020
感谢聆听
4.4.3 Infimum 和Supremum
Record
0 6
4.4.6 File Trailer
4.4 InnoDB数据页结构
4.6.1 数据完整 性
4.6.4 对错误数 据的约束
4表
4.6 约束
4.6.2 约束的创 建和查找
4.6.5 ENUM和 SET约束
4.6.3 约束和索 引的区别
4.6.6 触发器与 约束
数据库存储引擎的工作原理与性能分析
数据库存储引擎的工作原理与性能分析概述数据库存储引擎是数据库管理系统(DBMS)的核心组件之一,负责处理数据的存储和检索。
不同的存储引擎具有不同的工作原理和性能特点。
本文将介绍几种常见的数据库存储引擎,包括关系型数据库存储引擎InnoDB和MyISAM,以及非关系型数据库存储引擎MongoDB。
一、关系型数据库存储引擎InnoDBInnoDB是MySQL数据库的默认存储引擎,它采用了多版本并发控制(MVCC)的机制来实现高并发的读写操作。
InnoDB将数据存储在表空间中,并通过行级锁定实现高效的并发控制。
它的核心特点包括事务支持、行级锁定、外键约束等。
工作原理:1. 事务支持:InnoDB支持ACID(原子性、一致性、隔离性和持久性)特性,通过将修改的数据存储在日志中实现事务的原子性和持久性。
2. 并发控制:InnoDB使用多版本并发控制(MVCC)来处理并发读写操作。
它通过在每个数据行中存储创建和删除的时间戳来实现非阻塞的读操作。
3. 锁定机制:InnoDB采用了行级锁定机制,使得多个事务可以并发地修改不同的数据行,从而提高了并发性能。
同时,InnoDB还支持共享锁和排他锁的控制方式。
4. I/O优化:InnoDB使用了缓冲池(buffer pool)来减少磁盘I/O操作。
缓冲池可以存储热点数据和索引,从而提高数据的访问速度。
性能分析:1. 高并发性能:InnoDB的行级锁定和MVCC机制使得它具有较高的并发性能。
它能够有效地处理大量的并发读和写操作。
2. 数据一致性:InnoDB的事务支持和外键约束保证了数据的一致性。
它能够提供强大的数据完整性和可靠性。
3. 高可靠性:InnoDB通过将修改的数据持久化到日志中,确保了事务的持久性。
即使在发生故障时,数据库也能够恢复到一致的状态。
4. 内存消耗较大:InnoDB使用缓冲池来优化磁盘I/O操作,但它需要占用一定的内存空间。
在处理大量数据时,需要合理配置缓冲池的大小。
MySQL存储引擎InnoDB的原理和优化方法
MySQL存储引擎InnoDB的原理和优化方法1. 引言MySQL是一个广泛使用的关系型数据库管理系统,而存储引擎是MySQL数据库的核心组件之一。
MySQL的默认存储引擎是InnoDB,它具有高度的可靠性和可扩展性,被广泛应用于各种企业级应用和互联网系统。
本文将从InnoDB的原理和优化方法两个方面来讨论。
2. InnoDB的原理InnoDB是支持事务和行级锁的存储引擎,它将数据存储在聚簇索引上的B+树中。
聚簇索引是按照主键的顺序来组织数据的,这样可以极大地提高查询性能。
同时,InnoDB还支持辅助索引,以加快查询操作。
InnoDB的事务支持是通过多版本并发控制(MVCC)来实现的。
MVCC可以提高并发性能,同时保证数据的一致性。
当一个事务开始时,InnoDB会为其创建一个独立的视图,该视图包含了事务开始时数据库的快照。
在事务执行过程中,InnoDB会根据事务的隔离级别来解决不同的并发冲突,以保证数据库的一致性。
InnoDB还支持行级锁定,它可以大大提高并发性能。
行级锁定允许多个事务同时读取同一张表中的不同行,而不会互相阻塞。
当一个事务要修改某一行时,InnoDB会为该行加上排它锁,这样其他事务就不能读取和修改该行,从而避免了数据的不一致性。
3. InnoDB的优化方法InnoDB的性能优化一直是数据库管理员和开发人员关注的焦点。
下面将介绍一些常用的InnoDB优化方法。
3.1 合理设置缓冲池InnoDB的缓冲池是一个重要的性能优化参数,它用于缓存数据和索引的页面。
合理设置缓冲池的大小可以减少磁盘IO,提高查询和更新的性能。
通常建议将缓冲池的大小设置为物理内存的70%-80%。
3.2 优化SQL语句编写高效的SQL语句是优化数据库性能的关键。
可以通过合理设计数据库模式、创建适当的索引、避免使用全表扫描等方法来减少不必要的开销。
同时,可以使用MySQL的Explain命令来分析SQL语句的执行计划,从而找出潜在的性能问题。
mysql常用的存储引擎以及各个使用场景
mysql常用的存储引擎以及各个使用场景MySQL是一种常用的关系型数据库管理系统,支持多种存储引擎。
不同的存储引擎有不同的特点和适用场景,根据不同的需求选择合适的存储引擎可以提高数据库的性能和扩展性。
下面将介绍几种常用的MySQL存储引擎及其各自的使用场景。
1. InnoDB引擎InnoDB是MySQL的默认存储引擎,它是一个事务安全的存储引擎,支持ACID事务,并且具有高性能和高并发性能。
InnoDB还支持行级锁定和外键约束,并且具有很好的崩溃恢复能力。
由于其强大的事务特性和并发性能,InnoDB适用于需要高可靠性和高性能的应用场景,如电子商务网站、金融系统等。
2.MyISAM引擎MyISAM是MySQL的另一个常用存储引擎,它是一种非事务性的存储引擎。
MyISAM具有较高的性能和较低的存储空间占用,适用于静态数据或只读数据的应用场景。
MyISAM还支持全文索引,适用于需要进行全文的应用。
然而,MyISAM不支持事务和行级锁定,并且在并发写入时会出现锁表的情况,因此不适用于高并发的写入场景。
3.MEMORY引擎MEMORY引擎是MySQL的一种内存存储引擎,将表和索引数据存储在内存中,因此具有非常高的访问速度。
MEMORY引擎适用于对读写速度要求很高的应用,如缓存表、临时表等。
然而,由于数据存储在内存中,因此在数据库重启时会丢失数据,不适用于持久化数据。
4.ARCHIVE引擎ARCHIVE引擎是MySQL的一种归档存储引擎,适用于存储大量的历史数据。
ARCHIVE引擎具有较高的压缩比和较低的存储空间占用,适用于存储需要长期保留但不经常访问的数据。
然而,ARCHIVE引擎不支持索引和事务,仅支持追加操作,因此不适用于需要频繁查询和更新的场景。
5.NDB引擎NDB引擎是MySQL Cluster的存储引擎,是支持分布式高可用架构的存储引擎。
NDB引擎具有高可靠性和高性能,并且支持事务和并发性。
NDB引擎适用于分布式数据库集群的存储,可以提供高可扩展性和高可用性。
MyISAM引擎和InnoDB引擎介绍及应用场景
MyISAM引擎和InnoDB引擎介绍及应用场景MyISAM引擎是MySQL的默认存储引擎,它以表为基本单位进行数据存储,使用了众多优化技术来提高读写操作的性能。
MyISAM引擎的设计目标是提供高效的读取速度,适用于读取频繁、写入较少的场景。
以下是MyISAM引擎的一些特点和应用场景:1.性能高:MyISAM引擎在读取操作上具有较高的性能,可以快速返回查询结果。
它使用了B+树索引结构,适用于单次查询范围小的场景。
2.不支持事务处理:MyISAM引擎不支持事务处理,也就是说不支持ACID特性(原子性、一致性、隔离性和持久性)。
这意味着在发生错误时无法保证数据的完整性。
3.表级锁定:MyISAM引擎使用表级锁定,这意味着在执行写入操作时会锁定整个表,会导致并发写入的性能瓶颈。
4.适合读多写少的场景:由于MyISAM引擎在写入操作上性能较低且不支持事务,所以适合数据读取频繁、写入较少的应用场景,如网站的文章浏览、商品列表等。
InnoDB引擎是MySQL的另一个常用存储引擎,它是一个事务安全的存储引擎,使用了行级锁定和MVCC(多版本并发控制)来提供更高的并发性和数据完整性。
以下是InnoDB引擎的一些特点和应用场景:1. 支持事务处理:InnoDB引擎支持事务处理,可以保证数据的原子性、一致性、隔离性和持久性。
这使得InnoDB引擎适用于需要保证数据完整性的应用场景,如银行系统、电子商务平台等。
2. 行级锁定:InnoDB引擎使用行级锁定,这意味着在执行写入操作时只锁定需要操作的行,而不是整个表。
这样可以保证并发写入的性能。
3. 支持外键约束:InnoDB引擎支持外键约束,可以在表与表之间建立关系,保证数据的完整性和一致性。
4. 适合高并发的场景:由于InnoDB引擎支持事务和行级锁定,可以提供更高的并发性能和数据完整性,因此适合高并发读写的应用场景,如论坛、社交网络等。
在实际的应用中,我们可以根据具体的需求选择合适的存储引擎。
MySQL内核:InnoDB存储引擎(卷1)
6 存储管理
6.4.1 异步I/O数 据结构
A
6.4.2 异步I/O线 程
B
6.4 异步I/O
07
O
N
E
7 记录
7 记录
0 1
7.1 相关文 件
0 4
7.4 逻辑记 录
0 2
7.2 概述
0 5
7.5 记录之 间的比较
0 3
7.3 物理记 录
0 6
7.6 行记录 版本
7 记录
7.7 小 结
7.8 思 考题
MySQL内核: InnoDB存储引擎( 卷1)
演讲人 2 0 2 1 - 11 - 11
01
O
N
E
1 概览
1 概览
0 1
1.1 InnoDB 存储引擎历史
0 4
1.4 代码编 译
0 2
1.2 源码版 本
0 5
1.5 阅读源 码次序
0 3
1.3 源码风 格
0 6
1.6 思考题
1 概览
1.7 继续阅读
1
9.6.2 加 锁过程
2
9.6 加锁操作
01
02
03
04
05
06
9.1 相关文 件
2018
9.3 InnoDB 存储引擎中锁 的类型与算法
2020
9.5 显式锁 和隐式锁
2022
9锁
9.7 行 锁的维护
9.10 小 结
9.8 自 增锁
9.11 思 考题
9.9 死性
9.2.2 事务的隔
离级别
9.2.3 幻读
3
3.3.3 wait array
3.3.2 rwlock
Mysql存储引擎详解(MyISAM与InnoDB的区别)(转)
Mysql存储引擎详解(MyISAM与InnoDB的区别)(转)存储引擎MySQL中的数据⽤各种不同的技术存储在⽂件(或者内存)中。
这些技术中的每⼀种技术都使⽤不同的存储机制、索引技巧、锁定⽔平并且最终提供⼴泛的不同的功能和能⼒。
通过选择不同的技术,你能够获得额外的速度或者功能,从⽽改善你的应⽤的整体功能。
存储引擎是基于表的,⽽⾮数据库。
Mysql存储引擎有哪些MyISAM: MyISAM不⽀持事务和⾏级锁,所以MyISAM引擎速度很快,性能优秀。
MyISAM可以对整张表加锁,⽀持并发插⼊,⽀持全⽂索引。
InnoDB :5.5版本后Mysql的默认数据库,是专为事务设计的存储引擎,⽀持ACID事务,⽀持外键和⾏级锁定,拥有⾼并发处理能⼒。
但是,InnoDB在创建索引和加载数据时,⽐MyISAM慢。
BDB:源⾃Berkeley DB,事务型数据库的另⼀种选择,⽀持COMMIT和ROLLBACK等其他事务特性Memory :所有数据置于内存,表结构不是存储在内存中的存储引擎,查询时不需要执⾏磁盘I/O操作,所以要⽐MyISAM和InnoDB快很多倍。
但是会占⽤和数据量成正⽐的内存空间。
并且其内容会在Mysql重新启动时丢失,表结构不会丢失.Merge :将⼀定数量的MyISAM表联合⽽成⼀个整体,在超⼤规模数据存储时很有⽤Archive :⾮常适合存储⼤量的独⽴的,作为历史记录的数据。
因为它们不经常被读取。
Archive拥有⾼效的插⼊速度,但其对查询的⽀持相对较差Federated:将不同的Mysql服务器联合起来,逻辑上组成⼀个完整的数据库。
⾮常适合分布式应⽤Cluster/NDB :⾼冗余的存储引擎,⽤多台数据机器联合提供服务以提⾼整体性能和安全性。
适合数据量⼤,安全和性能要求⾼的应⽤CSV:逻辑上由逗号分割数据的存储引擎。
它会在数据库⼦⽬录⾥为每个数据表创建⼀个.CSV⽂件。
这是⼀种普通⽂本⽂件,每个数据⾏占⽤⼀个⽂本⾏。
了解MySQL存储引擎的选择与调优
了解MySQL存储引擎的选择与调优随着互联网的发展与数据规模的不断增大,数据库的选择与调优变得至关重要。
MySQL作为目前最流行的关系型数据库之一,其存储引擎的选择和调优对于数据库的性能和稳定性具有重要影响。
本文将介绍MySQL的几种常见存储引擎,并探讨如何选择和调优这些存储引擎以提高数据库的性能。
一、InnoDB存储引擎InnoDB是MySQL默认的事务型存储引擎,它具有良好的事务支持和并发控制能力。
InnoDB采用了行级锁,使得多个用户可以同时对数据库进行读写操作,提高了并发性能。
此外,InnoDB还支持ACID事务和崩溃恢复,确保了数据的一致性和可靠性。
在选择存储引擎时,InnoDB适合处理具有复杂关系和事务操作的大型数据库。
它能够提供高度的数据完整性和可靠性,但由于其复杂性,对硬件资源的要求更高。
因此,在面对大量读写操作的场景下,需要进行相应的调优以提高性能。
调优InnoDB存储引擎包括以下几个方面:1. 配置适当的缓冲区大小:InnoDB通过使用内存缓冲池来加速数据读写的操作。
通过调整innodb_buffer_pool_size 参数的值,可以控制InnoDB使用的内存大小,使其适应数据库的需求。
通常,将该值设置为物理内存的70%-80%可以获得比较理想的性能。
2. 合理设置存储引擎参数:InnoDB还具有一些其他的配置参数,如innodb_log_file_size、innodb_flush_method等。
这些参数的合理设置可以更好地适应不同的应用场景,提高数据库的性能。
3. 优化表结构和索引:合理的表结构和索引设计可以显著提高InnoDB的查询性能。
在设计表结构时应避免过度规范化,合理定义字段的类型和长度。
同时,根据实际查询需求,添加适当的索引可以减少全表扫描的操作,提高查询效率。
二、MyISAM存储引擎MyISAM是MySQL的一种典型非事务型存储引擎,它的特点是简单、高效。
MySQL常用存储引擎说明
MySQL常用存储引擎说明MySQL支持多种存储引擎,每种引擎都有其特定的使用场景和优点。
下面详细介绍几种常用的MySQL存储引擎及其实现。
1.InnoDB存储引擎InnoDB是MySQL的默认存储引擎,它提供了事务支持、集群和复制等功能。
InnoDB使用多版本并发控制(MVCC)来支持高并发访问,并使用缓冲池来缓存磁盘上的数据,以提高查询效率。
InnoDB还支持外键约束,可以方便地进行数据关联操作。
InnoDB的物理存储格式是表空间(tablespace),表空间由若干个数据文件组成,每个数据文件的大小可以不同,通常为1GB到10GB之间。
InnoDB还支持在线备份和恢复,可以通过使用工具进行备份和恢复数据。
2.MyISAM存储引擎MyISAM是另一种常见的MySQL存储引擎,它的特点是查询性能高,但不支持事务。
MyISAM的物理存储格式是静态的,每个表由一个或多个.frm文件组成,文件大小固定,通常为1GB左右。
MyISAM不支持外键约束,但可以通过其他方式实现数据关联。
MyISAM还支持全文索引,可以用于文本数据的搜索和分类。
MyISAM的查询效率较高,因为它使用索引来加速查询操作。
MyISAM还支持压缩和空间函数,可以减少存储空间和提高查询效率。
3.MEMORY存储引擎MEMORY存储引擎将数据存储在内存中,因此具有非常快的访问速度。
然而,它的数据是易失性的,并且在MySQL服务器重启后会丢失。
MEMORY存储引擎支持行级锁和并发控制,可以用于缓存经常访问的数据,以提高查询效率。
MEMORY存储引擎还支持全文索引和空间函数,可以用于文本数据的搜索和分类。
需要注意的是,由于数据存储在内存中,因此使用MEMORY存储引擎需要限制数据的大小,以避免内存溢出和性能问题。
4.Archive存储引擎Archive存储引擎主要用于存档和压缩大量不需要修改的数据。
它不支持事务和行级锁。
Archive存储引擎使用gzip算法进行数据压缩,以减少存储空间占用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MySQL技术内幕InnoDB存储引擎-读书笔记Powered by dyyx007/ajf8/home根据网友读书笔记整理原文参考/space.php?uid=24060319&do=blog&id=145389数据库与实例数据库静态的概念文件的集合数据日志错误配置等文件信息实例动态的概念进程线程和内存区域组成单进程多线程配置文件读取顺序/etc/f/etc/mysql/f/usr/local/mysql/etc/f/f没有找到配置文件MySQL会按照编译时的参数设置启动实例MySQL体系结构及主要存储引擎主要构成:连接池组件管理服务工具SQL接口查询分析器优化器缓冲插入式存储引擎物理存储文件各存储引擎特点InnoDB 后续会有详细介绍此处略过MyISAM 只缓存其索引文件数据库文件缓存由OS本身完成包括MYD和MYI文件通过myisampack解压缩数据文件(霍夫曼编码静态算法压缩) 压缩后只读NDB 集群存储引擎share nothing 数据全部放入内存主键查找速度很快JOIN操作在MySQL数据库层完成而非存储引擎复杂的连接操作需要巨大的网络开销Memory 表数据放入内存易失采用哈希索引只支持表锁并发性能较差不支持TEXT 和BLOB类型以定长空间存varchar注:MysQL使用Memory存储引擎作为临时表来存放SELECT中间结果集若结果集超过Memory存储引擎表容量设置或含有TEXT或BLOB类型将其转换为MyISAM存储引擎表存放到磁盘又因MyISAM不缓存数据文件因此这时产生的临时表的性能对于查询会有损失Archive 只支持INSERT和SELECT 可使用zlib算法进行压缩存储连接方式TCP/IP 基于网络的连接连接进行权限检查命名管道和共享内存Windows系统同一服务器上的两进程可通过命名管道连接需在配置文件中启用--enable-named-pipe选项使用共享内存方式需在f中添加--shared-memory 同时客户端使用--protocol=memory 选项Unix套接字客户端与服务端位于同一服务器时才可使用在f中指定-socket=/tmp/mysql.sock 连接时指定./mysql -S /tmp/mysql.sock主要内容InnoDB存储引擎体系结构和工作原理包括了InnoDB表的存储结构数据页结构分区表种类索引及算法锁事务等内容后台线程内存池show engine innodb status\G 查看运行情况后台线程默认7个4个IO thread 1个master thread 1个锁监控线程1个错误监控线程innodb_file_io_threads innodb_read_io_threads innodb_write_io_threadsInnoDB工作方式将数据文件按页(每页16K)读入InnoDB buffer pool 然后按最近最少使用算法(LRU)保留缓存数据通过一定频率将脏页刷新到文件缓存的数据页类型包括索引页数据页undo页insert buffer 自适应哈希索引InnoDB锁信息以及数据字典信息等master thread 优先级最高由主循环(loop) background loop flush loop和suspend loop组成double write自适应哈希索引InnoDB会监控表上索引的查找根据访问频率和模式为某些页建立哈希索引提高查询性能由InnoDB自动实现通过缓冲池B树构建数据库自优化哈希一般情况下查找时间复杂度为O(1) 常用于JOIN操作但只能用于等值查询启动关闭和恢复innodb_fast_shutdown影响InnoDB表关闭0 MySQL关闭时完成所有的full purge和merge insert buffer操作1 默认值只将缓冲池内的一些脏页刷新至磁盘2 将日志都写入日志文件不会有任何事务丢失但下次启动时会进行recoveryinnodb_force_recovery影响InnoDB的恢复状况默认为0 表示需恢复时执行所有的恢复操作若不能有效恢复则MySQL有可能宕机错误信息会被写入错误日志文件还有1~6等值MySQL中的文件包括参数文件日志文件(错误日志二进制日志慢查日志及查询日志等)socket文件(UNIX 本地连接mysql)pid文件(mysql的进程ID 参数pid_file)表结构文件(frm文件)存储引擎文件日志文件慢查日志记录的为大于long_query_time的慢查记录log_queries_not_using_indexes 查询日志涉及参数LOG GENERAL_LOG GENERAL_LOG_FILE二进制日志相关参数——max_binlog_size /binlog_cache_size /sync_binlog /binlog-do-db /binlog-ingore-db /log-slave-update和binlog_format事务型存储引擎会将所有未提交的二进制日志记录到一个缓存(大小由binlog_cache_size 默认32KB 基于SESSION)事务提交后将其中log写入二进制日志文件(可通过SHOW GLOBAL STA TUS查看binlog_cache(使用缓冲写二进制的次数)和binlog_cache_disk_use(使用临时文件写二进制的次数)状况判读binlog_cache_size合理与否)InnoDB默认事务隔离级别REPEATABLE READbinlog_format三种方式STA TEMENT ROW和MIXEDmysqlbinlog --start-datetime='' --base64-output=decode-rows -v mysql-bin.000001 > binlog.logInnoDB存储引擎文件1.表空间文件默认表空间文件为ibdata1文件innodb_data_file_path 存储数据innodb_file_per_table可以按表分别产生一个表空间.db文件仅存该表的数据索引和插入缓冲等信息其他信息如undo信息系统事务信息double write buffer等还是存放在默认表空间(ibdata1或表空间组)里2.重做日志文件ib_logfile1和ib_logfile2 记录了InnoDB存储引擎的事务日志至少一个redo log group 大小一致并以循环方式使用类似与Oracle四个参数innodb_log_file_size /innodb_log_files_in_group /innodb_mirrored_log_groups和innodb_log_group_home_dir(修改innodb_log_file_size 必须删除原有重做日志文件ib_logfile然后重启MySQL重新生产否则会报错)重做日志记录的关于每页(Page)的更改的物理情况(结构如下)Spaceid PageNo OpCode Data且在事务的过程中依然不断记录重做日志但是二进制日志是在事务提交时记录日志的Innodb_flush_log_at_trx_commit影响重做日志刷新至磁盘的时机推荐一篇文章/view/b9ac81c758f5f61fb7366643.html未明确指定主键先判断是否有非空唯一索引(UNIQUE NOT NULL) 若有则将其默认为主键否则创建一个6字节的ROWID逻辑存储结构tablespace->segment->extent->page行记录格式Compact行格式Redundant行格式Compressed与Dynamic行记录格式Compact Redundant 对于varchar中NULL在列记录中只占NULL标志位不占实际存储空间但对于char中的NULL 两者的处理是不同的Compact格式char中NULL同样不占存储空间而Redundant下占存储空间行记录中还包括两个隐藏列事务ID列(6字节)和回滚指针列(7字节) 若没有定义的Primary Key 会增加一个6字节的RowID列InnoDB在页内部是通过一种链表方式串联各个行记录的。
InnoDB可以将一条记录中的某些数据存储在真正的数据页面之外即作为行溢出数据并将行溢出内容放入Uncompress BLOB Page此做法保证了每页上至少有两行记录否则失去了B+树的意义变成链表了数据页(B-tree node)结构InnoDB数据页由七部分组成File Header:文件头( 38 bytes )Page Header:页头( 56 bytes )Infimum + Supremum Records:页中上/下界记录Users Records:用户记录,即行记录Free Space:空闲空间Page Directory:叶目录File Trailer:文件结尾信息Page Directory 存放记录相对位置稀疏目录sparse directory 即一个槽slot可能属于多个记录最少属于4条记录最多属于8条记录Slot中记录按键顺序存放利用二叉查找迅速找到记录指针二叉查找结果只是一个粗略结果InnoDB必须通过recorder header中的next_record来继续查找相关记录同时slot也解释了recorder header中n_owned值的含义即还有多少记录需要查找因为这些记录并不包括在slots中B+数索引本身并不能找到具体的一条记录只能找到该记录所在的页数据库把页载入内存然后通过Page Directory再进行二叉查找File Trailer只有一个FIL_PAGE_END_LSN 8个字节前4个字节代表该页的checksum值最后4个字节和File Header中的FIL_PAGE_LSN相同保证页完整性DBMS数据完整性实体完整性(保证有一个主键)域完整性(保证数据的值满足特定的条件)参照完整性(保证两表之间的关系)INFORMA TION_SCHEMA TABLE_CONSTRAINTS REFERENTIAL_CONSTRAINTS表查看数据库约束信息对于数据的约束可通过选择合适的类型外键触发器DEFAULT等进行默认情况下MySQL允许非法或不正确数据的插入或更新或内部将其转为一个合法的值若要限制非法输入设置sql_mode="STRICT_TRANS_TABLES"对于ENUM和SET 只能限于对离散数值的约束对于ENUM 若插入非法值将插入空字符串作为特殊错误值InnoDB的外键建立时会自动在该列上加一个索引且约束是即时检查的在数据导入时可能会导致花费大量时间在约束检查上解决办法在导入时忽视外键检查SET FOREIGN_KEY_CHEC KS=0; LOAD DATA……; SET FOREIGN_KEY_CHECKS=1;四种类型的分区RANGE分区给定连续区间的列值V ALUE LESS THAN 需指定MAXV ALUE值的分区主要用于日期列的分区对于RANGE分区的查询优化器只能对YEAR() TO_DAYS() TO_SECONDS()和UNIX_TIMESTAMP()函数进行优化选择LIST分区离散值(V ALUE IN 对于未定义的插入MySQL会抛出异常对于多条记录同时插入过程中存在未定义的值时MyISAM分区会允许之前数据插入而拒绝之后的插入但是InnoDB视插入为一个事务从而ROLLBACK整个插入)HASH分区自定义的表达式的返回值返回值不为负(PARTITION BY HASH (expr) 将数据均匀分布还可按LINEAR HASH分区区别在于算法不同)KEY分区根据MySQL中提供的哈希函数进行分区不管是哪种类型的分区若表中存在主键或唯一索引时分区列必须是唯一索引的一部分如果两者都没有,则可指定任何一列为分区列并且分区的条件必须是整数启用分区后,表不再由一个ibd文件组成而是由建立分区时的各个分区ibd文件组成可以通过INFORMATION_SCHEMA.PARTITIONS查看分区表情况MySQL 5.5开始支持COLUMNS分区可直接使用非整数的数据进行分区分区根据类型直接比较而得不需要转化为整型可视为RANGE和LIST分区的一个进化RANGE COLUMNS分区可对多个列的值进行分区MySQL允许在RANGE和LIST的分区上再进行HASH和KEY的子分区每个子分区的数量必须相同子分区的名称必须唯一子分区可以将数据和索引分配到不同磁盘指定DATA DIRECTORY和INDEX DIRECTORY 但是InnoDB无效对于NULL值的处理不同的分区类型会进行不同的处理RANGE将其放入最左边的分区MySQL把NULL视为小于任何一个非NULL值ORDER BY排序也是如此) LIST分区需指明NULL的存放HASH和KEY分区会将NULL值变为0分区和性能分区表的使用必须要了解分区的使用环境合理使用尤其是OLTP系统必须谨慎对于大表一般的B+树需要2~3次磁盘IO 所以B+树可以高效地完成查询工作不需要分区的帮助并且设计不好的分区会带来严重的性能问题B+树索引并不能找到一个给定键值的具体行只能找到被查找数据所在的页然后数据库通过把页读入内存再在内存中对每页中的Page Directory中的槽(按照主键的顺序存放的)进行二分查找最后得到查找的数据平衡二叉树左节点键值<根节点键值<右节点键值任何节点左右两个子树的高度差最大为1平衡二叉树对于查询速度很快但是维护该结构的代价也非常大多用于内存结构对象中维护开销相对比较小B+树中所有记录节点都是按键值的大小顺序存放在同一层的叶节点中各页节点通过双向链表指针进行连接下图为一棵高度为2的B+树B+树的插入和删除操作需要详细看B+树高度一般在2~3层根据存储数据的不同可以分为聚集索引(Clustered Index)和辅助聚集索引(Secondary Index)两者的区别在于叶节点存放的是否是已整行的信息聚集索引每张表只能拥有一个聚集索引聚集索引的存储并不是物理上的连续而是逻辑上的连续对于主键的排序查找和范围查找速度非常快辅助索引辅助索引的叶节点不包含行的全部数据除包含键值外还包括了一个指向相应行数据的聚集索引键的书签(bookmark)利用辅助索引查找数据时InnoDB会遍历辅助索引并通过叶节点的指针获得指向主键索引的主键然后再通过主键索引来找到一个完整的行记录B+树索引的管理通过ALTER TALBE ADD/DROP INDEX或者CREATE/DROP INDEX创建或删除MySQL对于索引的添加和删除先创建一张新的临时表然后将数据导入临时表之后删除元表最后把临时表重名为原来的表名对于大表添加或删除索引会耗时很长在InnoDB Plugin中对于辅助索引的创建MySQL采用一种快速索引创建的方法在表上加一个S锁不需重建表可以通过SHOW INDEX FROM tab_name查看表的索引信息通过ANAL YZE TABLE tab_name更新表的索引统计值MySQL查询优化器也会根据实际情况使用或不使用索引(当取出的数据量超过表中数据的20%时优化器便不会使用索引而是进行全表扫描作者经验)数据库中顺序读是指根据索引的叶节点数据就能顺序地读取所需要的行数据只是逻辑地顺序读在物理磁盘上可能还是随机读取随机读一般需要根据辅助索引叶节点中的主键寻找实际行数据而辅助索引和主键所在的数据段不同因此访问方式是随机的为提高读取性能InnoDB采用预读取方式将所需数据读入内存包括随机预读取random read ahead 和线性预读取linear read ahead但是自InnoDB Plugin1.0.4起随机访问的预读取被取消了保留了线性预读取并加入了innodb_read_ahead_threshold参数控制一个区中多少页被顺序访问时InnoDB才启用预读取预读取下一个页中所有的页另一个问题固态硬盘的技术使得随机读取的速度极大提高但数据产品并没有充分利用到这一点哈希算法InnoDB使用哈希算法对字典进行查找其冲突机制采用链表方式哈希函数采用除法散列方式对于缓冲池页的哈希表来说在缓冲池中的Page页都有一个chain指针它指向哈希函数值的页哈希索引只能用来搜索等值的查询锁是为了支持对共享资源进行并发访问提供数据完整性和一致性InnoDB中两种行级锁共享锁(S Lock)和排他锁(X Lock)为了支持不同粒度上进行加锁操作InnoDB提供了两种表级别的意向锁:意向共享锁(IS Lock 获得某几行的共享锁) 意向排他锁(IX Lock,获得某几行的排他锁)意向锁不会阻塞除全表扫描以外的任何请求SHOW ENGINE INNODB STA TUS\G查看锁请求信息Locks rec but not gap代表锁住的是一个索引而不是一个范围在InnoDB Plugin中information_schema库增加了INNODB_TRX INNODB_LOCKS和INNODB_LOCK_WAITS三张表可以监控当前事务并分析可能存在的锁的问题SELECT r.trx_id waitin_trx_id, r.trx_mysql_thread_id waiting_thread, r.trx_query waiting_query, b.trx_id blocking_trx_id, b.trx_mysql_thread_id blocking_thread, b.trx_queryblocking_queryFROM information_schema.innodb_lock_waits winner join information_schema.innodb_trx b on b.trx_id=w.blocking_trx_idinner join information_schema.innodb_trx t on t.trx_id=w.request_trx_id一致性的非锁定读操作InnoDB通过多版本控制(multi versioning)读取数据如果读取的行正在执行DELETE UPDATE操作读取操作会去读取行的一个快照数据UNDO数据段而不是等待行上锁的释放读取方式跟隔离级别有关MVCC Multi Version Concurrency Control在Read Committed和Repeatable Read下InnoDB使用非锁定的一致性读但是对于快照数据的定义不同Read Committed下读取被锁定行的最新一份快照数据而Repeatable级别下读取事务开始时的行数据版本SELECT …FOR UPDA TE 对读取的行记录加一个X锁其他事务在这些行上加锁时会被阻塞SELECT …LOCK IN SHARE MODE 对读取的行记录加S锁其他事务可以继续加S 锁但是X锁则会被阻塞事务提交锁被释放语句前应加BEGIN START TRANSACTION或SET AUTOCOMMIT=0InnoDB对每个含自增值的表都有一个自增计数器(auto-increment counter)当有插入操作时计数器会被初始化获取自增值SELECT MAX(auto_inc_col) FROM t FOR UPDATE即AUTO-INC Locking方式完成对自增值插入的SQL语句后立即释放而不是等COMMIT/ROLLBACK后才释放从5.1.22开始InnoDB提供了一个参数innodb_autoinc_lock_mode可以控制自增插入的方式实现了一种轻量级互斥量的自增实现机制提高性能InnoDB下自增列必须是索引而且是索引的第一个列否则报错对于外键值的插入或更新首先需要查询父表中的记录此时会使用SELECT …LOCK IN SHARE MODE方式在父表上加S锁若此时父表上有X锁则子表上的操作会被阻塞三种锁的算法Record Lock 单行记录上的锁锁住索引记录Gap Lock 间隙锁锁定一个范围但不包括记录本身如< 6 时,依然可以插入6Next-Key Lock:Gap Lock + Record Lock 锁定一个范围并且锁定记录本身如< 6,插入6时会被阻塞在REPEATABLE READ模式下Next-Key Lock算法是默认的行记录锁定算法锁提高了并发?? 但是却会带来问题丢失更新脏读(读取其他事务未提交的数据)产生的条件是READ UNCOMMITTED级别) 和不可重复读MySQL通过READ REPEATABLE和Nex-Key Lock算法避免了不可重复读的现象Innodb_lock_wait_timeout控制等待的时间(默认50秒)innodb_rollback_on_timeout用来确定是否在等待超时时对进行中的事务进行回滚操作(默认OFF 不回滚不可动态调整)对于死锁InnoDB有后台的锁监控线程检测到死锁后会回滚一个事务事务特性ACID Atomicity Consistency Isolation Durability原子性一致性持久性通过数据库的redo和undo来完成而隔离性是通过锁来实现的。