15章InnoDB存储引擎

目录

15.1引言InnoDB
15.1.1使用InnoDB表的好处
15.1.2 InnoDB表的最佳实践
15.1.3验证InnoDB是默认的存储引擎
15.1.4测试和基准测试与InnoDB
15.2 InnoDB和酸模式
15.3 InnoDB的多版本
15.4 .无辜的建筑
15.4.1 Buffer Pool
15.4.2改变缓冲
15.4.3自适应哈希索引
15.4.4重做日志缓冲区
15.4.5球系统表空间
15.4.6 Doublewrite Buffer
15.4.7 UNDO日志
15.4.8文件每个表的表空间
一般15.4.9表空间
15.4.10 undo表空间
15.4.11临时表空间
15.4.12重做日志
15.5 InnoDB锁和事务模型
15.5.1 InnoDB锁定
15.5.2 InnoDB事务模型
15.5.3锁的不同设置SQL语句在InnoDB
15.5.4幻像行
15.5.5死锁在InnoDB
15.6 InnoDB配置
15.6.1 InnoDB启动配置
15.6.2配置InnoDB只读操作
15.6.3 InnoDB缓冲池的配置
15.6.4 InnoDB缓冲配置变化
15.6.5配置InnoDB线程并发
15.6.6配置背景InnoDB I/O线程数
15.6.7使用异步I/O的Linux
15.6.8配置InnoDB主线程I/O速率
15.6.9自旋锁轮询配置
15.6.10配置InnoDB净化调度
15.6.11配置优化器统计InnoDB
15.6.12配置合并阈值的索引页
15.6.13启用自动配置一个专用的MySQL服务器
15.7 InnoDB表空间
15.7.1 InnoDB SYSTEM表空间大小
15.7.2变化的数量或大小的InnoDB重做日志文件
15.7.3使用原始磁盘分区系统表空间
15.7.4 InnoDB表的表空间文件
15.7.5每表表空间创建外部数据文件的目录
15.7.6复制文件到另一个实例的每个表的表空间
15.7.7移动表空间文件,而服务器离线
15.7.8 undo表空间配置
15.7.9截断撤销表空间
15.7.10 Innodb General Tabessoes
15.7.11 InnoDB表空间加密
15.8 InnoDB表和索引
15.8.1 InnoDB表
15.8.2 InnoDB索引
15.9 InnoDB表和网页压缩
15.9.1 InnoDB表压缩
15.9.2 InnoDB页面压缩
15.10 InnoDB行存储和列格式
15.10.1概述InnoDB的行存储
15.10.2指定行的格式表
15.10.3动态压缩行格式
15.10.4紧凑和多余的行格式
15.11 InnoDB的磁盘I/O和文件空间管理
15.11.1 InnoDB的磁盘I / O
15.11.2文件空间管理
15.11.3 InnoDB检查站
15.11.4整理表
15.11.5回收磁盘空间表
比InnoDB和在线DDL
15.12.1 DDL操作在线
15.12.2在线DDL性能和并发性
15.12.3在线DDL的空间要求
15.12.4简化在线DDL DDL语句
在线15.12.5 DDL失效条件
15.12.6在线DDL的局限性
15.13 InnoDB启动选项和系统变量
15.14 information_schema InnoDB表
15.14.1 InnoDB information_schema表压缩
15.14.2 InnoDB information_schema事务和锁定信息
15.14.3 InnoDB information_schema架构对象表
15.14.4 InnoDB表的架构信息_ fulltext index
15.14.5 InnoDB缓冲池表information_schema
15.14.6 InnoDB information_schema度量表
15.14.7 InnoDB information_schema临时表信息表
15.14.8 InnoDB表空间元数据检索information_schema.files
15.15 InnoDB集成MySQL性能模式
15.15.1监测改变InnoDB表使用performanceschema表进展
15.15.2监测InnoDB互斥等使用性能模式
15.16 InnoDB监视器
15.16.1 InnoDB监视器类型
15.16.2使InnoDB监视器
15.16.3 InnoDB标准监控锁监视器输出
15.17 InnoDB备份和恢复
15.17.1 InnoDB备份
15.17.2 InnoDB恢复
15.18 InnoDB和MySQL复制
15 InnoDB Memcached插件
在InnoDB Memcached插件15.19.1效益
15.19.2 InnoDB缓存架构
15.19.3设置innodb memcached插件
15.19.4 InnoDB Memcached多得到和范围查询支持
对于InnoDB Memcached插件15.19.5安全注意事项
15.19.6写InnoDB Memcached插件的应用
15.19.7 InnoDB Memcached插件和复制
15.19.8 InnoDB Memcached插件内部
15.19.9排除InnoDB Memcached插件
15.20 InnoDB故障排除
15.20.1 InnoDB I/O问题的故障排除
15.20.2迫使InnoDB恢复
15.20.3 InnoDB数据字典操作故障
15.20.4 InnoDB错误处理

15.1引言InnoDB

InnoDB是一个通用的存储引擎,平衡的高可靠性和高性能。在MySQL 8,InnoDB是默认的MySQL存储引擎。除非您已配置不同的默认存储引擎,发行CREATE TABLE声明没有ENGINE=子句创建一个InnoDB

InnoDB的关键优势

表15-1 InnoDB存储引擎的特点

功能特色支持
树索引
在时间点的备份/恢复(实现在服务器中,而不是存储引擎。)
群集数据库支持
聚簇索引
压缩数据
数据高速缓存
数据加密传输(实现在服务器通过加密功能。在其他表空间加密数据在MySQL 5.7以后可用。)
外键的支持
全文搜索索引是的(为全文索引在MySQL InnoDB支持5.6后。可用)
地理空间数据类型的支持
地理空间索引支持是的(地理空间索引,InnoDB支持MySQL 5.7之后。可用)
哈希索引没有(InnoDB使用哈希索引内部的自适应哈希索引的特征。)
索引缓存
锁粒度
MVCC
复制支持(实现在服务器中,而不是存储引擎。)
存储限制64tb
T树索引
交易
更新数据字典数据

比较特征InnoDB与其他存储引擎提供MySQL,看存储引擎的特点第十六章,选择存储引擎

InnoDB的增强功能和新功能

有关InnoDBenhancements和两个新的特点,参考:

额外的InnoDB的信息和资源

15.1.1使用InnoDB表的好处

你可能会发现InnoDB有益的理由如下表:

  • 如果您的服务器崩溃由于硬件或软件问题,不管当时在数据库中发生了什么,你不需要做任何特殊的后重新启动数据库。InnoDB崩溃恢复自动完成,发生撞击的时间之前的任何变化,并不会产生任何变化,在过程中不犯。只是重新启动并继续你离开的地方。

  • 这个InnoDB存储引擎维护自己缓冲池缓存在内存中的表和索引数据为数据访问。常用的数据处理,直接从内存。这种缓存适用于许多类型的信息和加快处理。在专用的数据库服务器,到80的物理内存会被分配至缓冲池。

  • 如果你分手了相关数据的分表,您可以设置外键执行参照完整性。更新或删除数据,和其他表中的相关数据被更新或删除。尝试将数据插入到一次表没有主表中相应的数据,和坏数据自动被踢出来了。

  • 如果数据是在磁盘或内存中的损坏,一校验和机构提醒你伪造的数据之前,你使用它。

  • 当你设计你的数据库和相应的主键每个表的列,这些列包含操作自动优化。这是引用的主键列很快WHERE条款,ORDER BY条款,GROUP BY条款,并加入运营

  • 插入,更新,删除,由称为自动机制的优化变化的缓冲InnoDB不仅允许并发读写访问相同的表,它缓存更改的数据精简磁盘I / O.

  • 绩效是不限于大表查询时间长。当同一行访问过的从一张桌子,一个功能叫做自适应哈希索引在做出这些查找更快,如果他们来到一个哈希表。

  • 你可以压缩表和相关的索引。

  • 您可以创建和删除索引对性能和可用性的影响很小。

  • 截断文件表表空间是非常快的,并能释放磁盘空间,操作系统的重用,而不是腾出空间内系统片只有InnoDB可重用

  • 表数据的存储布局更为有效BLOB长文本字段,与动态行格式

  • 你可以通过查询监控存储引擎的内部工作information_schema

  • 你可以通过查询监控存储引擎的性能细节性能模式

  • 你可以自由组合InnoDB与其他MySQL存储引擎的表表,即使在同一个声明。例如,您可以使用加入将数据从操作InnoDBMEMORY在一个单一的查询表

  • InnoDB设计了CPU的效率和处理大数据量时的最大性能。

  • InnoDB表可以处理大量的数据,即使在操作系统的文件大小限制为2GB。

InnoDB-具体的优化技术可以应用于你的应用程序代码,看8.5节,“优化InnoDB表”

15.1.2 InnoDB表的最佳实践

本节介绍的最佳实践使用时InnoDB

  • 指定一个primary key使用最频繁查询的列的每个表,或自增量Value if there is no obvious主键。

  • 使用加入无论数据是基于从这些表中相同的ID值的多个表拉。快速连接性能,定义外键对同列,并宣布那些列在每个表中相同的数据类型。添加外键保证引用的列的索引,可以提高性能。外键也传播删除或更新所有受影响的表,如果对应的ID不在父表中提出防止在子表中插入数据。

  • 关闭自动提交。犯次把帽子演出数百(由写你的存储设备速度的限制)。

  • 分组组相关DML操作交易,包围他们START TRANSACTION承诺声明.当你不想做太多,你也不想的问题一大堆INSERTUPDATE,或DELETE运行时间没有提交报表。

  • 不使用LOCK TABLES声明.InnoDB可以处理多个会话都读到同一张桌子上写作,在不牺牲可靠性和高性能。获得独家写访问的行集,使用SELECT ... FOR UPDATE语法锁就行你打算更新。

  • 使innodb_file_per_table选项或使用一般的表空间将数据和索引表放在单独的文件中,而不是在系统片

    这个innodb_file_per_table选项是默认

  • 评估是否你的数据访问模式受益InnoDB表或页压缩功能特色你可以压缩InnoDB表不牺牲读/写能力

  • 与选项运行服务器--sql_mode=NO_ENGINE_SUBSTITUTION为了防止表被创建不同的存储引擎,如果有一个与指定的发动机问题ENGINE=条款CREATE TABLE

15.1.3验证InnoDB是默认的存储引擎

问题SHOW ENGINES语句来查看可用的MySQL存储引擎。寻找默认InnoDB线

MySQL >显示引擎;

另外,查询INFORMATION_SCHEMA.ENGINES

MySQL SELECT * FROM information_schema.engines >;

15.1.4测试和基准测试与InnoDB

如果InnoDB是不是你的默认存储引擎,你可以确定你的数据库服务器或应用程序正常工作InnoDB通过重新启动服务器--default-storage-engine=InnoDB在命令行或定义default-storage-engine=innodb定义在[ mysqld ]你的MySQL服务器选项文件段。

由于更改默认存储引擎只影响新表为他们创建,运行所有应用程序的安装和设置步骤确认一切安装正确。然后锻炼的应用特点,以确保所有数据的加载、编辑和查询功能的工作。如果一个表依赖于一个功能,具体到另一个存储引擎,您将收到一个错误;加ENGINE=other_engine_name条款的CREATE TABLEavoid statement to the error。

如果你没有做出关于存储引擎的一个深思熟虑的决定,你想预览某些表工作时使用InnoDB,发出命令ALTER TABLE table_name ENGINE=InnoDB;每个表。或者,运行测试的查询和其他报表无干扰的原始表格,复印:

CREATE TABLE InnoDB_Table (...) ENGINE=InnoDB AS SELECT * FROMother_engine_table

评估实际工作量在一个完整的应用程序的性能,安装最新的MySQL服务器,运行基准测试。

从安装完整的应用生命周期,测试,通过大量使用,并重新启动服务器。杀死服务器进程在数据库忙模拟断电,并验证数据恢复成功当你重启服务器。

测试任何复制配置,特别是如果你使用不同的版本,在主人和奴隶的选项。

15.2 InnoDB和酸模式

这个模型是一组数据库的设计原则,强调可靠性,业务数据和关键任务应用的重要方面。MySQL包括组件,如InnoDB存储引擎,坚持着酸模型,使数据不被破坏,结果没有得天独厚的条件,如软件崩溃和硬件故障的扭曲。当你依靠酸兼容的特点,你不需要重复一致性检查和故障恢复机制的车轮。如果你有额外的软件保障的情况下,超可靠的硬件,或一个应用程序可以容忍少量的数据丢失或不一致,你可以调整MySQL设置贸易的一些酸可靠性更好的性能和吞吐量。

以下各节讨论MySQL的特点,特别是InnoDB存储引擎,随着酸的类相互作用模型:

  • 原子性:

  • C一致性:

  • I:绝缘

  • Ddurability:。

原子性

这个原子性酸的模型方面主要涉及InnoDB交易。MYSQL的相关功能包括:

  • 自动提交设置

  • COMMIT声明

  • ROLLBACK声明

  • 从运营数据INFORMATION_SCHEMA

一致性

这个一致性酸的模型方面主要涉及内部InnoDB处理保护数据崩溃。MYSQL的相关功能包括:

隔离

这个隔离酸的模型方面主要涉及InnoDB交易特别是,in the隔离级别适用于每个交易。MYSQL的相关功能包括:

  • 自动提交设置

  • SET ISOLATION LEVEL声明

  • 低级别的细节InnoDB锁定。在性能调优,你看这些细节通过INFORMATION_SCHEMA

耐久性

这个耐久性酸的模型方面涉及到MySQL软件的特征与特定的硬件配置的相互作用。因为有许多的可能性取决于你的CPU的能力,网络,存储设备,这一方面是最复杂的提供具体的指导方针。(这些指南可能采取的形式购买新的硬件MYSQL的相关特征包括。):

  • InnoDBdoublewrite缓冲,打开和关闭的innodb_doublewrite配置选项

  • 配置选项innodb_flush_log_at_trx_commit

  • 配置选项sync_binlog

  • 配置选项innodb_file_per_table

  • 写在一个存储设备的缓冲区,如磁盘驱动器、SSD、或RAID阵列。

  • 在存储设备中的电池支持的高速缓存。

  • 操作系统运行使用MySQL,特别是对其支持fsync()系统调用

  • 不间断电源(UPS)保护电力所有的计算机服务器和存储设备,运行MySQL服务器和存储MySQL数据。

  • 您的备份策略,如频率和类型的备份,备份保留期。

  • 分布式或托管的数据应用,特殊特性的数据中心在MySQL服务器的硬件设置,以及数据中心之间的网络连接。

15.3 InnoDB的多版本

InnoDB是一个多版本存储引擎信息:保持旧版本改了行,支持事务的特点,如并发回降。此信息存储在数据结构中的表空间称为回滚段(Oracle类似的数据结构后)。InnoDB利用信息在回滚段执行撤销操作回滚一个事务需要。它还使用这些信息来建立一个早期的行版本一致性读

内部,InnoDB增加了三个领域的每一行存储在数据库中。6字节_ TRX _ DB ID字段指示事务标识符的最后交易,插入或更新的行。同时,删除内部进行处理作为一个更新在排一个特殊的位设置为标记为删除。每行包含一个7-byteDB_ROLL_PTR字段名的指针。滚动指针指向UNDO日志记录写入回滚段。如果已更新行,撤消日志记录包含必要的重建这一行的内容才更新的信息。6字节_分贝_ ROW ID字段包含一个行ID,单调增加的插入新的行。如果InnoDB自动生成一个聚集索引,索引包含行ID值。否则,该_分贝_ ROW ID柱中没有出现任何指标。

撤消日志回滚段分为插入和更新的UNDO日志。插入UNDO日志只需要在事务回滚可以弃尽快提交事务。更新的UNDO日志中也使用一致性读,但他们只能在那里是没有交易目前丢弃InnoDB已分配的快照,以一致读可以在更新所需要的信息的UNDO日志建立一个早期版本的数据库行。

把自己的交易规则,包括交易这一问题的一致性读。否则,InnoDB不能放弃从更新的UNDO日志数据和回滚段可能会变得太大,填满你的空间。

一个undo回滚段记录比相应的插入或更新的行通常小的物理尺寸。您可以使用此信息来计算你的回滚段所需要的空间。

InnoDB多版本策略,行不需要从数据库取出立即当你删除它的SQL语句。InnoDB只有物理删除相应的行的索引记录的时候丢弃更新UNDO日志的删除写。这种手术称为净化,这是相当快的,通常以时间顺序相同的SQL语句,并删除。

如果你在小批量插入和删除行在同一率表中,清除线程可以启动滞后,桌子可以越长越大,所有的死去的行,一切束缚和磁盘很慢。在这种情况下,节流新排的操作,并将更多的资源分配给清除线程通过调整innodb_max_purge_lag系统变量。见15.13节,“InnoDB启动选项和系统变量”更多信息

多版本和次要指标

InnoDB多版本并发控制(MVCC)对二级指标不同于聚簇索引。在聚集索引中的记录被更新的地方,和他们隐藏的系统列点UNDO日志条目从早期版本的记录可以重建。与聚集索引记录,辅助索引记录不包含隐藏系统栏也更新到位。

当一次索引列的更新,旧的次要指标记录的删除标记,插入新的记录,删除标记的记录被清除。当一次索引记录删除标记的或次要的索引页面的更新事务更新,InnoDB看起来在聚集索引的数据库记录。在聚簇索引,记录的_ TRX _ DB ID检查,并记录正确的版本是由UNDO日志如果记录是在阅读交易开始修改检索。

如果一次索引记录标记为删除的或次要的索引页面的更新更新的交易,覆盖指标技术是没有用的。不返回值的索引结构,InnoDB看起来在聚集索引的记录。

然而,如果pushdown条件指数(PCI)优化是有效的,和部分的WHERE条件可以使用从指数仅评估领域,MySQL服务器仍将这部分的哪里条件下的存储引擎,它是利用指数评价。如果没有找到匹配的记录,避免了聚集索引查找。如果找到匹配的记录,即使在删除标记的记录,InnoDB看起来在聚集索引的记录。

15.4 .无辜的建筑

本节提供的主要部件介绍InnoDB存储引擎体系结构

15.4.1 Buffer Pool

缓冲池内存区域InnoDB缓存表和索引数据为数据访问。缓冲池可以让经常使用的数据进行处理,直接从内存,从而加快了处理。在专用的数据库服务器,到80%的物理内存通常是分配给InnoDB缓冲池

对于大批量的读操作效率,缓冲池分为网页可以容纳多个行。用于高速缓存管理效率,缓冲池作为一个页面链表实现;是很少使用的数据超过了缓存,使用变化的LRU算法.

有关更多信息,参见第15.6.3.1,“InnoDB缓冲池”,和第15.6.3,“InnoDB缓冲池配置”

15.4.2改变缓冲

改变缓冲区是一个特殊的数据结构,缓存的变化次要指标页面时,页面是不受影响的缓冲池。缓冲的变化,这可能会导致INSERTUPDATE,或DELETE操作(DML),合并后的页面被加载到缓冲池的读操作。

不像聚簇索引,二级指标通常是唯一的,并插入次要指标,发生在一个相对随机的顺序。同样,删除和更新可能会影响不相邻的索引树中的次要索引页。合并缓存的变化的时候,当影响页读入缓冲池等操作,避免了大量的随机存取I/O,必须在二级索引页从磁盘读取。

定期运行时系统大多是闲置的清洗操作,或缓慢关闭时,将更新的索引页到磁盘。在清除操作可以写入磁盘块的一系列指标值比如果每个值被写入磁盘立即更有效。

改变缓冲区合并可能需要几个小时的时候,有很多的辅助索引更新和许多受影响的行。在这段时间中,磁盘I/O的增加,会导致磁盘绑定查询显著放缓。改变缓冲区合并也可能继续在事务提交时。事实上,改变缓冲区合并可能继续发生服务器关机后重启(见第15.20.2,迫使InnoDB恢复”为更多的信息)

在记忆中,改变缓冲区占用的部分InnoDB缓冲池。盘面上,改变缓冲区是系统表空间的一部分,所以指数变化保持缓冲在数据库重新启动。

数据缓存在改变缓冲区的类型是由innodb_change_buffering配置选项。有关更多信息,参见第15.6.4配置变化,InnoDB缓冲”。您也可以配置的最大变化的缓冲区大小。有关更多信息,参见第15.6.4.1,“配置更改缓冲区的最大大小”

改变缓冲不支持二级索引,如果索引包含一个降序索引列或如果主键包括降序索引列。

监测变化的缓冲

以下选项可用于改变缓冲监控:

  • InnoDB标准监视器输出包括改变缓冲区状态信息。查看监控数据,问题显示引擎INNODB STATUS命令

    mysql> SHOW ENGINE INNODB STATUS\G
    

    改变缓冲区的状态信息是位于INSERT BUFFER AND ADAPTIVE HASH INDEX标题,出现类似下面的:

    -------------------------------------插入缓冲和自适应哈希索引------------------------------------- IBUF:大小1,自由列表Len 0,赛格2号,0 mergesmerged操作:插入0,删除标记0,删除0discarded操作:插入0,删除标记0,删除0hash表大小4425293,用细胞32,结堆缓冲区1(S)13577.57哈希搜索/ s,202.47非哈希搜索/

    有关更多信息,参见第15.16.3,“InnoDB标准监控锁监视器输出”

  • 这个INFORMATION_SCHEMA.INNODB_METRICS表提供了大部分数据点发现InnoDB标准监视器输出,加上其他数据点。查看改变缓冲度量和描述每一个,发出以下查询:

    mysql> SELECT NAME, COMMENT FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE '%ibuf%'\G
    

    INNODB_METRICS表的使用信息,看第15.14.6,“InnoDB information_schema度量表”

  • 这个INFORMATION_SCHEMA.INNODB_BUFFER_PAGE表提供的缓冲池中的每个网页的元数据,包括改变缓冲指数改变缓冲区位图页。改变缓冲页面是确定的网页类型IBUF_INDEX是改变缓冲索引页的页面类型,和ibuf _位图是改变缓冲区位图页的页面类型。

    警告

    查询INNODB_BUFFER_PAGE表格可以引入显着的性能开销。为了避免影响性能,再现你想探讨的一个测试实例并运行您的查询测试实例的问题。

    例如,你可以查询INNODB_BUFFER_PAGE表来确定近似数ibuf_indexIBUF_BITMAP页面缓冲池页面总数的百分比。

    MySQL的>SELECT (SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGEWHERE PAGE_TYPE LIKE 'IBUF%') AS change_buffer_pages,(SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE) AS total_pages,(SELECT ((change_buffer_pages/total_pages)*100))AS change_buffer_page_percentage;--------------------- ------------- ------------------------------- | change_buffer_pages | total_pages | change_buffer_page_percentage | --------------------- ------------- ------------------------------- | 25 | 8192 | 0.3052 | --------------------- ------------- -------------------------------

    有关所提供的其他数据信息INNODB_BUFFER_PAGE表,看第24.35.1,“information_schema innodb_buffer_page表”。有关使用信息,看第15.14.5“InnoDB缓冲池,information_schema表”

  • 性能模式改变缓冲区的互斥等提供先进性能监测仪表。查看改变缓冲仪表,发出以下查询:

    mysql> SELECT * FROM performance_schema.setup_instruments
           WHERE NAME LIKE '%wait/synch/mutex/innodb/ibuf%';
    +-------------------------------------------------------+---------+-------+
    | NAME                                                  | ENABLED | TIMED |
    +-------------------------------------------------------+---------+-------+
    | wait/synch/mutex/innodb/ibuf_bitmap_mutex             | YES     | YES   |
    | wait/synch/mutex/innodb/ibuf_mutex                    | YES     | YES   |
    | wait/synch/mutex/innodb/ibuf_pessimistic_insert_mutex | YES     | YES   |
    +-------------------------------------------------------+---------+-------+
    

    有关监测InnoDB互斥等待,看第15.15.2,“监测InnoDB互斥等使用性能模式”

15.4.3自适应哈希索引

这个自适应哈希索引(让我们ahi)InnoDB更像一个内存数据库与工作量和充足的内存的适当组合系统缓冲池,在不牺牲任何事务的功能和可靠性。启用了这个功能innodb_adaptive_hash_index选项,或关闭——skip-innodb_adaptive_hash_index在服务器启动

基于观察到的模式的搜索,MySQL建立哈希索引使用前缀索引键的。关键的前缀可以是任意长度,可能只有部分的值在树出现在哈希索引。索引是建立在那些页面,经常访问的指标要求。

如果一个表适用于几乎完全在内存中的,一个哈希索引可以加快使任何元素直接查找查询,将指标值为一个指针。InnoDB有一个机制,监测指标搜索。如果InnoDB注意查询可以建立哈希索引的好处,它自动。

一些工作负载,从哈希索引查找的加速远远大于额外工作的监测指标查找和维护哈希索引结构。有时,读写锁,警卫进入自适应哈希索引可以在繁重的工作成为一个争论的焦点,如多个并发连接。查询LIKE运营商和%通配符也不倾向于从AHI效益。工作负载,自适应哈希索引是不需要的,把它关闭,减少了不必要的性能开销。因为它是很难提前预测此功能是否适合一个特定的系统,考虑在启用和禁用运行的基准,使用现实的工作量。在MySQL 5.6建筑的变化和较高的使更多的工作负载,适用于禁用自适应哈希索引比以前的版本,虽然它仍然是默认启用。

自适应哈希索引检索系统划分。每个指标是绑定到特定的分区,每个分区由一个单独的闩锁保护。分区控制的innodb_adaptive_hash_index_parts配置选项。的innodb_adaptive_hash_index_parts选项是默认设置为8。最大值设置为512。

哈希索引是基于现有的建B-树在表的索引InnoDB可以建立一个Hash索引在任何长度的前缀树定义的关键,根据搜索模式InnoDB观察B树索引。哈希索引可以是局部的,只包括那些经常被访问的页面的索引。

您可以监视自适应哈希索引和在其使用的争用SEMAPHORES对输出部分SHOW ENGINE INNODB STATUS命令。如果你看到很多线程等待一个RW锁了btr0sea.c,然后它可能会禁用自适应哈希索引有用。

关于哈希索引的性能特性的更多信息,参见第8.3.9,比较B树和哈希索引”

15.4.4重做日志缓冲区

重做日志缓冲区是将数据写入到存储区重做日志文件。重做日志缓冲区的大小是由innodb_log_buffer_size配置选项。重做日志缓冲区是定期刷新到磁盘上的日志文件。一个大的重做日志缓冲区使大交易运行而不需要写日志到磁盘的事务提交之前。因此,如果你有交易,更新、插入或删除行,很多,使得日志缓冲区更大的节省了磁盘I / O.

这个innodb_flush_log_at_trx_commit选项控制如何重做日志缓冲区的内容写入日志文件。这个innodb_flush_log_at_timeout选项控制日志冲洗频率。

15.4.5球系统表空间

这个InnoDB系统表空间contains theInnoDB数据字典(元数据InnoDB相关的对象),是为doublewrite缓冲存储区,改变缓冲液,和UNDO日志。SYSTEM表空间包含的表和索引数据的任何用户创建的表,系统表空间中创建。SYSTEM表空间是一个共享表空间是由多个表共享。

SYSTEM表空间由一个或多个数据文件的代表。默认情况下,一个系统的数据文件,命名为ibdata1,在MySQL创建数据目录的大小和系统数据文件的数量是由innodb_data_file_path启动选项

相关的信息,看第15.6.1,“InnoDB启动配置”,和第15.7.1,“调整InnoDB系统表空间”

15.4.6 Doublewrite Buffer

的doublewrite缓冲存储区位于SYSTEM表空间在哪里InnoDB写页面刷新的InnoDB缓冲池,在页面中适当的位置写数据文件。只有经过冲洗和编写网页的doublewrite缓冲,并InnoDB写页面的适当位置。如果有一个操作系统,存储子系统,或mysqld在一页写中间过程碰撞,InnoDB以后可以找到网页的一个很好的副本从doublewrite缓冲崩溃恢复过程。

虽然数据总是写两次的doublewrite缓冲不需要两倍的I/O开销或两倍的I/O操作。数据写入doublewrite缓冲本身作为一个大的序列块,与一个单一的fsync()对操作系统的调用

的doublewrite缓冲区是在大多数情况下,默认启用。禁用doublewrite缓冲区,设置innodb_doublewrite这是0

如果系统表空间文件(ibdata文件)位于融合IO设备支持原子写道,doublewrite缓冲自动禁用,Fusion-io原子将用于所有数据文件。因为doublewrite缓冲的设置是全局的,doublewrite缓冲也是数据文件驻留在非融合IO硬件禁用。此功能仅在Fusion-io的硬件支持,仅仅在Fusion-io nvmfs Linux。要充分利用这一特点,innodb_flush_method设置直接_ O推荐

15.4.7 UNDO日志

撤消日志是一个集UNDO日志记录与一个单一的关联交易。撤消日志记录包含有关如何撤消新变化的交易了聚集索引唱片如果一个事务需要看到原始数据(作为一个一致的读操作的一部分),未修改的数据从UNDO日志记录检索。UNDO日志存在UNDO日志片段,这是包含在回滚段。回滚段驻留在撤消基于还原表空间而在临时表空间。为更多的信息关于撤销表空间,看第15.7.8”配置,撤销表空间”。关于多版本的信息,参见15.3节,“InnoDB的多版本”

临时表空间每个undo表空间单独支持最多128个回滚段。这个innodb_rollback_segments配置选项确定回滚段数。每个回滚段最多支持1023个并发数据修改事务。

15.4.8文件每个表的表空间

每个表的表空间的文件是一个表的表空间,在其自己的数据创建的文件而不是在SYSTEM表空间。表每表表空间中创建的文件时innodb_file_per_table选项是启用的。否则,InnoDB在系统表空间中创建表。每个文件的每个表空间是由一个单一的代表.ibd数据文件,这是默认的数据库目录中创建。

每个表的表空间文件支持DYNAMIC压缩的行格式支持等功能关闭页面存储可变长度的数据和表压缩。有关这些功能的信息,并对每个表的表空间文件的其他优点,看第15.7.4“InnoDB文件,每个表的表空间”

一般15.4.9表空间

一个共享InnoDB表空间的创建使用CREATE TABLESPACE语法。一般的表空间可以创建MySQL数据目录之外,能够容纳多个表,和所有的行格式的支持表。

表添加到一个表空间使用CREATE TABLE tbl_name ... TABLESPACE [=] tablespace_nameALTER TABLE tbl_name TABLESPACE [=] tablespace_name语法

有关更多信息,参见第15.7.10”一般,InnoDB表空间”

15.4.10 undo表空间

UNDO表空间由一个或多个文件包含UNDO日志。undo tablespaces used by the number ofInnoDB是指由innodb_undo_tablespaces配置选项。有关更多信息,参见第15.7.8”配置,撤销表空间”

笔记

innodb_undo_tablespaces是过时的、将在未来的版本中删除。

15.4.11临时表空间

用户创建的临时表和临时表在磁盘上的内部共享临时表空间中创建。这个innodb_temp_data_file_path配置选项定义的相对路径、名称、大小、和属性的临时表空间数据文件。如果没有指定任何值为innodb_temp_data_file_path,默认行为是创建一个自动扩展数据文件命名ibtmp1innodb_data_home_dir目录,略大于12mb。

临时表空间是在正常停机或中断初始化删除,并重新启动服务器的每个时间。临时表空间接收动态生成的空间ID创建时。启动,如果临时表空间不能创造拒绝。临时表空间是不是如果服务器停止意外删除。在这种情况下,数据库管理员可以删除临时表空间或手动重启服务器,删除和重新创建临时表空间自动。

临时表空间不能位于原装置。

INFORMATION_SCHEMA.FILES提供的元数据InnoDB临时表空间。类似于这一问题的查询来查看临时表空间元数据:

mysql> SELECT * FROM INFORMATION_SCHEMA.FILES WHERE TABLESPACE_NAME='innodb_temporary'\G

INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO提供元数据的用户创建的临时表,是目前活跃在InnoDB实例。有关更多信息,参见第15.14.7,“InnoDB information_schema临时表信息表”

管理临时表空间的数据文件的大小

默认情况下,临时表空间的数据文件autoextending和增加尺寸以满足磁盘上的临时表。例如,如果一个操作创建一个临时表是20MB大小,临时表空间的数据文件,这是默认的大小12mb时创建,扩展的大小以容纳它。当临时表下降,释放的空间可用于新的临时表,但数据文件仍然在扩大规模。

一个autoextending临时表空间数据文件可能会变得很大,大的环境中使用临时表或临时表的广泛使用。一个大的数据文件也会因长时间运行的查询,使用临时表。

要确定一个临时表空间的数据文件autoextending,检查innodb_temp_data_file_path设置

MySQL的>SELECT @@innodb_temp_data_file_path;------------------------------ | @ @ InnoDB _ _文件日期时间_ _路径| ------------------------------ | ibtmp1::autoextend | ------------------------------ 12M

检查临时表空间的数据文件的大小,查询INFORMATION_SCHEMA.FILES使用查询类似这样的表:

MySQL的>SELECT FILE_NAME, TABLESPACE_NAME, ENGINE, INITIAL_SIZE, TOTAL_EXTENTS*EXTENT_SIZEAS TotalSizeBytes, DATA_FREE, MAXIMUM_SIZE FROM INFORMATION_SCHEMA.FILESWHERE TABLESPACE_NAME = 'innodb_temporary'\G*************************** 1。行:*************************** file_name。/ ibtmp1tablespace_name:innodb_temporary引擎:InnoDB initial_size:12582912:12582912:6291456 totalsizebytes data_free maximum_size:空

这个TotalSizeBytes价值报告的临时表空间数据文件的当前大小。有关其他字段的值,看24.9节,“information_schema文件表”

或者,你可以检查你的操作系统的临时表空间的数据文件的大小。默认情况下,临时表空间的数据文件位于定义的目录innodb_temp_data_file_path配置选项。如果一个值是不是该选项明确规定,临时表空间数据文件命名ibtmp1创建innodb_data_home_dir,默认为MySQL数据目录,如果没有指定。

回收的临时表空间的数据文件占用的磁盘空间,你可以重新启动MySQL服务器。重新启动服务器删除并重新创建临时表空间的数据文件,根据定义的属性innodb_temp_data_file_path

为了防止临时数据文件太大,您可以配置innodb_temp_data_file_path选项指定的最大文件大小。例如:

[mysqld]innodb_temp_data_file_path=ibtmp1:12M:autoextend:max:500M

当数据文件的最大大小,查询失败,错误指示,桌上摆满了。配置innodb_temp_data_file_path需要重新启动服务器

或者,您可以配置default_tmp_storage_engineinternal_tmp_disk_storage_engine选项,它定义了存储引擎使用用户创建磁盘内部临时表,分别。这两个选项设置为InnoDB默认情况下。这个MyISAM存储引擎使用一个单独的文件为每个临时表,这是拆除时,临时表被删除。

临时表UNDO日志

临时表撤消日志保存在临时表空间,用于临时表和相关的对象。临时表不重做撤消的日志记录,因为他们没有崩溃中恢复所需的。他们只用于回滚在服务器正在运行。这种特殊类型的UNDO日志好处表现避免重做日志我/ O.

这个innodb_rollback_segments配置选项定义的临时表空间使用的回滚段的数量。

15.4.12重做日志

重做日志是一个基于磁盘的数据结构在崩溃恢复用不完整交易数据的正确书写。在正常操作下,重做日志编码要求改变InnoDB表格数据从SQL语句或低级API调用的结果。修改未完成更新数据文件被意外关机前自动初始化时,和之前的连接被接受。关于重做日志在崩溃恢复作用的信息,参见第15.17.2,“InnoDB恢复”

默认情况下,重做日志被表示为磁盘上的一组文件,命名为ib_logfile0ib_logfile1。MySQL写入重做日志文件在一个循环方式。在重做日志中记录的影响来编码数据;这些数据统称为重做。通过重做日志是日益为代表的数据通道LSN价值

相关的信息,看:

15.4.12.1组提交日志冲洗

InnoDB,像任何其他兼容的数据库引擎,冲重做日志文件一个事务在提交之前InnoDB使用集团承诺功能组多冲洗请求一起避免为每一个冲犯。集团承诺,InnoDB问题一个写入日志文件的多个用户交易的承诺大约在同一时间执行提交操作,大大提高了吞吐量。

关于性能的更多信息COMMIT和其他事务操作,看第8.5.2,“优化InnoDB事务管理”

15.5 InnoDB锁和事务模型

实现一个大规模的,忙碌的,或高度可靠的数据库应用程序,从一个不同的数据库系统的大量代码的端口,或调整MySQL的性能,重要的是要了解InnoDB锁定和InnoDB交易模型

本节讨论相关的几个问题InnoDB锁定和InnoDB交易模型,你应该熟悉。

15.5.1 InnoDB锁定

本节描述了使用的锁定类型InnoDB

共享和独占锁

InnoDB实现标准的行级锁,那里有两种类型的锁,共享(S)锁独家的X)锁

如果交易T1持有共享(S)锁定行R,然后从一些不同的交易请求T2对行锁R做如下处理:

  • 一个请求T2对于一个S锁可以立即授予。作为一个结果,两T1T2持有S锁上R

  • 一个请求T2对于一个X锁不能立即授予

如果一个交易T1拥有一个专属(X)锁定行R从一些不同的交易请求,T2一个锁的类型R不能立即授予。相反,交易T2必须等待交易T1在连续释放锁r

意向锁

InnoDB支持多粒度封锁这允许共存的行锁和表锁。例如,像这样的语句LOCK TABLES ... WRITE需要一个互斥锁(一X对指定的表锁)。使锁的多粒度层次实践,InnoDB使用意向锁。意向锁的表级锁,表明哪些类型的锁(共享或独占)交易的要求后,表中的一行。有两种类型的意向锁:

  • 一个意向共享锁IS)表明交易拟设置共享我们个人的行锁在桌子上。

  • 一个意向排它锁IX)表示,交易计划表中的单个行上设置专用锁。

例如,SELECT ... FOR SHARE锁,和SELECT ... FOR UPDATE锁具

意向锁协议如下:

  • 在交易前可以获得一个共享锁在一个表中的行,它必须首先获得IS锁或更强的桌上

  • 在交易前可以对一个表中的一个排他锁,它必须首先获得IX桌子上的锁

表级锁类型兼容以下矩阵。

XIXSIS
X冲突冲突冲突冲突
IX冲突兼容的冲突兼容的
S冲突冲突兼容的兼容的
IS冲突兼容的兼容的兼容的

锁授予请求交易如果是与现有的锁具兼容,但如果它与现有的锁冲突。一个事务等待直到冲突存在的锁被释放。如果与现有锁不锁请求的冲突是理所当然的因为这会导致死锁,发生了一个错误

意向锁不块除了全表要求什么(例如,LOCK TABLES ... WRITE)。意向锁的主要目的是表明一个人是锁定一行,或将锁表的行中。

对于一个意向锁的交易数据出现了类似于下面的SHOW ENGINE INNODB STATUSInnoDB监视器输出:

TABLE LOCK table `test`.`t` trx id 10080 lock mode IX

记录锁

记录锁在一个索引记录锁。例如,SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE;防止其他事务插入、更新或删除行的价值在哪里t.c110

记录锁锁住索引记录,甚至如果一个表没有索引的定义。对于这样的情况,InnoDB创建一个隐藏的聚集索引,使用该索引记录锁。看到第15.8.2.1,“聚集和二级指标”

一个记录锁定交易数据出现类似以下SHOW ENGINE INNODB STATUSInnoDB监视器输出:

RECORD LOCKS space id 58 page no 3 n bits 72 index `PRIMARY` of table `test`.`t` 
trx id 10078 lock_mode X locks rec but not gap
Record lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
 0: len 4; hex 8000000a; asc     ;;
 1: len 6; hex 00000000274f; asc     'O;;
 2: len 7; hex b60000019d0110; asc        ;;

间隙锁

一个间隙锁是索引记录之间的间隙锁,或锁上的差距在第一个或最后一个索引记录后。例如,SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE;可以防止其他事务插入的值十五成列t.c1,是否已经有任何这样的列中的值,因为在范围内的所有现有值之间的差距被锁定。

差距可能跨越单个指标值,多个索引值,甚至是空的。

间隙锁的性能和并发性之间的权衡,并在某些事务隔离级别而不是别人。

间隙锁不锁行语句使用一个独特的索引搜索的独特需要行。(这不包括的情况下,搜索条件只包括一些列多列唯一索引;在这种情况下,间隙锁定发生。)例如,如果id列具有唯一索引,以下声明只使用一个列有索引记录锁身份证件值,不管其他会话插入行在前面的缺口问题:

SELECT * FROM child WHERE id = 100;

如果id是不是有一个非唯一索引或索引,声明不锁前间隙。

值得一提的是冲突的锁可以被不同的事务在一个间隙举行。例如,交易可以持有共享锁(S -锁上的差距差距差距而事务B)拥有独家间隙锁(gap X-lock)在同一间隙。矛盾的间隙锁允许的原因是如果一个记录从索引中清除,间隙锁由不同的交易于记录必须合并。

间隙锁InnoDB纯粹的抑制,这意味着他们唯一的目的是防止其他事务插入的间隙。间隙锁可以共存。一个交易采取间隙锁不能防止另一个事务采取相同的间隙间隙锁。有共享和独占锁之间的差距没有区别。它们彼此不冲突,他们执行相同的功能。

间隙锁可以禁用明确。如果发生这种情况你更改事务隔离级别READ COMMITTED。在这种情况下,间隙锁是搜索和索引扫描和残疾人只用于外键约束检查和重复键检查。

也有其他影响使用READ COMMITTED隔离级别。记录锁不匹配的行被释放后MySQL的评估哪里条件为UPDATE声明,InnoDB做一个半一致读一读,这样它返回最新提交的版本的MySQL,MySQL可以决定是否行匹配WHERE条件的UPDATE

下一个关键的锁

下一个关键的锁是索引记录之前的组合的索引记录,对间隙间隙锁记录锁。

InnoDB执行行级锁定在这样一种方式,当搜索或者扫描表的索引,它集共享或独占锁的索引记录的遭遇。因此,行级锁实际上是索引记录锁。在索引记录锁也影响未来的关键Gap索引记录之前。这是一个next-key锁是一个索引记录锁加上索引记录锁间隙的间隙。如果一个会话有一个共享或独占锁定记录R在一个指数,另一个会话不能插入间隙中一个新的索引记录之前R在索引顺序

假设索引包含值10, 11, 13,和20。可能下钥匙锁这个指标涵盖以下区间,在圆括号表示区间端点的排斥和方括号表示端点夹杂:

(negative infinity, 10]
(10, 11]
(11, 13]
(13, 20]
(20, positive infinity)

在最后一个区间,下一个关键的锁锁在上面的指标最大值和差距上确界伪记录具有高于实际指数的任何值。确是不是一个真正的索引记录,所以,实际上,这下钥匙锁锁只有最大索引值后面的间隙。

默认情况下,InnoDB工作在REPEATABLE READ事务隔离级别。在这种情况下,InnoDB使用搜索和索引扫描下钥匙锁,以防止幻影行(见第15.5.4,“Phantom Rows”

下一个关键锁交易数据出现类似以下SHOW ENGINE INNODB STATUSInnoDB监视器输出:

RECORD LOCKS space id 58 page no 3 n bits 72 index `PRIMARY` of table `test`.`t` 
trx id 10080 lock_mode X
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
 0: len 8; hex 73757072656d756d; asc supremum;;

Record lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
 0: len 4; hex 8000000a; asc     ;;
 1: len 6; hex 00000000274f; asc     'O;;
 2: len 7; hex b60000019d0110; asc        ;;

插入意向锁

插入意向锁是一种间隙锁设置INSERT行之前插入操作。这锁信号的意图将在这样一种方式,多个事务插入同一指标的差距不需要如果他们不是插在缝隙内的同一位置等待对方。假设有一个记录索引值4和7。两个事务试图插入5和6,值,每个锁间隙4-7之间插入意向锁获取插入行的排他锁之前,但没有阻止对方因为排不冲突。

下面的示例演示了一个交易以插入意向锁来获取插入记录独占锁之前。这个例子涉及到两个客户,A和B。

客户端创建一个表包含两个索引记录(90%和102),然后开始一个地方的索引记录大于100 ID独占锁的事务。独占锁包括前记录102间隙锁:

mysql> CREATE TABLE child (id int(11) NOT NULL, PRIMARY KEY(id)) ENGINE=InnoDB;
mysql> INSERT INTO child (id) values (90),(102);

mysql> START TRANSACTION;
mysql> SELECT * FROM child WHERE id > 100 FOR UPDATE;
+-----+
| id  |
+-----+
| 102 |
+-----+

客户端B开始一个事务插入一条记录到间隙。交易需要插入意向锁等待获取排他锁在。

mysql> START TRANSACTION;
mysql> INSERT INTO child (id) VALUES (101);

对于插入意向锁的交易数据出现了类似于下面的SHOW ENGINE INNODB STATUSInnoDB监视器输出:

RECORD LOCKS space id 31 page no 3 n bits 72 index `PRIMARY` of table `test`.`child`
trx id 8731 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 3 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
 0: len 4; hex 80000066; asc    f;;
 1: len 6; hex 000000002215; asc     " ;;
 2: len 7; hex 9000000172011c; asc     r  ;;...

自动锁定股份有限公司

一个AUTO-INC锁是一种特殊的表级锁的事务插入的表了汽车专栏在最简单的情况下,如果一个事务插入的值插入表中,任何其他事务必须等待自己做的插入,表格,以便行第一个事务插入接收连续的主键值。

这个innodb_autoinc_lock_mode配置选项控制算法用于自动增量锁定。它允许你选择如何权衡自动增量值和最大并发可预测的序列之间插入操作。

有关更多信息,参见第15.8.1.5,”auto_increment InnoDB”处理

空间索引谓词锁

InnoDB支持空间含空间列列的索引(见第11.5.9,优化空间分析

处理业务涉及锁定SPATIAL下一个关键指标,锁定不工作的支持REPEATABLE READSERIALIZABLE事务隔离级别。没有绝对的顺序概念的多维数据,所以不清楚这是下一个钥匙

为了使表的隔离级别的支持SPATIAL指标,InnoDB使用谓词锁。一SPATIAL索引包含最小边界矩形(MBR)的值,所以InnoDB执行一致性读的指标设置用于查询MBR值谓词锁。其他事务不能插入或修改的行,将匹配的查询条件。

15.5.2 InnoDB事务模型

InnoDB交易模型,目标是将一个性能最好多版本与传统的两相锁定数据库。InnoDB执行锁定在列级和运行查询非锁定一致性读默认情况下,Oracle数据库中的风格。锁定信息InnoDB存储空间使锁升级是不需要的。通常情况下,多个用户可以锁定每一行InnoDB表,或任何随机子集的行,而不引起InnoDB记忆枯竭

15.5.2.1事务隔离级

事务是数据库处理的基础。隔离是我的缩写;隔离级别是微调的性能和可靠性,平衡一致性和可重复性的结果,当多个事务正在改变同时进行查询。

InnoDB提供的所有四个事务隔离级别由SQL描述:1992标准:READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READ,和SERIALIZABLE。默认的隔离级别InnoDBREPEATABLE READ

用户可以更改一个会议或与随后的所有连接的隔离级别SET TRANSACTION声明。设置所有连接服务器的默认隔离级别,使用--transaction-isolation在命令行或在一个选项文件选项。关于隔离级别和级别设置语法的详细信息,参见第13.3.7,“事务语法”

InnoDB支持每个事务隔离级别的描述在这里使用不同锁定策略你可以执行高度一致的默认REPEATABLE READ水平,对关键数据的操作合规是重要的。或者你可以放松一致性规则READ COMMITTED甚至READ UNCOMMITTED在这种情况下,散装报告精确的一致性和可重复的结果比最小化锁定的开销数量不重要。SERIALIZABLE强制执行更严格的规则比REPEATABLE READ,并主要用于专业的情况,如XA交易和并发性和故障问题死锁

下面的列表描述了MySQL支持不同的交易水平。单从最常用的水平,使用最少的。

  • REPEATABLE READ

    这是默认的隔离级别InnoDB一致性读在同一个事务读取快照在第一次读了。这意味着如果你问题的几种普通(非锁定)SELECT在相同的交易报表,这些SELECT陈述是一致的也就彼此。看到第15.5.2.3,“一致的非锁定读”

    锁定读SELECT更新FOR SHARE),UPDATE,和DELETE报表,锁定取决于语句使用唯一索引的一个独特的搜索条件,或一系列类型的搜索条件。

    • 一个独特的试验指标与搜索条件,InnoDB唯一的索引记录发现锁,不Gap在它之前

    • 对于其他搜索条件,InnoDB锁的索引范围扫描,使用间隙锁下一个关键的锁块插入到其他课程所覆盖的区域差距。关于间隙锁next-key锁信息,看第15.5.1,“InnoDB锁定”

  • READ COMMITTED

    每个一致性读,即使在同一个事务,集和读自己的新快照。关于一致性读的信息,参见第15.5.2.3,“一致的非锁定读”

    锁定读(SELECT更新FOR SHARE),UPDATE报表,并DELETE声明,InnoDB唯一索引记录锁,不是差距在他们面前,从而允许插入新记录的自由下锁定记录。间隙锁仅用于外键约束检查和重复键检查。

    因为间隙锁是禁用的,可能会出现幽灵的问题,其他会话可以插入新的行插入空白。关于幻影,看第15.5.4,“Phantom Rows”

    只有基于行的二进制日志的支持与READ COMMITTED隔离级别。如果你使用提交读binlog_format=MIXED,服务器自动使用基于行的日志。

    使用READ COMMITTED有其他的作用:

    • UPDATEDELETE声明,InnoDB持有锁只为它更新或删除行。记录锁不匹配的行被释放后MySQL的评估WHERE条件这大大减少了死锁的可能性,但他们仍然可以发生。

    • UPDATE报表,如果行已锁定,InnoDB执行半一致阅读,返回最新的提交版本MySQL,MySQL可以决定是否行匹配WHERE条件的UPDATE。如果行匹配(必须更新),MySQL读取行这一次又InnoDB无论是锁或等待锁定它。

    考虑下面的例子,从这张桌子:

    CREATE TABLE t (a INT NOT NULL, b INT) ENGINE = InnoDB;
    INSERT INTO t VALUES (1,2),(2,3),(3,2),(4,3),(5,2);
    COMMIT;
    

    在这种情况下,表没有索引,所以搜索和索引扫描使用隐藏的聚集索引记录锁(见第15.8.2.1,“聚集和二级指标”)而非索引列

    假设一个会话执行UPDATE使用这些语句:

    # Session ASTART TRANSACTION;UPDATE t SET b = 5 WHERE b = 3;

    假设第二会话执行UPDATE通过执行这些语句后的第一次会议:

    # Session BUPDATE t SET b = 4 WHERE b = 2;

    作为InnoDB实行各UPDATE,它首先获取每一个排他锁,然后决定是否修改。如果InnoDB不修改行时,它将释放锁。否则,InnoDB保留锁直到事务结束。这会影响事务处理如下。

    使用默认的时REPEATABLE READ第一级分离,UPDATE获得每一行,一个他读不释放任何人:

    X-lock(1.2);retain X-Lockx-lock(2.3);Update(2.3)to(2.5);retain X-Lockx-lock(3.2);retain x-ockx-lock(4.3);update(4.3)to(4.5);retain X-Lockx-lock(5.2);retain X-lock

    第二UPDATE块,只要它试图获取任何锁(因为第一次更新保留锁定所有行),而不进行直到第一UPDATE提交或回滚:

    他(1,2);阻塞并等待第一次更新提交或回滚

    如果READ COMMITTED代替,第一UPDATE每行一个他获得它读取并释放那些不修改的行:

    X-lock(1.2);unlock(1.2)x-lock(2.3);Update(2.3)to(2.5);retain X-Lockx-lock(3.2);unlock(3..2)x-lock(4.3);update(4.3)to(4.5);retain X-Lockx-Lock(5.2);UNlock(5.2)

    第二UPDATEInnoDB做一个半一致阅读,返回最新的提交版本每行读取MySQL,MySQL可以决定是否行匹配WHERE条件的UPDATE

    的X锁(1.2);(2)Update to retain X(1);(2);lockx锁锁解锁(2)×(3);(3)Update to retain X(3);(4);lockx锁解锁锁(X(4)更新(2);(4);2)to retain X锁

    然而,如果WHERE条件包括一个索引列,和InnoDB使用索引、唯一索引列时是考虑采取和保持记录锁。在下面的例子中,第一个UPDATEtakes and retains an x-lock on each row where b = 2. The secondUPDATE块,当它试图获得对同一记录x-locks,因为它也使用索引定义在B栏

    CREATE TABLE t (a INT NOT NULL, b INT, c INT, INDEX (b)) ENGINE = InnoDB;INSERT INTO t VALUES (1,2,3),(2,2,4);COMMIT;# Session ASTART TRANSACTION;UPDATE t SET b = 3 WHERE b = 2 AND c = 3;# Session BUPDATE t SET b = 4 WHERE b = 2 AND c = 4;

    影响使用READ COMMITTED隔离级别是使不一样innodb_locks_unsafe_for_binlog配置选项,这些例外:

    READ COMMITTED因此提供更精细和更灵活的控制比innodb_locks_unsafe_for_binlog

  • READ UNCOMMITTED

    SELECT报表是一个非锁定的方式进行,但一个可能的早期行版本可以使用。因此,使用这种隔离级别,这样的阅读是不一致的。这也被称为脏读。否则,该隔离级别的作品像READ COMMITTED

  • SERIALIZABLE

    这个水平是一样的REPEATABLE READ,但InnoDB隐式转换所有的平原SELECT报表SELECT ... FOR SHARE如果autocommit被禁用。如果autocommit启用的SELECT是自己的事务。因此它是只读和可序列化,如果作为一个一致的表现(非锁定)读不需要为其他交易块。(力平SELECT阻止其他事务修改如果选定行,禁用autocommit。)

15.5.2.2自动提交,提交和回滚

进入InnoDB,所有用户的活动发生在一个交易。如果autocommit模式被启用,每个SQL语句本身构成了一个单一的交易。默认情况下,MySQL开始为每个新连接的会话autocommit启用,所以MySQL并提交每个SQL语句如果声明没有返回一个错误后。如果一个语句将返回一个错误,提交或回滚的行为取决于误差。看到第15.20.4,“InnoDB错误处理”

一个会话,autocommit使得可以通过启动与一个明确的执行多个语句的事务START TRANSACTIONBEGIN这一声明结束COMMITROLLBACK声明。看到第13.3.1条,“开始事务,提交和回滚语法”

如果autocommit在一个会话模式禁用SET autocommit = 0,会议总是有一个交易开放。一COMMITROLLBACK语句结束当前事务和建立一个新的开始。

如果一个会话,autocommit残端没有明确承诺最终成交,MySQL回滚事务。

有些语句隐式地结束一个交易,如果你做了COMMIT在执行该语句。详情见13.3.3部分,”声明,因为一个隐含的承诺”

COMMIT意味着在当前事务中所做的更改是永久性的,成为其他会话可见。一ROLLBACK声明,另一方面,取消当前事务的所有修改。两COMMITROLLBACK释放所有InnoDB锁被设置在目前的交易。

分组DML操作与交易

默认情况下,连接到MySQL服务器开始自动提交自动提交模式下,每一个为你执行SQL语句。这种操作模式可能如果你有与其他数据库系统的经验是陌生的,在它发行一系列的标准实施规程DML声明和提交或回滚它们一起。

使用多个表交易,开关自动提交了SQL语句SET autocommit = 0每个交易结束COMMITROLLBACK适当的。离开自动提交,开始一个事务START TRANSACTION最后用COMMITROLLBACK。下面的示例显示了两个交易。第一个承诺;二是回滚。

内核>mysql test
MySQL的>CREATE TABLE customer (a INT, b CHAR (20), INDEX (a));查询行,0行受影响(0秒)MySQL >-- Do a transaction with autocommit turned on.MySQL的>START TRANSACTION;查询行,0行受影响(0秒)MySQL >INSERT INTO customer VALUES (10, 'Heikki');查询行,1行的影响(0秒)MySQL >COMMIT;查询行,0行受影响(0秒)MySQL >-- Do another transaction with autocommit turned off.MySQL的>SET autocommit=0;查询行,0行受影响(0秒)MySQL >INSERT INTO customer VALUES (15, 'John');查询行,1行的影响(0秒)MySQL >INSERT INTO customer VALUES (20, 'Paul');查询行,1行的影响(0秒)MySQL >DELETE FROM customer WHERE b = 'Heikki';查询行,1行的影响(0秒)MySQL >-- Now we undo those last 2 inserts and the delete.MySQL的>ROLLBACK;查询行,0行受影响(0秒)MySQL >SELECT * FROM customer;————| A B | | ------ -------- | 10 |海基|————在1行集(0.00美国证券交易委员会(SEC)的MySQL >
在交易客户端语言

在API如PHP、Perl、JDBC、ODBC或标准C调用接口的MySQL,你可以发送如事务控制语句COMMITMySQL服务器的字符串就像任何其他SQL语句等SELECTINSERT。一些API还提供单独的特殊事务的提交和回滚功能或方法。

15.5.2.3一致的非锁定读

一致性读意味着InnoDB采用多版本提出的查询在某个时间点的快照数据库。查询看到,承诺之前的时间点交易做出了改变,并没有改变后或未提交的事务了。此规则的例外是,查询看到了早些时候的声明在同一事务的更改。这种异常的原因以下异常:如果你更新表中的某些行,一SELECT看到更新的行的最新版本,但它也可能看到老版本的任何行。如果其他会话的同时更新同一个表,异常意味着你可能在一个国家,也不存在数据库见表。

如果交易隔离级别REPEATABLE READ(默认级别),所有的一致性读在同一事务中读到的第一个这样的阅读交易建立快照。你可以为你的查询更新快照提交当前事务后,发行新的查询。

READ COMMITTED隔离级别,每个一致读事务内的设置和读取自己的新鲜的快照。

一致性读是在默认模式InnoDB过程SELECT报表READ COMMITTEDREPEATABLE READ隔离级别。一致读不设置任何锁表的访问,因此其他会话可以自由修改这些表在同一时间一致的阅读是在桌子上进行。

假设你是在默认的运行REPEATABLE READ隔离级别。当你发出一个一致性读(就是一个普通的SELECTstatement),InnoDB给您的交易时间根据你看到的数据库查询。如果另一个事务删除行,提交后被分配你的时间,你不看行已被删除。插入和更新同样对待。

笔记

数据库状态的快照应用于SELECT在一个事务中的语句,不一定DML声明.如果你插入或修改一些行然后提交一个事务,DELETEUPDATE从另一个并行发表声明可重复读交易可能影响那些刚刚犯行,即使会议无法查询。如果一个事务更新或删除由不同的交易犯行,这些改变也成为当前事务可见。例如,你可能会遇到的情况如下:

SELECT COUNT(c1) FROM t1 WHERE c1 = 'xyz';
-- Returns 0: no rows match.
DELETE FROM t1 WHERE c1 = 'xyz';
-- Deletes several rows recently committed by other transaction.

SELECT COUNT(c2) FROM t1 WHERE c2 = 'abc';
-- Returns 0: no rows match.
UPDATE t1 SET c2 = 'cba' WHERE c2 = 'abc';
-- Affects 10 rows: another txn just committed 10 rows with 'abc' values.
SELECT COUNT(c2) FROM t1 WHERE c2 = 'cba';
-- Returns 10: this txn can now see the rows it just updated.

你可以通过提交你的交易,然后做另一个提升你的时间SELECTSTART TRANSACTION WITH CONSISTENT SNAPSHOT

这就是所谓的多版本并发控制

在下面的例子中,会议认为行插入B只有B犯了插入和承诺为好,这样的时间点是先进的过去犯B.

             Session A              Session B

           SET autocommit=0;      SET autocommit=0;
time
|          SELECT * FROM t;
|          empty set
|                                 INSERT INTO t VALUES (1, 2);
|
v          SELECT * FROM t;
           empty set
                                  COMMIT;

           SELECT * FROM t;
           empty set

           COMMIT;

           SELECT * FROM t;
           ---------------------
           |    1    |    2    |
           ---------------------

如果你想看到的新鲜的数据库的状态,可以使用READ COMMITTED隔离级别或锁定读

SELECT * FROM t FOR SHARE;

READ COMMITTED隔离级别,每个一致读事务内的设置和读取自己的新鲜的快照。与分享,锁定读发生相反:一SELECT含有新鲜街区行结束事务(见第15.5.2.4,锁定读”

一致性读不超过一定的DDL语句:

  • 一致性读不工作DROP TABLE,因为MySQL不能使用表已经下降InnoDBdestroys桌

  • 一致性读不工作ALTER TABLE,因为声明对原表临时复制和删除原表当临时复制是建立。当你重新一致读的事务中,新表中的行不可见,因为那些行不存在交易时的快照拍摄。在这种情况下,交易会返回一个错误:ER_TABLE_DEF_CHANGED表的定义已经改变,请重试事务

阅读不同类型为选择条款如INSERT INTO ... SELECTUPDATE ... (SELECT),和CREATE TABLE ... SELECT不指定更新FOR SHARE

  • 默认情况下,InnoDB使用更强的锁,SELECT部分像READ COMMITTED,每个一致性读,即使在同一个事务,集和读自己的新快照。

  • 在这种情况下,使用一致的读取,设置事务的隔离级别READ UNCOMMITTEDREAD COMMITTED,或REPEATABLE READ(这是比其他任何东西SERIALIZABLE)。在这种情况下,没有锁上设置从选定表中读取行。

15.5.2.4锁定读取

如果你的查询数据,然后插入或更新相关的数据在相同的事务,定期SELECT声明没有提供足够的保护。其他事务可以更新或删除一行你查询。InnoDB支持两种类型的锁定读提供额外的安全:

  • SELECT ... FOR SHARE

    设置一个共享模式锁在任何行,读。其他会议可以读取数据,但不能修改它们,直到你的事务提交。如果这些行被另一个事务未提交的改变,你的查询等待直到交易结束,然后用新的值。

    笔记

    SELECT ... FOR SHARE是一种替代选择锁在共享模式,但LOCK IN SHARE MODE仍然可以向后兼容。语句是等价的。然而,分享支持OF table_name不等待,和SKIP LOCKED选项看到锁定读并发NOWAIT跳过锁定

  • SELECT ... FOR UPDATE

    索引记录搜索的邂逅,锁定行和任何相关的指标项,如你一样发出UPDATE这些行的声明。其他事务不能更新的行,做选择分享,或在某些事务隔离级别的数据读取。一致性读忽略在阅读观存在的记录集任何锁。(一个记录不能老版本被锁定;他们重建的应用UNDO日志在记录的内存拷贝。)

这些条款主要是有用的在处理树形结构和图结构的数据,无论是在单个表或多个表的分裂。你横边或树枝从一地到另一地,而保留的权利来改变这些指针价值观

设置的所有锁FOR SHARE更新查询被释放时,提交或回滚事务。

笔记

锁定读取只能自动提交时禁用(无论是开始交易START TRANSACTION或通过设置autocommit这是0

锁定读条款外声明不锁表的行在一个嵌套的子查询除非锁定阅读条款也在查询中指定的。例如,下面的语句不锁表行t2

SELECT * FROM t1 WHERE c1 = (SELECT c1 FROM t2) FOR UPDATE;

锁表行t2,添加一个锁读条款查询:

SELECT * FROM t1 WHERE c1 = (SELECT c1 FROM t2 FOR UPDATE) FOR UPDATE;
锁定读取示例

假设你想插入到表中插入新的一行child,并确保孩子排在表的父行父母。您的应用程序代码可以保证整个操作程序参照完整性。

首先,使用一致的读取查询表PARENT确认母行的存在。你可以安全地插入子行表儿童?不,因为一些其他会话可以删除父行之间的时刻你SELECT和你的插入,而你意识到这

为了避免这个潜在的问题,执行SELECT使用分享

SELECT * FROM parent WHERE NAME = 'Jones' FOR SHARE;

FOR SHARE查询返回母“琼斯”,你可以安全地添加子记录的CHILD表格和提交事务。任何交易,试图获取排他锁在适用的排在父母表等到你完成了,那是,直到所有表中的数据是一致的状态。

另一个例子,考虑一个整数计数器表中的字段CHILD_CODES,用于分配一个唯一的标识符,每个孩子添加到表儿童。不使用一致性读或共享的方式读计数器的当前值,因为两个数据库的用户可以看到计数器的值相同,并重复键错误发生如果两个事务试图用相同的标识符添加行CHILD

在这里,FOR SHARE是不是一个好的解决方案,因为如果两个用户同时读取计数器,其中至少有一个在结束僵局时,它试图更新计数器。

实施阅读和递增计数器,先进行锁定读取计数器的使用FOR UPDATE,然后计数器增量。例如:

SELECT counter_field FROM child_codes FOR UPDATE;UPDATE child_codes SET counter_field = counter_field + 1;

SELECT ... FOR UPDATE是可获得的最新数据,设置专用锁,每行读取。因此,它集相同的锁,搜索SQLUPDATE将行

前面的描述仅仅是一个例子SELECT ... FOR UPDATE作品.在MySQL数据库中,生成一个唯一标识特定的任务可以只使用一个单一的访问表的实现:

UPDATE child_codes SET counter_field = LAST_INSERT_ID(counter_field + 1);SELECT LAST_INSERT_ID();

这个SELECT声明只是检索标识信息(具体到当前的连接)。它不使用任何表。

锁定读并发NOWAIT跳过锁定

如果行加锁的事务,SELECT ... FOR UPDATE选择分享交易请求相同的锁定行必须等到阻塞事务释放行锁。该行为阻止事务更新或删除行,查询被其他事务更新。然而,等待行锁被释放不必要的如果你想查询返回时立即请求的行被锁定,或如果不包括锁定行的结果集是可以接受的。

为了避免等待其他事务释放行锁,NO WAIT跳过锁定选择may be used withSELECT ... FOR UPDATE选择分享锁定读语句

  • NOWAIT

    锁定阅读使用NOWAIT不要等待获取锁。查询立即执行,没有一个错误如果请求的行锁。

  • SKIP LOCKED

    锁定阅读使用SKIP LOCKED不要等待获取锁。执行查询立即解除闭锁行的结果集。

    笔记

    跳过锁定行返回不一致的数据视图查询。SKIP LOCKED因此不适合普通的事务性工作。然而,它可以用来避免锁争用时,多个会话访问同一队列的表。

NO WAIT跳过锁定只适用于行级锁

语句中使用NO WAIT跳过锁定是基于语句的复制不安全。

下面的示例演示NOWAIT跳过锁定。1届开始一个事务,行锁在一个单一的记录。2次尝试在同一记录锁定阅读使用NOWAIT选项因为请求的行由会话1锁定,锁定读立即返回一个错误。在第三节,锁定读跳过锁定返回请求的行除行是第一节锁。

# Session 1:

mysql> CREATE TABLE t (i INT, PRIMARY KEY (i)) ENGINE = InnoDB;

mysql> INSERT INTO t (i) VALUES(1),(2),(3);

mysql> START TRANSACTION;

mysql> SELECT * FROM t WHERE i = 2 FOR UPDATE;
+---+
| i |
+---+
| 2 |
+---+

# Session 2:

mysql> START TRANSACTION;

mysql> SELECT * FROM t WHERE i = 2 FOR UPDATE NOWAIT;
ERROR 3572 (HY000): Do not wait for lock.

# Session 3:

mysql> START TRANSACTION;

mysql> SELECT * FROM t FOR UPDATE SKIP LOCKED;
+---+
| i |
+---+
| 1 |
| 3 |
+---+          

15.5.3锁的不同设置SQL语句在InnoDB

锁定读,一个UPDATE,或DELETE一般设置在每个索引记录是在SQL语句的处理扫描记录锁。是否有问题哪里语句中的条件,排除行。InnoDB不记得确切的哪里条件,但只知道被扫描的索引范围。锁通常下一个关键的锁那块插入Gap之前的记录。然而,间隙锁紧可以禁用明确,导致不能用下键锁定。有关更多信息,参见第15.5.1,“InnoDB锁定”。事务隔离级别也会影响锁套;看第15.5.2.1,”事务隔离级别”

如果一次索引用于搜索和索引记录锁定是唯一的,InnoDB获取聚簇索引和套锁上。

如果你没有指标适合你的声明和MySQL必须扫描整个表中的表,表的每行被锁定,从而阻止所有插入由其他用户的表。它是创造良好的指标,这样你的查询不必要的扫描行数重要。

InnoDB设置特定的锁的类型如下。

  • SELECT ... FROM是一个一致性读,读数据库快照和设置没有锁,除非事务隔离级别设置为SERIALIZABLE。为SERIALIZABLE水平,搜索设置共享的索引记录它遇到下一个关键的锁。然而,只有一个索引记录锁是锁行语句使用一个独特的指标来寻找一个独特的行要求。

  • SELECT ... FOR UPDATESELECT ... FOR SHARE语句中使用唯一索引获取锁和释放锁的扫描行,行不符合包含在结果集(例如,如果他们不符合特定的标准哪里条款)。然而,在某些情况下,行可能不会马上解锁,因为结果行和源之间的关系,在查询过程中丢失了。例如,在一个UNION,扫描(锁)从一个表中的行可以被插入到一个临时表在评估他们是否符合资格的结果集。在这种情况下,在临时表中的行在原来的表中的行的关系失去了后者的行不上锁,直到查询执行结束。

  • 锁定读SELECT更新FOR SHARE),UPDATE,和DELETE报表,都取决于语句使用唯一索引的一个独特的搜索条件的锁,或一系列类型的搜索条件。

    • 一个独特的试验指标与搜索条件,InnoDB唯一的索引记录发现锁,不Gap在它之前

    • 另一种不同的条件,而非独特的条件,InnoDB锁的索引范围扫描,使用间隙锁下一个关键的锁块插入到其他课程所覆盖的区域差距。关于间隙锁next-key锁信息,看第15.5.1,“InnoDB锁定”

  • 索引记录搜索的遭遇,SELECT ... FOR UPDATE块其他会话做SELECT ... FOR SHARE或在某些事务隔离级别的阅读。一致性读忽略在阅读观存在的记录集任何锁。

  • UPDATE ... WHERE ...设置一个专属next-key锁在每个记录搜索的遭遇。然而,只有一个索引记录锁是锁行语句使用一个独特的指标来寻找一个独特的行要求。

  • 什么时候UPDATE修改一个聚集索引记录,隐锁是针对次级索引记录的影响。这个UPDATE操作也需要共享锁在受影响的辅助索引记录时执行重复检查扫描插入新的辅助索引记录之前,当插入新的辅助索引记录。

  • DELETE FROM ... WHERE ...设置一个专属next-key锁在每个记录搜索的遭遇。然而,只有一个索引记录锁是锁行语句使用一个独特的指标来寻找一个独特的行要求。

  • INSERT设置在插入一个排他锁。这把锁是一个索引记录锁,不下钥匙锁(即没有间隙锁)并不会阻止其他会话插入间隙插入行之前。

    在插入行之前,一种被称为间隙锁插入意向间隙锁设置。这锁信号的意图将在这样一种方式,多个事务插入同一指标的差距不需要如果他们不是插在缝隙内的同一位置等待对方。假设有一个记录索引值4和7。两个事务试图插入5和6每个锁的缺口4和7之间插入意向锁获取插入行的排他锁之前的值,但不阻止对方因为排不冲突。

    如果一个duplicate-key错误发生,一个共享锁的重复的索引记录集。使用一个共享锁会导致死锁在多个会话试图插入同一行,如果另一个会话已经独占锁。这可以在另一个session删除行时。假设一个InnoDBT1具有以下结构:

    CREATE TABLE t1 (i INT, PRIMARY KEY (i)) ENGINE = InnoDB;
    

    现在假设3届执行以下操作顺序:

    会话1:

    START TRANSACTION;
    INSERT INTO t1 VALUES(1);
    

    第二:

    START TRANSACTION;
    INSERT INTO t1 VALUES(1);
    

    会话3:

    START TRANSACTION;
    INSERT INTO t1 VALUES(1);
    

    会话1:

    ROLLBACK;
    

    通过1届的操作获取排他锁。运作会议2和3的结果都是一个重复键错误都要求行共享锁。当会话1回滚,它释放排它独占锁和共享锁请求的排队会话二、三是理所当然的。在这一点上,2届和3死锁:既不可以因为分享对方持有的锁获取排他锁。

    类似的情况发生,如果表已经包含关键值1和三届行按顺序执行如下操作:

    会话1:

    START TRANSACTION;
    DELETE FROM t1 WHERE i = 1;
    

    第二:

    START TRANSACTION;
    INSERT INTO t1 VALUES(1);
    

    会话3:

    START TRANSACTION;
    INSERT INTO t1 VALUES(1);
    

    会话1:

    COMMIT;
    

    通过1届的操作获取排他锁。通过会议和操作的结果都是一个重复键错误都要求行共享锁。当第一次提交时,它释放排它独占锁和共享锁请求的排队会话二、三是理所当然的。在这一点上,2届和3死锁:既不可以因为分享对方持有的锁获取排他锁。

  • INSERT ... ON DUPLICATE KEY UPDATE简单的白喉INSERT在专用锁,而不是一个共享锁放在行被更新时,重复键错误发生。独家索引记录锁为重复的主键值。独家next-key锁为一份独特的核心价值。

  • REPLACE像一个INSERT如果有一个独特的关键无碰撞。否则,独家next-key锁放置在排被取代。

  • INSERT INTO T SELECT ... FROM S WHERE ...设置一个唯一索引记录锁(没有间隙锁)在每一行插入T。如果事务隔离级别READ COMMITTEDInnoDB做搜索S作为一个一致性读(无锁)。否则,InnoDB设置共享行下关键锁SInnoDB在后者的情况下设置有锁:前滚恢复使用基于语句的二进制日志中,SQL语句都必须以完全相同的方式完成它是最初。

    CREATE TABLE ... SELECT ...执行SELECT共享下钥匙锁或一致读的,至于INSERT ... SELECT

    当一个SELECT用于构建替换选择…从在哪里…UPDATE t ... WHERE col IN (SELECT ... FROM s ...)InnoDB设置共享行从桌下钥匙锁s

  • 初始化一个先前指定的时AUTO_INCREMENT在表列,InnoDB设置关联的指标最终独占锁AUTO_INCREMENT专栏在访问自动递增计数器,InnoDB使用一个特定的AUTO-INC表锁模式,锁只持续到当前的SQL语句的结束,而不是整个交易结束。其他会议不能插入表时auto-inc表锁;看第15.5.2,“InnoDB事务模型”

    InnoDB取先前初始化值汽车没有设置任何锁柱

  • 如果一个FOREIGN KEY约束是一个表定义的任何插入、更新或删除需要约束条件进行检查记录集的共享锁的记录,它看起来在检查约束。InnoDB还设置这些锁的情况下,约束失败。

  • LOCK TABLES集表锁,但它是更高的MySQL层以上InnoDB层设置这些锁InnoDB意识到表锁如果innodb_table_locks = 1(默认的),autocommit = 0层以上,和mysqlInnoDB知道行级锁

    否则,InnoDB的自动死锁检测无法检测到死锁所涉及的如表锁。同时,因为在这种情况下,较高的MySQL层不知道行级锁,它是可能得到表上,另一个会话的当前行级锁表锁。然而,这并不影响交易的完整性,如在第15.5.5.2,“死锁检测和回滚”。参见第15.8.1.7”限制,InnoDB表”

15.5.4幻像行

所谓幻影问题发生在一个交易相同的查询时,产生不同的行在不同的时间。例如,如果一个SELECT执行两次,但第二次不是第一次返回的返回,该行是幻影

假设有一个指数上的id列的儿童桌上,你想读锁从桌子上有一个标识符值大于100的所有行,以更新一些列在选定行后的意图:

SELECT * FROM child WHERE id > 100 FOR UPDATE;

查询扫描指数从第一个开始记录id大于100。让表包含行有身份证件90和102的值。如果锁上设置索引记录的扫描范围不锁在空白的插入(在这种情况下,差距90%和102之间),另一个会话可以插入新的行插入表中的id101。如果你要执行同样的SELECT在同一个交易,你会看到新的一行身份证件101(一幻影)在查询返回的结果集。如果我们把一个集作为一个数据项,新幻影的孩子会违反交易,交易应该能够运行,它读取的数据不在交易过程中变化的隔离原理。

为了防止幻影,InnoDB使用一种算法称为下一个关键的锁结合索引行的差距锁定。InnoDB执行行级锁定在这样一种方式,当搜索或者扫描表的索引,它集共享或独占锁的索引记录的遭遇。因此,行级锁实际上是索引记录锁。此外,在索引记录锁也影响未来的关键Gap索引记录之前。这是一个next-key锁是一个索引记录锁加上索引记录锁间隙的间隙。如果一个会话有一个共享或独占锁定记录R在一个指数,另一个会话不能插入间隙中一个新的索引记录之前R在索引顺序

什么时候InnoDB扫描索引,它也可以在索引记录锁上后间隙。只是发生在前面的例子:为了防止插入表格的地方身份证件将超过100,由锁InnoDB包括对间隙锁后身份证件值102

你可以用下键锁定在你的程序中实现唯一性检查:如果你读你的数据共享模式,没有看到一排你要插入复制,然后你就可以安全地插入行,知道下一个钥匙锁在你的行的继任者在读阻止任何人同时插入你的行复制。因此,下一个关键的锁让你锁具表中不存在的东西

间隙锁可以禁用了第15.5.1,“InnoDB锁定”。这可能会导致问题,因为其他幽灵会话可以插入新的行插入空白间隙锁时禁用。

15.5.5死锁在InnoDB

死锁是在不同的交易无法继续因为每持有一个锁,其他的需求情况。因为交易双方正在等待资源可用,也没有释放它的锁。

死锁时可能发生的交易锁定多个表中的行(通过报表等UPDATESELECT ... FOR UPDATE),但在相反的顺序。死锁时也会出现这样的语句锁定范围的索引记录和空白,每个事务获得锁而不是别人由于时机问题。一个死锁的例子,看第15.5.5.1,“An InnoDB Deadlock”的例子

为了减少死锁的可能性,而不是使用交易LOCK TABLES报表;保持事务,插入或更新的数据足够小,他们不能长时间保持开放;当不同的事务更新的行多个表或大范围,使用同样的操作命令(如SELECT ... FOR UPDATE)在每笔交易中;用于列创建索引SELECT ... FOR UPDATEUPDATE ... WHERE声明.死锁的可能性不是由隔离级别的影响,因为隔离级别变化的读操作的行为,而死锁发生因为写操作。为避免从死锁状态恢复的更多信息,参见第15.5.5.3,“如何减少和Handle Deadlocks”

当死锁检测启用(默认)和死锁的发生,InnoDB检测和回滚一个事务的状态(受害人)。如果死锁检测是残疾人使用innodb_deadlock_detect选项配置InnoDB依靠innodb_lock_wait_timeout设置回滚事务在死锁的情况下。因此,即使你的应用程序的逻辑是正确的,你仍然必须处理的情况下,交易必须重试。在看到最后的僵局InnoDB用户交易,使用SHOW ENGINE INNODB STATUS命令。如果频繁死锁突出交易结构或应用程序错误处理的一个问题,一起跑innodb_print_all_deadlocks设置启用打印所有死锁信息mysqld错误日志。关于死锁的更多信息的自动检测与处理,见第15.5.5.2,“死锁检测和回滚”

15.5.5.1 InnoDB死锁的例子

下面的示例说明如何错误时可能会出现一个锁的请求会导致死锁。这个例子涉及到两个客户,A和B。

首先,客户端创建一个包含一行的表,然后开始一个事务。在交易中,一个得到一个S在共享模式选择的行锁:

MySQL的>CREATE TABLE t (i INT) ENGINE = InnoDB;查询行,0行受影响(1.07秒)MySQL >INSERT INTO t (i) VALUES(1);查询行,1行的影响(0.09秒)MySQL >START TRANSACTION;查询行,0行受影响(0秒)MySQL >SELECT * FROM t WHERE i = 1 FOR SHARE;------ |)| | 1 |??????

接下来,客户端B开始一个事务,并试图从表中删除行:

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

mysql> DELETE FROM t WHERE i = 1;

删除操作要求X锁具锁不被允许,因为它是不相容的S客户持有的锁,所以请求在队列的锁请求的行和客户B块。

最后,客户也尝试从表中删除行:

mysql> DELETE FROM t WHERE i = 1;
ERROR 1213 (40001): Deadlock found when trying to get lock;
try restarting transaction

死锁发生这里因为客户需求X锁定删除行。然而,锁定请求不被允许,因为客户端B已经有一个请求X锁和等待客户端发布S锁具也不能S通过将锁升级为举行X锁因为事先请求B的X锁具因此,InnoDB产生错误的一个客户和释放锁。客户端返回此错误:

ERROR 1213 (40001): Deadlock found when trying to get lock;
try restarting transaction

在这一点上,对于其他客户端的锁请求可以被授权和删除行的表。

15.5.5.2死锁检测和回滚

什么时候死锁检测启用(默认),InnoDB自动检测交易死锁回滚事务或交易打破僵局。InnoDB试图把小事务回滚,在一个事务的大小由行插入,更新或删除数决定。

InnoDB意识到表锁如果innodb_table_locks = 1(默认的),autocommit = 0,和MySQL层上面知道行级锁。否则,InnoDB无法检测到死锁在表锁的MySQLLOCK TABLES由一个比其他存储引擎的表或锁InnoDB参与。通过设定值的解决这些情况innodb_lock_wait_timeout系统变量

什么时候InnoDB执行完整的回滚一个事务,由交易释放所有锁。然而,如果只是一个单独的SQL语句回滚所导致的错误,提出的某些陈述的锁可以保存。这是因为InnoDB商店排锁在一种格式,它不知道后来这锁是由哪种说法。

如果一个SELECT调用存储功能在一个事务中,在函数声明中失败,那语句回滚。此外,如果ROLLBACK执行之后,整个事务回滚。

如果LATEST DETECTED DEADLOCKInnoDB监视器输出包括一个信息,在锁表waits-for图太深或长时间的搜索,我们将回滚以下交易这表明交易名单上等待的人数达到了200的限制。一个列表,超过200交易等作为一个僵局和交易试图检查等待名单是回滚。同样的错误也可能如果锁的线程必须看1000000多锁拥有的交易在等待名单中出现。

对于组织的数据库操作,避免死锁的方法,看第15.5.5,“会”Deadlocks

禁用死锁检测

在高并发系统中,死锁检测可以造成经济放缓时多线程等待同一个锁。有时,它可能是更有效地禁用死锁检测和依靠innodb_lock_wait_timeout设置事务回滚时,死锁发生。死锁检测可以禁用使用innodb_deadlock_detect配置选项

15.5.5.3如何减少和Handle Deadlocks

本部分建立在关于死锁的概念信息第15.5.5.2,“死锁检测和回滚”。它解释了如何组织数据库操作来减少死锁和随后的错误处理所需的应用。

死锁在事务数据库中的一个经典问题,但他们并不危险,除非他们是如此频繁,你根本无法运行某些交易。通常情况下,你必须把你的应用程序,所以他们总是会回滚由于死锁准备再发行交易。

InnoDB使用自动行级锁。你甚至可以在交易,只是插入或删除一行的情况下得到死锁。这是因为这些操作是不是真的原子的;他们自动设置锁上(可能是几个)插入或删除的行的索引记录。

你能处理死锁和减少其发生的可能性与以下技术:

  • 在任何时候,问题SHOW ENGINE INNODB STATUS命令确定最近的僵局的原因。这可以帮助你调整你的应用程序避免死锁。

  • 如果频繁死锁的警告引起关注,收集更广泛的调试信息,使innodb_print_all_deadlocks配置选项。每一个死锁的信息,而不只是最新的一个,是记录在MySQL错误日志。禁用该选项,当你完成调试。

  • 永远不因僵局准备再发行交易。死锁是危险的。你就再试试。

  • 保持事务小时间短,使它们不易碰撞。

  • 提交事务制定一套相关的变化,使它们不容易受到碰撞后立即。特别是,不要把一个互动MySQL对于一个未提交的事务,长时间打开会话。

  • 如果你使用锁定读SELECT ... FOR UPDATE选择分享),尝试使用较低的隔离级别等READ COMMITTED

  • 当修改多个表在一个事务内,或不同组的同一个表中的行,以一致的顺序每次做这些操作。然后交易形式定义的队列不僵局。例如,组织的数据库操作功能在您的应用程序,或调用存储程序,而不是多个相似序列编码INSERT更新,和DELETE在不同地方的声明

  • 选择好你的表添加索引。那么你的查询需要扫描更少的索引记录从而设置更少的锁。使用EXPLAIN SELECT确定指标的MySQL服务器视为最适合您的查询。

  • 少用锁。如果你能够允许SELECT将数据从一个旧的快照返回,不添加条款更新FOR SHARE它。使用READ COMMITTED这里的隔离级别是好的,因为在相同的事务一致性读写各从自己的新快照。

  • 如果没有其他的帮助,序列化你的交易表级锁。正确的使用方法LOCK TABLES事务表,如InnoDB表,是开始一个事务SET autocommit = 0(不START TRANSACTIONfollowed by)LOCK TABLES并不是说,UNLOCK TABLES直到提交事务明确。例如,如果你需要写表T1读表t2,你可以这样做:

    SET autocommit=0;LOCK TABLES t1 WRITE, t2 READ, ...;... do something with tables t1 and t2 here ...打开表提交;

    表级锁防止并发更新的表,避免死锁在不反应的费用为一个繁忙的系统。

  • 另一种方法是创建一个辅助序列化事务信号量表只包含一个行。有排在访问其他表中每个事务的更新。这样,所有的交易都发生在一个串行的方式。请注意,InnoDB即时的死锁检测算法也可以在这种情况下,因为序列化锁是一个行级锁。MySQL表级锁,超时必须用来解决死锁的方法。

15.6 InnoDB配置

本节提供的配置信息和程序InnoDB初始化、启动、和各种组件和功能InnoDB存储引擎。关于优化数据库操作信息InnoDB表,看8.5节,“优化InnoDB表”

15.6.1 InnoDB启动配置

做的第一个决定InnoDB配置包括数据文件、配置日志文件,页面大小,和内存缓冲区。建议您定义数据文件,日志文件和页面大小配置之前创建的InnoDB实例。修改后的数据文件或日志文件配置InnoDB实例被创建包含一个非平凡的过程,和页面大小只能被定义时InnoDB首先初始化实例

除了这些主题,本节提供了有关规定InnoDB在一个配置文件选项,查看InnoDB初始化信息,以及重要的存储问题。

指定在MySQL配置文件选项

因为MySQL使用的数据文件,日志文件和页面大小设置初始化InnoDB例如,建议您在配置文件中定义这些设置,MySQL在启动时读取,之前初始化InnoDB为第一次InnoDB初始化时,MySQL服务器启动时,和第一个初始化InnoDB通常发生在你第一次启动MySQL服务器。

你可以把InnoDB选择在[ mysqld ]集团任何选项文件,你的服务器读取启动时。MySQL选项文件的位置了第4.2.6、“使用选项文件”

为了确保mysqld只读取从一个特定的文件选项(和mysqld-auto.cnf),使用的--defaults-file选项在命令行中的第一个选项启动服务器时:

mysqld --defaults-file=path_to_configuration_file

查看InnoDB的初始化信息

查看InnoDB在启动时初始化信息,开始mysqld从一开始就开始了。当mysqld从命令提示符启动、初始化信息打印到控制台。

例如,在Windows上,如果mysqld位于C:\Program Files\MySQL\MySQL Server 8.0\bin启动MySQL服务器,这样:

C:\>"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld" --console

在类Unix系统,mysqld位于bin你的MySQL安装目录:

内核>bin/mysqld --user=mysql &

如果你不发送服务器输出到控制台,启动看到初始化信息后,检查错误日志InnoDB印刷在启动过程

有关使用其他方法启动MySQL的信息,参见2.9.5,“启动和停止MySQL自动”

笔记

InnoDB不打开所有用户表和相关的数据文件在启动。然而,InnoDB为表空间文件的存在会检查(*.ibd文件),数据字典中的引用。如果一个表空间文件没有找到,InnoDB记录错误并继续启动序列。表空间文件中引用的重做日志可以在崩溃恢复打开重做应用。

重要存储的考虑

在你的启动配置程序审查下列存储相关的注意事项。

  • 在某些情况下,数据库性能提高的数据是不是都放在同一个物理磁盘。将日志文件放在不同的磁盘数据是性能往往有益。例如,您可以将系统表空间的数据文件在不同的磁盘上的日志文件。你也可以使用原始磁盘分区(原设备)为InnoDB数据文件,这可能会加速I / O的看第15.7.3,“使用原始磁盘分区的系统表空间”

  • InnoDB是一个交易的安全(酸标准)的MySQL已经提交,存储引擎回滚和崩溃恢复功能,保护用户数据。然而,它不能这样做如果底层的操作系统或硬件不成功。许多操作系统或磁盘子系统可能会延迟或重新排序来提高性能的写操作。在一些操作系统,很fsync()系统调用,应该等到一个文件的所有不成文的数据已被刷新可能会在返回的数据已经刷新到稳定存储器。正因为如此,操作系统崩溃或断电可能会破坏最近提交的数据,或在最坏的情况下,甚至破坏数据库因为写已经重新排序操作。如果数据的完整性是很重要的你,做一些拔插头在使用任何生产试验。在OS X 10.3高,InnoDB使用一种特殊的fcntl()文件清除的方法。在Linux的领导下,这是明智的禁用写回缓存

    对ATA SATA磁盘驱动器,命令hdparm -W0 /dev/hda可以禁用回写高速缓存。要注意的是,一些驱动器或磁盘控制器可能无法禁用写回缓存。

  • 关于InnoDB恢复功能,保护用户数据,InnoDB使用一个文件冲洗技术涉及的结构称为doublewrite缓冲,这是默认启用的(innodb_doublewrite=ON)。的doublewrite缓冲增加了安全恢复后死机或停电,并通过减少需要提高对UNIX大部分品种表现fsync()运营建议innodb_doublewrite选项是启用如果你关心的是数据的完整性和可能出现的故障。关于doublewrite缓冲的更多信息,参见“第15.11.1 InnoDB,磁盘I / O”

  • 在使用NFS与InnoDB,审查潜在问题概述使用NFS与MySQL

系统表空间的数据文件的配置

这个innodb_data_file_path配置选项定义的名称,大小,和属性InnoDBSYSTEM表空间的数据文件。如果你不指定一个值innodb_data_file_path,默认行为是创建一个单一的自动扩展数据文件,略大于12MB的,命名为ibdata1

要指定多个数据文件,将他们用分号(;)字符:

innodb_data_file_path=datafile_spec1【;datafile_spec2]…

下面的设置配置单12mb数据文件命名ibdata1这是自动延伸。没有位置的文件,所以默认,InnoDB它创造了在MySQL数据目录:

[mysqld]
innodb_data_file_path=ibdata1:12M:autoextend

文件大小为指定使用KM,或G后缀字母表示KB、MB或GB单位。如果指定字节的数据文件大小(KB),1024的倍数这样做。否则,KB值舍入到最近的兆字节(MB)的边界。对文件的大小的总和至少要稍大于12mb。

最小的文件大小是强制的第一SYSTEM表空间的数据文件,以确保有足够的空间doublewrite缓冲页:

具有固定大小50MB的数据文件命名系统表空间ibdata1和50MB的自动扩展文件名为ibdata2可以这样配置:

[mysqld]
innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend

一个数据文件规范完整的语法包括文件名,文件大小,和可选的autoextend最大值属性:

file_name:file_size[:autoextend[:max:max_file_size]]

这个autoextend最大值属性可以只用于指定数据文件中的最后一个innodb_data_file_path设置

如果您指定的autoextend在过去的数据文件选项,InnoDB扩展数据文件,如果它运行的自由空间的表空间。这个autoextend增量64mb同时默认。修改增加,改变innodb_autoextend_increment系统变量

如果磁盘已满,你可能想添加一个数据文件在另一个磁盘。有关说明,见第15.7.1,“调整InnoDB系统表空间”

单个文件的大小限制是由操作系统决定的。你可以设置文件的大小超过4GB,支持大文件的操作系统。你也可以使用原始磁盘分区的数据文件

InnoDB不知道文件系统最大文件大小,所以要对文件系统最大文件大小是一个很小的值为2GB谨慎。指定一个自动扩展数据文件的最大大小,使用最大值下面的属性autoextend属性。使用最大值属性只适用于限制磁盘的使用是至关重要的,因为超过最大大小导致致命错误,可能导致服务器退出。下面的配置许可证ibdata1成长限制500MB:

[mysqld]innodb_data_file_path=ibdata1:12M:autoextend:max:500M

InnoDB默认情况下,创建MySQL数据目录系统表空间文件(datadir)。指定一个位置明确,使用innodb_data_home_dir选项例如,创建两个文件命名ibdata1ibdata2在一个目录下myibdata,配置InnoDB这样地:

[mysqld]innodb_data_home_dir = /path/to/myibdata/innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
笔记

一个斜线,需要指定一个值时innodb_data_home_dir

InnoDB无法创建目录,所以确保myibdata在你开始之前的服务器目录存在。使用Unix或DOSmkdir命令创建目录

确保MySQL服务器具有适当的访问权限,在数据目录中创建文件。更普遍的是,服务器必须在任何需要的地方创建数据文件目录的访问权限。

InnoDB通过文本连接价值形式为每个数据文件的目录的路径innodb_data_home_dir数据文件的名字。如果innodb_data_home_dir选项,默认值是目录./,这意味着MySQL数据目录。(MySQL服务器改变当前工作目录的数据目录时开始执行。)

如果你指定innodb_data_home_dir为空字符串,可以指定数据文件中列出的绝对路径innodb_data_file_path价值。下面的例子是相当于前一个:

[mysqld]innodb_data_home_dir =innodb_data_file_path=/path/to/myibdata/ibdata1:50M;/path/to/myibdata/ibdata2:50M:autoextend

InnoDB日志文件配置

默认情况下,InnoDB在MySQL数据目录中创建日志文件(两48mbdatadir)命名ib_logfile0ib_logfile1

下面的选项可以用来修改默认配置:

  • innodb_log_group_home_dir定义目录路径InnoDB日志文件(重做日志)。如果这个选项是不配置,InnoDB日志文件是在MySQL数据目录中创建(datadir

    你可以使用这个选项的地方InnoDB日志文件存储在不同的物理存储位置InnoDB数据文件以避免潜在的I/O资源冲突。例如:

    [mysqld]
    innodb_log_group_home_dir = /dr3/iblogs
    
    笔记

    InnoDB无法创建目录,所以确保在你启动服务器日志目录存在。使用Unix或DOSmkdir命令创建必要的目录

    确保MySQL服务器具有适当的访问权限在日志目录中创建文件。更普遍的是,服务器必须在任何需要的地方创建日志文件目录的访问权限。

  • innodb_log_files_in_group定义日志的日志文件组的数目。默认的推荐值为2。

  • innodb_log_file_size定义在日志组中的每个日志文件的字节大小。日志文件的大小(innodb_log_file_size*innodb_log_files_in_group)不能超过一个,略小于最大值512gb。例如一对255 GB的日志文件,接近极限但不超过它。默认的日志文件的大小是48mb。一般来说,对日志文件的大小应足够大,使服务器能够顺利的高峰和低谷负荷的活动,这通常意味着有足够的日志空间来处理一个多小时写作业。这个值越大,越检查点刷新活动在缓冲池的需要,节省磁盘I / O的更多信息,参见8.5.4节,“优化InnoDB重做日志”

InnoDB undo表空间配置

默认情况下,UNDO日志驻留在两基于还原表空间。I/O模式的UNDO日志作出撤销表空间的很好的候选人SSD存储因为UNDO日志可以在长期交易变得很大,有UNDO日志在多个撤销表空间,减少任何一个undo表空间的最大大小。

这个innodb_undo_directory配置选项定义的路径InnoDB创建表空间的UNDO日志。如果不指定路径innodb_undo_directory,撤销表空间中创建MySQL数据目录,定义为datadir。这个innodb_undo_directory期权是非动态。需要重新启动服务器配置。

笔记

innodb_undo_tablespaces是过时的、将在未来的版本中删除。

有关更多信息,参见第15.7.8”配置,撤销表空间”

InnoDB的临时表空间配置

默认情况下,InnoDB创建一个临时表空间的数据文件的扩展单自动命名ibtmp1这是略大于12mb在innodb_data_home_dir目录默认的临时表空间的数据文件的配置可以修改启动时使用innodb_temp_data_file_path配置选项

这个innodb_temp_data_file_path选项指定的路径、文件名、文件大小InnoDB临时表空间的数据文件。一个文件的完整目录路径是通过串联innodb_data_home_dir指定的路径innodb_temp_data_file_path。文件大小为指定KB、MB或GB(即1024MB),通过添加K,M,G的大小值。对文件的大小的总和必须略大于12mb。

这个innodb_data_home_dir默认值是MySQL数据目录(datadir

一个autoextending临时表空间数据文件可能会变得很大,大的环境中使用临时表或临时表的广泛使用。一个大的数据文件也会因长时间运行的查询,使用临时表。为了防止临时数据文件太大,配置innodb_temp_data_file_path选项指定的最大数据文件大小。更多信息见管理临时表空间的数据文件的大小

InnoDB页面大小配置

这个innodb_page_size选项指定所有的页面大小InnoDB在MySQL实例的表空间。这个值设置当实例被创建并保持恒定之后。有效值是64K,32K,16k(默认),8K和4K。或者,您可以指定字节的页大小(65536, 32768, 16384,8192, 4096)。

16K的默认页面大小是适合广泛的工作负载,特别是涉及到的表扫描和DML操作涉及批量更新查询。较小的页大小,可能涉及到许多小的OLTP工作负载将更有效率,在竞争可以是一个问题,当一个网页包含多行。较小的页面也可以高效的SSD存储设备,通常使用小的块尺寸。保持InnoDB页面大小接近存储设备的块大小不变,减少数据改写磁盘。

InnoDB内存配置

MySQL分配内存以各种高速缓存和缓冲区来提高数据库操作的性能。当分配内存InnoDB,总认为操作系统所需的内存分配给其他应用程序的内存分配的内存,和其他MySQL缓存和缓存。例如,如果你使用MyISAM表,考虑分配的关键缓冲区内存量(key_buffer_size)。MySQL进行缓冲和缓存的概述,看第8.12.3.1,“MySQL如何使用内存”

缓冲区的具体InnoDB配置使用以下参数:

警告

在32位的GNU / Linux x86,小心不要把内存使用率太高。glibc允许进程堆在线程堆栈中成长,而你的服务器崩溃。这是一个风险,如果分配的内存mysqld过程的全局和每个线程的缓冲和缓存接近或超过2gb。

一个公式类似计算全球和每个线程的内存分配的MySQL可以用来估计MySQL内存使用情况如下。您可能需要修改的公式来计算你的MySQL版本和配置缓存和缓存。MySQL进行缓冲和缓存的概述,看第8.12.3.1,“MySQL如何使用内存”

innodb_buffer_pool_size
+ key_buffer_size
+ max_connections*(sort_buffer_size+read_buffer_size+binlog_cache_size)
+ max_connections*2MB

每个线程使用的堆栈(通常为2MB,但在MySQL的二进制文件由甲骨文公司提供。只有256KB的),在最坏的情况下也使用sort_buffer_size + read_buffer_size额外的内存

在Linux中,如果内核是大页面支持,InnoDB可以使用大页面的缓冲池分配内存。看到第8.12.3.2,“使大页面支持”

15.6.2配置InnoDB只读操作

你现在可以查询InnoDB表在MySQL数据目录是只读介质,使--innodb-read-only配置选项在服务器启动。

如何使

准备只读操作的一个实例,确保所有必要的信息冲洗到数据文件之前存储在只读介质。改变缓冲禁用运行服务器(innodb_change_buffering=0)和的缓慢关闭

使整个MySQL实例的只读模式,指定在服务器启动配置选项:

  • --innodb-read-only=1

  • 如果实例是只读介质如CD或DVD,或/var目录不可写的:--pid-file=path_on_writeable_media--event-scheduler=disabled

  • --innodb_temp_data_file_path。此选项指定的路径、文件名、文件大小InnoDB临时表空间的数据文件。默认设置是ibtmp1:12M:autoextend,造成ibtmp1在数据目录中的临时表空间的数据文件。准备只读操作的一个实例,设置innodb_temp_data_file_path在数据目录以外的位置。路径必须相对于数据目录;例如:

    --innodb_temp_data_file_path=../../../tmp/ibtmp1:12M:autoextend

在MySQL 8,使innodb_read_only防止表创建拖放操作的所有存储引擎。这些操作修改数据字典表中MySQL系统的数据库,但这些表的使用InnoDB存储引擎不能修改时innodb_read_only启用。同样的限制也适用于任何操作,修改数据字典表,如ANALYZE TABLEALTER TABLE tbl_name ENGINE=engine_name

此外,在其他表mysql系统数据库使用InnoDB在MySQL 5.0存储引擎。这些表的读操作,修改限制只有结果。例如,CREATE USERGRANTREVOKE,和INSTALL PLUGIN操作不允许在只读模式。

使用场景

这种操作模式是在这种情况下,适当的:

  • 分配一个MySQL的应用程序,或一套MySQL数据,在只读存储介质如CD或DVD。

  • 多个MySQL实例查询相同的数据目录的同时,在一个典型的数据仓库结构。你可以使用这种技术来避免瓶颈可以与负载沉重的MySQL实例出现,或者你会调整每一个查询特定种类的各种情况下使用不同的配置选项。

  • 已投入安全或数据完整性的只读状态数据的查询,如归档备份数据。

笔记

此功能主要是用于分配和部署的灵活性,而不是基于只读方面原材料的性能。看到第8.5.3,“优化InnoDB只读事务”为调整只读查询的性能的方法,它不需要使整个服务器的只读。

工作原理

当服务器运行在只读模式下通过--innodb-read-only选择InnoDB特征和成分减少或完全关闭:

15.6.3 InnoDB缓冲池的配置

本节提供的配置和调整信息InnoDB缓冲池

15.6.3.1 InnoDB缓冲池

InnoDB维护一个存储区域称为缓冲池在内存中缓存数据和索引。知道如何InnoDB缓冲池的作品,而且利用它保持经常访问的数据在内存中,是MySQL优化的一个重要方面。有关如何InnoDB缓冲池的作品,看InnoDB缓冲池的LRU算法

您可以配置的各个方面InnoDB高性能的缓冲池

InnoDB缓冲池的LRU算法

InnoDB管理缓冲池为一个列表,使用变化的最近最少使用(LRU)算法。当房间需要添加新的页面到池,InnoDB在最近最少使用的页面和添加新的页面到列表中。这中点插入策略将列表作为两个子列表:

  • 在头部,一个子列表(或年轻)页面访问最近

  • 在尾部,一个子列表旧版页面访问最近少

该算法保持页面是通过在新的子列表查询大量使用。老子列表包含不常用的页面;这些页面是候选人驱逐

LRU算法的操作如下默认:

  • 3 / 8的缓冲池是致力于老子列表。

  • 列表的中点是新的子列表尾遇到旧列表头的边界在哪里。

  • 什么时候InnoDB读取页面的缓冲池,它最初将在中点(老子头)。一个页面可以阅读因为它是一个用户指定的操作,如SQL查询的需要,或一部分读前操作自动执行的InnoDB

  • 在旧的列表,访问一个网页让它年轻,将它移动到缓冲池的头(新的子列表的头)。如果页面阅读因为它是必需的,第一次访问时立即和页面由年轻。如果网页是由于提前读读书,第一接入并不立即发生(可能不会出现在所有页面之前拆迁)。

  • 作为数据库操作,在缓冲池中不被访问的页年龄通过向列表的尾部。在新旧sublists年龄其他网页是新的网页。在旧的子列表页也年龄页插在中点。最终,一个页面,仍然未使用足够长的时间达到老子列表尾部,驱逐。

默认情况下,页面读取查询立即移动到新的子列表,这意味着他们在缓冲池中停留的时间。表扫描(如进行mysqldump操作,或SELECT声明没有哪里条款)可以带来大量的数据缓冲池,将旧数据同等金额,即使新数据不会再被使用。同样的,网页,通过后台预读线程然后访问只有一次移动到新的链表的头装。这些情况可以把经常使用的页面到老子列表,在那里他们受到驱逐。关于优化这一行为的信息,参见第15.6.3.4,“缓冲池扫描耐”,和第15.6.3.5”配置,InnoDB缓冲池预取(预读)”

InnoDB标准的监视器输出包含在几个领域缓冲池和内存部分,属于缓冲池的LRU算法操作。详情见第15.6.3.9,“监控缓冲池使用InnoDB监控标准”

InnoDB缓冲池的配置选项

几个配置选项影响的不同方面InnoDB缓冲池

15.6.3.2配置InnoDB缓冲池大小

您可以配置InnoDB缓冲池大小的离线或在线(在启动时),而服务器运行。在这一节中描述的行为都适用的方法。有关配置缓冲池大小在线看InnoDB缓冲池大小的在线配置

当增加或减少innodb_buffer_pool_size,执行运算块。块的大小是确定的innodb_buffer_pool_chunk_size配置选项,其中有一个默认的128M。有关更多信息,参见配置InnoDB缓冲池的块大小

缓冲池的大小必须等于或多innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances。如果配置innodb_buffer_pool_size一个值不等于或多innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances缓冲池的大小,自动调整到一个值等于或多innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances

在下面的例子,innodb_buffer_pool_size是集8G,和innodb_buffer_pool_instances是集十六innodb_buffer_pool_chunk_size128M,这是默认值

8G是一个有效的innodb_buffer_pool_size价值因为8G是一个多innodb_buffer_pool_instances=16*innodb_buffer_pool_chunk_size=128M,这是2G

shell> mysqld --innodb_buffer_pool_size=8G --innodb_buffer_pool_instances=16
MySQL的>SELECT @@innodb_buffer_pool_size/1024/1024/1024;在这里,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,这是什么?

在这个例子中,innodb_buffer_pool_size是集9G,和innodb_buffer_pool_instances是集十六innodb_buffer_pool_chunk_size128M,这是默认值。在这种情况下,9G不多innodb_buffer_pool_instances=16*innodb_buffer_pool_chunk_size=128M,所以innodb_buffer_pool_size调整10g,这是一个多innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances

内核>mysqld --innodb_buffer_pool_size=9G --innodb_buffer_pool_instances=16
MySQL的>SELECT @@innodb_buffer_pool_size/1024/1024/1024;------------------------------------------ | @ _ InnoDB缓冲池_ _ 1024 1024 1024大小/ / / | ------------------------------------------ | 10.000000000000 | ------------------------------------------
配置InnoDB缓冲池的块大小

innodb_buffer_pool_chunk_size可以增加或减少MB(1048576字节)的单位,但只能修改在启动时,在命令行字符串或在MySQL的配置文件。

命令行:

shell> mysqld --innodb_buffer_pool_chunk_size=134217728

配置文件:

[mysqld]
innodb_buffer_pool_chunk_size=134217728

下列条件改变时innodb_buffer_pool_chunk_size

  • 如果新的 innodb_buffer_pool_chunk_size价值*innodb_buffer_pool_instances比目前更大的缓冲池大小的缓冲池初始化时,innodb_buffer_pool_chunk_size截断innodb_buffer_pool_size/innodb_buffer_pool_instances

    例如,如果缓冲池的大小与初始化2GB(2147483648字节),缓冲池的情况下,一块大小1GB(1073741824字节),块的大小是截断值等于innodb_buffer_pool_size/innodb_buffer_pool_instances,如下图所示:

    内核>mysqld --innodb_buffer_pool_size=2147483648 --innodb_buffer_pool_instances=4--innodb_buffer_pool_chunk_size=1073741824;
    MySQL的>SELECT @@innodb_buffer_pool_size;--------------------------- | @ @ InnoDB缓冲池的大小_ _ _ | --------------------------- | 2147483648 | > --------------------------- MySQLSELECT @@innodb_buffer_pool_instances;-------------------------------- | @ @ innodb_buffer_pool_instances | -------------------------------- | 4 | -------------------------------- #块大小被设置为1GB(1073741824字节)启动但#截断innodb_buffer_pool_size / innodb_buffer_pool_instancesmysql >SELECT @@innodb_buffer_pool_chunk_size;--------------------------------- | @ @ innodb_buffer_pool_chunk_size | --------------------------------- | 536870912 | ---------------------------------
  • 缓冲池的大小必须等于或多innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances。如果你改变innodb_buffer_pool_chunk_sizeinnodb_buffer_pool_size自动调整到一个值等于或多innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances。调整发生时,缓冲池初始化。这种行为是下面的例子演示了:

    #缓冲池有128MB默认大小(134217728字节)MySQL >SELECT @@innodb_buffer_pool_size;--------------------------- | @ @ innodb_buffer_pool_size | --------------------------- | 134217728 | --------------------------- #块大小也128mb(134217728字节)MySQL >SELECT @@innodb_buffer_pool_chunk_size;--------------------------------- | @ @ innodb_buffer_pool_chunk_size | --------------------------------- | 134217728 | --------------------------------- #有一个单独的缓冲池instancemysql >SELECT @@innodb_buffer_pool_instances;+--------------------------------+| @@innodb_buffer_pool_instances |+--------------------------------+|                              1 |+--------------------------------+# Chunk size is decreased by 1MB (1048576 bytes) at startup# (134217728 - 1048576 = 133169152):shell>mysqld --innodb_buffer_pool_chunk_size=133169152MySQL的>SELECT @@innodb_buffer_pool_chunk_size;--------------------------------- | @ @ innodb_buffer_pool_chunk_size | --------------------------------- | 133169152 | --------------------------------- #缓冲池的大小从134217728增加到266338304 #缓冲池大小自动调整到一个值,等于#或多个innodb_buffer_pool_chunk_size * innodb_buffer_pool_instancesmysql >SELECT @@innodb_buffer_pool_size;--------------------------- | @ @ InnoDB缓冲池的大小_ _ _ | --------------------------- | 266338304 | ---------------------------

    这个例子演示了相同的行为,但多缓冲池的实例:

    # The buffer pool has a default size of 2GB (2147483648 bytes)
    
    mysql> SELECT @@innodb_buffer_pool_size;
    +---------------------------+
    | @@innodb_buffer_pool_size |
    +---------------------------+
    |                2147483648 |
    +---------------------------+
    
    # The chunk size is .5 GB (536870912 bytes)
    
    mysql> SELECT @@innodb_buffer_pool_chunk_size;
    +---------------------------------+
    | @@innodb_buffer_pool_chunk_size |
    +---------------------------------+
    |                       536870912 |
    +---------------------------------+
    
    # There are 4 buffer pool instances
    
    mysql> SELECT @@innodb_buffer_pool_instances;
    +--------------------------------+
    | @@innodb_buffer_pool_instances |
    +--------------------------------+
    |                              4 |
    +--------------------------------+
    
    # Chunk size is decreased by 1MB (1048576 bytes) at startup
    # (536870912 - 1048576 = 535822336):
    
    shell> mysqld --innodb_buffer_pool_chunk_size=535822336
    
    mysql> SELECT @@innodb_buffer_pool_chunk_size;
    +---------------------------------+
    | @@innodb_buffer_pool_chunk_size |
    +---------------------------------+
    |                       535822336 |
    +---------------------------------+
    
    # Buffer pool size increases from 2147483648 to 4286578688
    # Buffer pool size is automatically adjusted to a value that is equal to
    # or a multiple of innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances
    
    mysql> SELECT @@innodb_buffer_pool_size;
    +---------------------------+
    | @@innodb_buffer_pool_size |
    +---------------------------+
    |                4286578688 |
    +---------------------------+
    

    护理时应更换innodb_buffer_pool_chunk_size,为改变这个值可以增加缓冲池的大小,如上面的示例所示。在你改变innodb_buffer_pool_chunk_size,计算的影响innodb_buffer_pool_size为确保缓冲池的大小是可以接受的。

笔记

为了避免潜在的性能问题,块的数量(innodb_buffer_pool_size/innodb_buffer_pool_chunk_size)应不超过1000

InnoDB缓冲池大小的在线配置

这个innodb_buffer_pool_size配置选项可以设置动态使用SET声明,允许您调整缓冲池,无需重新启动服务器。例如:

MySQL的>SET GLOBAL innodb_buffer_pool_size=402653184;

活跃的交易和业务通过InnoDB原料药前应完成调整缓冲池。启动时的调整操作,该操作不会开始直到交易完成的所有活动。一旦缩放操作正在进行,新的交易和业务需要访问缓冲池的大小必须等到操作完成。该规则的例外是并发访问缓冲池允许在缓冲池进行碎片整理和页面缓冲池大小减少时撤出。允许并发访问的一个缺点是,它可能会导致暂时缺货可用页面而页面被撤回。

笔记

嵌套的事务可能会失败,如果缓冲池大小调整操作后引发的开始。

在线缓冲池大小的进度监控

这个Innodb_buffer_pool_resize_status缓冲池大小的进展报告。例如:

MySQL的>SHOW STATUS WHERE Variable_name='InnoDB_buffer_pool_resize_status';---------------------------------- name变量值_ ---------------------------------- | | | ---------------------------------- ---------------------------------- | InnoDB缓冲池_ _ _ _缩放调整状态| also other哈希表。一个多月以前评论

缓冲池大小的进步也记录在服务器错误日志。这个例子说明指出,登录时增加缓冲池的大小:

[Note] InnoDB: Resizing buffer pool from 134217728 to 4294967296. (unit=134217728)
[Note] InnoDB: disabled adaptive hash index.
[Note] InnoDB: buffer pool 0 : 31 chunks (253952 blocks) was added.
[Note] InnoDB: buffer pool 0 : hash tables were resized.
[Note] InnoDB: Resized hash tables at lock_sys, adaptive hash index, dictionary.
[Note] InnoDB: completed to resize buffer pool from 134217728 to 4294967296.
[Note] InnoDB: re-enabled adaptive hash index.

这个例子说明指出,登录时减少缓冲池的大小:

[Note] InnoDB: Resizing buffer pool from 4294967296 to 134217728. (unit=134217728)
[Note] InnoDB: disabled adaptive hash index.
[Note] InnoDB: buffer pool 0 : start to withdraw the last 253952 blocks.
[Note] InnoDB: buffer pool 0 : withdrew 253952 blocks from free list. tried to relocate 0 pages.
(253952/253952)
[Note] InnoDB: buffer pool 0 : withdrawn target 253952 blocks.
[Note] InnoDB: buffer pool 0 : 31 chunks (253952 blocks) was freed.
[Note] InnoDB: buffer pool 0 : hash tables were resized.
[Note] InnoDB: Resized hash tables at lock_sys, adaptive hash index, dictionary.
[Note] InnoDB: completed to resize buffer pool from 4294967296 to 134217728.
[Note] InnoDB: re-enabled adaptive hash index.
在线缓冲池大小的内部

调整大小的操作是通过一个后台线程执行。当增加缓冲池的大小,缩放操作:

  • 添加页面chunks(块的大小被定义为innodb_buffer_pool_chunk_size

  • 将哈希表、列表和指针在内存中使用新的地址

  • 添加新的页面到自由列表

而这些操作都在进步,其他线程被阻止访问缓冲池。

当降低缓冲池的大小,缩放操作:

  • 对缓冲池和退出页面(释放)

  • 删除页面chunks(块的大小被定义为innodb_buffer_pool_chunk_size

  • 将哈希表、列表和指针在内存中使用新的地址

这些操作,只对缓冲池和退出页面允许其他线程访问缓冲池的同时。

15.6.3.3配置多个缓冲池的实例

在多字节范围的缓冲池系统,将缓冲池为单独的实例可以提高并发性,减少争用不同的线程读写缓存页。此功能通常用于系统与缓冲池在多字节的范围大小。多缓冲池配置使用的实例innodb_buffer_pool_instances配置选项,你可能也调整theinnodb_buffer_pool_size价值

InnoDB缓冲池是大的,很多的数据请求可以从内存中检索获取。你可能会遇到来自多个线程试图访问Buffer Pool的瓶颈。您可以启用多个缓冲池来减少这一论点。每一页都存储在缓冲池中读取或被分配到一个随机的缓冲池,使用哈希函数。每个缓冲池管理自己的自由列表、刷新列表,LRUs,和其他数据结构连接缓冲池。MySQL 5.0之前,每个缓冲池是由它自己的缓冲池的互斥体保护。在MySQL 8以后,缓冲池的互斥体是由几个列表和哈希保护mutex替换,以减少争用。

使多个缓冲池的情况下,设置innodb_buffer_pool_instances配置选项的值大于1(默认值)到64(最大)。此选项仅当您设置生效innodb_buffer_pool_size一个大小为1GB以上。总规模为你指定的缓冲池中。最佳的效率,指定一个组合innodb_buffer_pool_instancesinnodb_buffer_pool_size所以,每个缓冲池实例至少1GB。

关于修改InnoDB缓冲池的大小,看第15.6.3.2,“配置InnoDB缓冲池大小”

15.6.3.4制作缓冲池扫描抗性

而不是使用一个严格LRU算法,InnoDB使用技术来最小化,带来的数据量缓冲池永远不会再次访问。我们的目标是确保经常访问的()页面保持在缓冲池中,即使读前全表扫描带来新的块,可能或可能无法访问之后。

新读块插入到LRU列表中。所有新读页插在一个位置,默认是3/8从LRU列表的尾部。页面移动到前面的列表(最近使用的结束)当他们访问的缓冲池中的第一次。因此,页面不访问不到LRU列表的前面部分,和年龄不是一个严格的LRU方法更快。这种安排将LRU列表分为两段,在网页中的插入点的下游是旧版是理想的受害者的LRU驱逐。

对内部运作的一种解释InnoDB关于LRU算法的缓冲池和细节,看第15.6.3.1,“InnoDB缓冲池”

你可以控制在LRU列表的插入点,选择是否InnoDB采用相同的优化的表或索引进入缓冲池块扫描。配置参数innodb_old_blocks_pct控制比例旧版在LRU列表块。默认值innodb_old_blocks_pct三十七3/8,对应于原来的固定比率。值的范围是5(缓冲池中的时代新的网页很快)来九十五(只有百分之五的缓冲池用于热页,使得算法接近熟悉的LRU策略)。

使缓冲池被搅动的预读可以避免由于表或索引的优化扫描类似的问题。在这些扫描数据页的访问,通常是几次接二连三,从不碰。配置参数innodb_old_blocks_time指定的时间窗口(毫秒)后的第一个页面的访问期间,它可以不被移动到前面访问(最近使用LRU列表的结束)。默认值innodb_old_blocks_time一千。增加这个值使得越来越多的块可能年龄更快从缓冲池。

innodb_old_blocks_pctinnodb_old_blocks_time是动态的,全球的和可以在MySQL选项文件中指定的(my.cnfmy.ini)或在运行时改变的设置全局命令。改变设置要求SYSTEM_VARIABLES_ADMIN超级的特权

帮助你衡量这些参数设置的效果,SHOW ENGINE INNODB STATUS指令缓冲池的统计报告。详情见第15.6.3.9,“监控缓冲池使用InnoDB监控标准”

因为这些参数的影响,可以广泛的基于硬件配置,改变你的数据,和你的工作的细节,总是基准改变任何关键的性能或生产环境中这些设置前验证。

在大多数的活动与定期批量报告大扫描结果查询OLTP类型的混合工作负载,设定值innodb_old_blocks_time在间歇跑可以帮助保持在缓冲池中的正常工作量的工作集。

当扫描大表,完全适合在缓冲池中不能设置innodb_old_blocks_pct一个小的价值一直是只读一次消费的很大一部分的数据缓冲池。例如,设置innodb_old_blocks_pct=5制约该数据是只读一次5%的缓冲池。

当扫描小表,融入记忆,有移动页面在缓冲池中的开销少,所以你可以离开innodb_old_blocks_pct在其默认值,甚至更高,如innodb_old_blocks_pct=50

的效果innodb_old_blocks_time参数是很难预测的比innodb_old_blocks_pct参数,比较小,且随工作量。到达一个最优值,进行自己的基准,如果从调节性能的改善innodb_old_blocks_pct是不足够的

15.6.3.5 InnoDB缓冲池配置预取(预读)

读前请求是一个I/O请求到多个页面的预取缓冲池异步,预计很快将会需要这些页面。要求将所有的页面在一个程度InnoDB采用两预读以提高I/O性能的算法:

线性的预读是一种技术,预测哪些页面可能需要很快基于缓冲池页面访问顺序。当你控制InnoDB执行预读操作通过调整顺序页面访问次数需要触发异步读取请求,使用配置参数innodb_read_ahead_threshold。在这个参数添加,InnoDB只会计算能否为整个下程度时,阅读在当前范围的最后一页一个异步预取请求。

配置参数innodb_read_ahead_threshold如何控制敏感InnoDB在检测顺序页面访问模式。如果按顺序从一定程度上阅读的页面数大于或等于innodb_read_ahead_thresholdInnoDB启动一个异步读在整个操作范围。innodb_read_ahead_threshold可以设置为任何值从0-64。默认值为56。值越高,检查更严格的访问模式。例如,如果将值设置为48,InnoDB触发一个线性预读请求只有在目前的程度上48页已按顺序访问。如果该值为8,InnoDB触发一个异步读前即使在程度上8页都是按顺序访问数。你可以在MySQL设置此参数值配置文件,或动态变化的SET GLOBAL命令,要求SYSTEM_VARIABLES_ADMIN超级的特权

随机预读是一种技术,预测当页面可能需要很快基于页面已经在缓冲池中,无论是为了在这些页面被阅读。如果连续13页相同程度的缓冲池中的发现,InnoDB异步发送一个请求到预取的程度,其余页。要启用此功能,设置配置变量innodb_random_read_ahead打开(放)

这个SHOW ENGINE INNODB STATUS命令显示统计信息来帮助你评估预读算法的有效性。数据包括以下全局状态变量计数器信息:

这些信息可能是有用的当微调innodb_random_read_ahead设置

为更多的信息关于I/O性能,看第8.5.8,“优化InnoDB的磁盘I / O”第4,“优化磁盘I/O

15.6.3.6配置InnoDB缓冲池冲洗

InnoDB执行某些任务的背景下,包括冲洗属于脏页(那些页面已更改但尚未写入数据库文件)从缓冲池

InnoDB开始刷新缓冲池页面在缓冲池中的脏页率达低水位设置定义innodb_max_dirty_pages_pct_lwm。这个选项是用来控制缓冲池中的脏页率和防止脏页率达到innodb_max_dirty_pages_pct。如果缓冲池中的脏页的比例超过innodb_max_dirty_pages_pctInnoDB开始积极地刷新缓冲池页面。

InnoDB使用一种算法来估计所需的速度冲,基于速度的重做日志生成和目前的速度冲。目的是确保缓冲清除活性保持着最需要保持缓冲池整体性能清洁。自动调节冲洗速度可以帮助避免在吞吐量突然骤降,当过度缓冲池冲洗限制I/O容量可用普通的读写活动。

InnoDB在一个圆形的方式使用其日志文件。再利用日志文件中的一部分,InnoDB刷新到磁盘的所有脏缓冲池页面的重做条目都包含在这部分的日志文件,这一过程称为锋利的检查站。如果工作量是写密集型,它产生大量的重做信息写入日志文件,所有。如果日志文件中的所有可用空间已用完,锋利的检查站时,造成吞吐量暂时减少。这种情况可能发生,即使innodb_max_dirty_pages_pct没有达到

InnoDB采用启发式算法来避免这样的情况下,通过测量在缓冲池中的脏页的数量和速度,再产生。基于这些数字,InnoDB决定多少脏页刷新缓冲池中的每一秒。这种自适应算法能够处理工作量的突然变化。

内部基准表明,该算法不仅保持了吞吐量的时间,而且还可以显著提高整体吞吐量。

由于自适应冲洗可显著影响I/O模式的工作量,innodb_adaptive_flushing配置参数可以关闭此功能。默认值为innodb_adaptive_flushing打开(放)自适应算法,使冲洗。你可以在MySQL选项文件中设置此参数的值(my.cnfmy.ini)或动态变化的SET GLOBAL命令,要求SYSTEM_VARIABLES_ADMIN超级的特权

关于微调InnoDB缓冲池冲洗的行为,看第15.6.3.7,“微调InnoDB缓冲池冲洗”

为更多的信息关于InnoDBI/O性能,看第8.5.8,“优化InnoDB的磁盘I / O”

15.6.3.7微调InnoDB缓冲池冲洗

the配置选项innodb_flush_neighborsinnodb_lru_scan_depth让你的微调方面冲洗InnoDB缓冲池

  • innodb_flush_neighbors

    指定是否冲洗一页从缓冲池也可以在同一程度上其他脏页。表中的数据时,存储在一个传统的硬盘存储装置、冲洗一邻居页面操作降低了I/O开销(主要用于磁盘寻道操作)相比,在不同时代的个人页面冲洗。存储在表中的数据SSD,寻找时间不是一个重要的因素,你可以禁用此设置展开的写操作。

  • innodb_lru_scan_depth

    指定,每个缓冲池的实例,多远LRU列表的页面缓冲池清洁螺纹扫描寻找脏页刷新。这是一个进行一次后台操作。

这些选择主要是帮助写密集型工作负载。重DML活动,冲洗可以落后,如果是不够积极,导致在缓冲池的内存过度使用;或者,磁盘写入由于冲洗可以满足你的I/O容量如果机制过于激进。理想的设置取决于你的工作量,数据访问模式,存储配置(例如,数据是否存储在硬盘或SSD设备)。

在定重系统工作负载,或工作负载波动很大,几个配置选项让你微调冲洗行为InnoDB

这些选项进使用的公式innodb_adaptive_flushing选项

这个innodb_adaptive_flushinginnodb_io_capacityinnodb_max_dirty_pages_pct选择是有限的或由下列选项扩展:

这个InnoDB自适应刷新在所有的情况下,机构是不合适的。它把最大利益时重做日志文件在充满危险的。这个innodb_adaptive_flushing_lwm选项指定低水位百分比的重做日志容量;当阈值,InnoDB自适应冲洗即使没有指定的转innodb_adaptive_flushing选项

如果冲洗活性远远落后,InnoDB可以将更积极的比指定的innodb_io_capacityinnodb_io_capacity_max代表对I/O能力用于急救情况下的上限,使I/O穗不消耗所有的服务器的能力。

InnoDB试图刷新数据从缓冲池,脏页的百分比不超过价值innodb_max_dirty_pages_pct。默认值为innodb_max_dirty_pages_pct是75

笔记

这个innodb_max_dirty_pages_pct设置了冲洗活动目标。它不影响刷新率。有关管理冲洗率信息,看第15.6.3.6,“配置InnoDB缓冲池冲洗”

这个innodb_max_dirty_pages_pct_lwm选项指定低水位表示百分比的脏页预冲洗能够控制脏页率和防止脏页率达到innodb_max_dirty_pages_pct。一个值innodb_max_dirty_pages_pct_lwm=0禁用预冲洗行为

大多数的选择上面提到的是最适用的,写的很长一段时间工作繁重,没有减少加载时间赶上变化等待写入到磁盘的服务器。

innodb_flushing_avg_loops定义了迭代的数量InnoDB保持先前计算的快照冲洗状态,控制如何快速响应负载变化的自适应冲洗前景。设置较高的值innodb_flushing_avg_loops意味着InnoDB保持先前计算的快照时间,所以自适应冲洗反应更慢。高价值的同时也降低了前景和背景之间的正反馈,但设置较高的值时,它是重要的保证InnoDB重做日志利用率不到百分之七十五(硬编码的限制,异步冲洗开始),innodb_max_dirty_pages_pct设置保持脏页的数量达到一定的水平,工作量是合适的。

一致的工作负载的系统,一个大innodb_log_file_size,和小的穗状花序,没有达到75%的重做日志空间的利用应使用高innodb_flushing_avg_loops继续冲洗尽可能平滑值。在极端负荷尖峰或不提供很多空间日志文件系统,考虑一个较小的innodb_flushing_avg_loops价值。一个较小的值允许冲洗要密切跟踪负荷,有助于避免重做日志空间的利用率达到75%。

15.6.3.8保存和恢复状态的缓冲池

为了减少热身在重新启动服务器后时期,InnoDB节省的百分比最近使用的每个缓冲池页面服务器关闭和恢复这些页面在服务器启动。最近使用的页的百分比是存储定义了innodb_buffer_pool_dump_pct配置选项

重新启动后繁忙的服务器,通常有一个热身和不断增加的吞吐量,为磁盘页面在缓冲池中带回的记忆(同样的数据进行查询,更新,等等)。在启动恢复缓冲池的能力,缩短了预热期加载磁盘页在缓冲池的启动而不是等待DML操作访问相应行之前。同时,I/O请求可以大批量进行,使得整体的I/O速度。页面加载时的背景,和不耽误数据库启动。

除了在关机节省缓冲池的状态和恢复它在启动时,您可以保存在任何时间恢复缓冲池的状态,当服务器运行。例如,你可以稳定负荷下达到一个稳定的吞吐量后保存缓冲池的状态。你也可以运行报表或维护工作,将数据页的缓冲池,只要求对那些手术后恢复以前的缓冲池的状态,或在运行一些其他非典型的工作量。

即使一个缓冲池的大小可以在多字节,缓冲池数据InnoDB保存到磁盘是由微小的比较。找到合适的页面保存到磁盘,只有必要的表空间ID和网页ID。此信息来自INNODB_BUFFER_PAGE_LRUinformation_schema表默认情况下,表空间ID和页面ID数据保存在一个文件名为ib_buffer_pool,这是保存到InnoDB数据目录。文件名和位置可以修改使用innodb_buffer_pool_filename配置参数

因为数据被缓存在老年的缓冲池,因为它是与常规的数据库操作,如果磁盘的网页最近更新是没有问题的,或如果一个DML操作涉及尚未加载的数据。加载机构跳过请求的页面不再存在。

其机制涉及一个后台线程,被派遣执行操作转储和负载。

磁盘页面压缩表加载到缓冲池中的压缩形式。网页压缩如常在DML操作访问的页面内容。因为解压缩页是CPU密集型的过程中,并发线程连接而不是在单线程执行的缓冲池的恢复操作执行操作效率更高。

业务相关的保存和恢复状态的缓冲池在下列主题描述:

配置缓冲池页面转储的百分比

在倾销从缓冲池页面,您可以配置比例最近使用的缓冲池页面,你想甩掉的设置innodb_buffer_pool_dump_pct选项如果你计划把缓冲池页面在服务器正在运行,您可以配置选项动态:

SET GLOBAL innodb_buffer_pool_dump_pct=40;

如果你计划把缓冲池页面在服务器关机,设置innodb_buffer_pool_dump_pct在您的配置文件

[mysqld]innodb_buffer_pool_dump_pct=40

这个innodb_buffer_pool_dump_pct默认值是25(转储最近使用的页25%)。

节约缓冲池在关机状态和恢复它在启动

在服务器关闭保存缓冲池的状态,关闭服务器之前发表如下声明:

SET GLOBAL innodb_buffer_pool_dump_at_shutdown=ON;

innodb_buffer_pool_dump_at_shutdown默认情况下启用

在服务器启动时恢复缓冲池的状态,指定--innodb_buffer_pool_load_at_startup选项启动服务器时:

mysqld --innodb_buffer_pool_load_at_startup=ON;

innodb_buffer_pool_load_at_startup默认情况下启用

保存和恢复缓冲池状态在线

为了节省缓冲池的状态,而MySQL服务器运行,发出以下声明:

SET GLOBAL innodb_buffer_pool_dump_now=ON;

恢复缓冲池状态,MySQL正在运行,发出以下声明:

SET GLOBAL innodb_buffer_pool_load_now=ON;
显示缓冲池堆的进展

显示进步的缓冲池的状态保存到磁盘时,发出以下声明:

SHOW STATUS LIKE 'Innodb_buffer_pool_dump_status';

如果手术尚未开始,没有开始返回。如果操作完成,完成时间(例如在印刷完成110505 12:18:02)。如果在进行操作,设置状态信息(例如倾销缓冲池5/7,页237 /:)。

显示缓冲池加载进度

显示进程加载缓冲池时,发出以下声明:

SHOW STATUS LIKE 'Innodb_buffer_pool_load_status';

如果手术尚未开始,没有开始返回。如果操作完成,完成时间是印刷(如完成110505 12:23:24)。如果在进行操作,设置状态信息(例如,加载123/22301页)。

中止一个缓冲池负荷运行

放弃一个缓冲池的负荷运行,发出以下声明:

SET GLOBAL innodb_buffer_pool_load_abort=ON;
监测缓冲池负荷进步使用性能模式

您可以监视缓冲池使用负载的进步性能模式

下面的示例演示如何使用stage/innodb/buffer pool load舞台活动仪器和相关消费表来监控缓冲池加载进度。

关于缓冲池的转储和负载在本示例中使用的程序,看第15.6.3.8,“保存和恢复缓冲池的状态”。关于绩效模式阶段事件的仪器和相关的消费者,看到第25.11.5,“表现图式阶段事件表”

  1. 使stage/innodb/buffer pool load工具:

    MySQL的>UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'stage/innodb/buffer%';
  2. 使舞台事件消费表,其中包括events_stages_currentevents_stages_history,和events_stages_history_long

    MySQL的>UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%stages%';
  3. 把当前的缓冲池的状态使innodb_buffer_pool_dump_now

    MySQL的>SET GLOBAL innodb_buffer_pool_dump_now=ON;
  4. 检查缓冲池堆状况以确保操作完成。

    mysql> SHOW STATUS LIKE 'Innodb_buffer_pool_dump_status'\G
    *************************** 1. row ***************************
    Variable_name: Innodb_buffer_pool_dump_status
            Value: Buffer pool(s) dump completed at 150202 16:38:58
    
  5. 通过启用缓冲池的负荷innodb_buffer_pool_load_now

    MySQL的>SET GLOBAL innodb_buffer_pool_load_now=ON;
  6. 通过查询性能模式检查缓冲池负荷运行现状events_stages_currentTable .thework_completed列显示了缓冲池页面数载。这个WORK_ESTIMATED柱提供剩余工作的一个估计,在页。

    MySQL的>SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATEDFROM performance_schema.events_stages_current;------------------------------- ---------------- ---------------- | event_name | work_completed | work_estimated | ------------------------------- ---------------- ---------------- |阶段/ InnoDB /缓冲池的负荷| 5353 | 7167 | ------------------------------- ---------------- ----------------

    这个events_stages_current如果缓冲池负荷操作完成表格返回空集。在这种情况下,你可以检查events_stages_history表观为完成事件数据。例如:

    MySQL的>SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM performance_schema.events_stages_history;------------------------------- ---------------- ---------------- | event_name | work_completed | work_estimated | ------------------------------- ---------------- ---------------- |阶段/ InnoDB /缓冲池的负荷| 7167 | 7167 | ------------------------------- ---------------- ----------------
笔记

你还可以监视缓冲池负荷进步使用性能模式加载缓冲池时,在启动时使用innodb_buffer_pool_load_at_startup。在这种情况下,的InnoDB缓冲池负荷/阶段/仪器和相关的消费者必须在启动时启用。有关更多信息,参见第25,绩效模式启动配置”

15.6.3.9监测使用InnoDB缓冲池监测标准

InnoDB标准的显示器输出,可以通过使用SHOW ENGINE INNODB STATUS关于操作,提供的指标InnoDB缓冲池。缓冲池数据位于BUFFER POOL AND MEMORYInnoDB标准监视器输出,出现类似下面的:

----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 2198863872
Dictionary memory allocated 776332
Buffer pool size   131072
Free buffers       124908
Database pages     5720
Old database pages 2071
Modified db pages  910
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 4, not young 0
0.10 youngs/s, 0.00 non-youngs/s
Pages read 197, created 5523, written 5060
0.00 reads/s, 190.89 creates/s, 244.94 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not
0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read
ahead 0.00/s
LRU len: 5720, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]

下表描述了InnoDB缓冲池数据报告的InnoDB监测标准

笔记

每秒平均提供InnoDB标准监视器输出是基于以来经过的时间InnoDB标准监视器输出上次打印。

表15.2 InnoDB缓冲池的度量

姓名描述
总的内存分配总内存分配的缓冲池字节。
字典的内存分配总内存分配给InnoDB字节的数据字典中
缓冲池大小在分配缓冲池页面的总大小。
自由区在缓冲区池自由列表页面的总大小。
数据库页在缓冲池的LRU列表页面的总大小。
旧的数据库页在旧的LRU列表的页面缓冲池的总大小。
改性双基页当前页面在缓冲池中修改数。
等待读取缓冲池页面等待在缓冲池读数。
待写入LRU一些旧的脏页缓冲池内被写入从LRU列表的底部。
待写刷新列表在检查点被刷新缓冲池页面数量。
待写单页一些未决的独立页写缓冲池内。
页面的年轻总页数使年轻的缓冲池中(移动到LRU列表的子列表头页)
页面不年轻了总页数不让年轻的缓冲池中的LRU列表(一直保持在页面旧版不让年轻的子列表)
年轻人的每秒平均访问的缓冲池中的LRU列表已经使年轻的老页面制作页。看笔记,按照此表的更多信息。
非弹性的每秒平均访问的缓冲池中的LRU列表,导致没有年轻老页页。看笔记,按照此表的更多信息。
书读的从缓冲池读总页数
创建的页面在缓冲池中创建的页面总数。
页写文字从缓冲池的总页数。
读取/秒每个缓冲池页面二平均每秒读取。
创建/ s每个缓冲池页面每秒创建的第二平均数。
写的每个缓冲池页面的第二平均每秒写入数。
缓冲池命中率缓冲池页面命中从缓冲池内存与磁盘存储读取页率从。
年轻的制作速度平均命中率,页面访问导致制作页年轻。看笔记,按照此表的更多信息。
没有(年轻的制作速度)平均命中率,页面访问没有导致页面年轻。看笔记,按照此表的更多信息。
页面预读每秒平均提前读操作
没有页面被驱逐每个网页的驱逐不从缓冲池二平均访问。
随机读吧每个随机二平均提前读操作。
LRU Len在缓冲池的LRU列表页面的总大小。
莱恩_ LRU解压在缓冲池unzip_lru列表页面的总大小。
I / O和缓冲池的LRU列表页面访问总数,在最后的50秒。
I/O流总数量的缓冲池的LRU列表页面访问。
的I / O和解压总数量的缓冲池unzip_lru列表页面访问。
I/O unzip CUR总数量的缓冲池unzip_lru列表页面访问。

笔记

  • 这个youngs/s度量只涉及旧的页面。它是基于一些访问网页而不是页面的数量。可以有多个访问一个给定的页面,所有这些都算。如果你看的很低年轻人的当没有发生大的扫描值,你可能需要减少延迟时间或增加使用旧表缓冲池的百分比。含量的增加使老子更大,在移动到尾和被采取的子列表更长的页面,所以。这增加了页面被访问一次,让年轻的可能性。

  • 这个non-youngs/s度量只涉及旧的页面。它是基于一些访问网页而不是页面的数量。可以有多个访问一个给定的页面,所有这些都算。如果你没有看到很多非弹性的当你做的大表扫描(和许多youngs/s),增加延时值

  • 这个young-making访问率占所有缓冲池页面,不只是访问在老子列表页。这个年轻的制作率和not率通常不总计达整体缓冲池命中率。页面点击在老子导致页面移动到新的子列表,但页面点击在新页面的列表,因为只有他们是从头部一定距离移动到列表的头。

  • not (young-making rate)的平均命中率,页面访问没有导致页面年轻由于定义的延迟innodb_old_blocks_time没有得到满足,或因在新的子列表,不在页面移动到头部的结果页面点击。这个比率占访问所有缓冲池页面,不只是访问在老子列表页。

InnoDB缓冲池服务器状态变量INNODB_BUFFER_POOL_STATS表提供了许多相同的缓冲池数据发现InnoDB标准监视器输出。有关更多信息INNODB_BUFFER_POOL_STATS表,看例15.10、“查询innodb_buffer_pool_stats表”

15.6.4 InnoDB缓冲配置变化

什么时候INSERTUPDATE,和DELETE手术是在表,索引列的值(特别是次级键的值)通常是在一个无序的秩序,需要大量的I/O带来的次要指标,到目前为止。InnoDB有一个变化的缓冲缓存来辅助索引条目变化有关网页不在缓冲池,从而避免昂贵的I/O操作不立即阅读页面从磁盘。缓冲的变化进行合并,当页面加载到缓冲池,并更新页面后刷新到磁盘。这个InnoDB主线程将缓冲的变化时,服务器几乎是空闲的,在缓慢关闭

因为它可以减少磁盘读写缓冲功能的变化是I/O密集型工作负载,是最宝贵的,对于大量的DML操作如批量插入应用实例。

然而,改变缓冲区占用的缓冲池的一部分,减少可用的缓存数据页的记忆。如果工作集几乎适合在缓冲池中,或者如果你的表有相对较少的二级指标,它可以禁用缓冲有用的改变。如果工作集完全适合的缓冲区内,改变缓冲不施加额外的开销,因为它只适用于页面不在缓冲池。

你可以控制的程度,InnoDB执行变化的缓冲使用innodb_change_buffering配置参数。您可以启用或禁用缓冲的插入、删除操作(当索引记录最初被标记为删除)和清除操作(当索引记录物理删除)。更新操作是一个组合的插入和删除。默认的innodb_change_buffering全部

被允许innodb_change_buffering价值观包括:

  • all

    默认值:缓冲器插入、删除标记操作和清洗。

  • none

    没有缓冲区的任何操作。

  • inserts

    缓冲器插入操作

  • deletes

    缓冲区删除标记操作

  • changes

    缓冲区插入和删除操作都标记。

  • purges

    缓冲区的物理删除操作发生在后台。

你可以设置innodb_change_buffering在MySQL选项文件参数(my.cnfmy.ini)或动态变化的SET GLOBAL命令,要求SYSTEM_VARIABLES_ADMIN超级的特权。改变设置影响新业务的缓冲;现有的缓存条目合并不受影响。

改变缓冲不支持二级索引,如果索引包含一个降序索引列或如果主键包括降序索引列。

相关的信息,看第15.4.2,“Change Buffer”。有关配置改变缓冲区大小的信息,参见第15.6.4.1,“配置更改缓冲区的最大大小”

15.6.4.1配置改变缓冲区的最大大小

这个innodb_change_buffer_max_size配置选项允许您配置更改缓冲区的最大大小的缓冲池的总大小的百分比。默认情况下,innodb_change_buffer_max_size设置为25。最大值设置为50。

你可能会考虑增加innodb_change_buffer_max_size在一个大的插入、更新和删除MySQL服务器,活动,改变缓冲区合并不在与新变化的缓冲条目保持同步,导致变化的缓冲达到其最大大小限制。

你可能会考虑降低innodb_change_buffer_max_size一个用于报告静态数据的MySQL服务器,或者改变缓冲区消耗太多的内存空间和缓冲池的共享,造成页面的年龄从缓冲池早于预期。

测试不同的设置具有代表性的工作量来确定最优配置。这个innodb_change_buffer_max_size环境是动态的,它允许你修改的设置而不重新启动服务器。

15.6.5配置InnoDB线程并发

InnoDB使用操作系统螺纹处理来自用户的交易请求。(交易可能问题的多种要求InnoDB在他们提交或回滚。)在现代操作系统和服务器的多核处理器,在上下文切换是有效的,大多数的工作负载运行在并行线程没有任何数量限制。

在有助于减少上下文切换线程之间的情况,InnoDB可以使用一些技术来限制数量的并发执行的操作系统线程(因此,在任何一个时间处理的请求数)。什么时候InnoDB接收来自用户会话的新要求,如果线程并发执行的数量是在一个预先定义的限制,新的要求睡上一段时间才能再次尝试。请求不能改期后睡眠放在第一/先出队列和最终处理。等待锁的线程不计算在许多并发执行的线程。

你可以通过设置配置参数限制并发线程数innodb_thread_concurrency。一旦执行的线程的数量达到此限制,额外的线程睡眠了数微秒,设置配置参数innodb_thread_sleep_delay,在被放入队列

你可以设置配置选项innodb_adaptive_max_sleep_delay你会允许的最高值innodb_thread_sleep_delay,和InnoDB自动调整innodb_thread_sleep_delay向上或向下取决于当前线程调度活动。这种动态的调整有助于线程调度机制工作顺利时,当系统负载较轻时,当它接近满负荷运行。

默认值为innodb_thread_concurrency在并发线程数默认情况下的极限已经在各个版本的MySQL的改变InnoDB。默认值innodb_thread_concurrency默认情况下,所以有上并发执行的线程数量不限。

InnoDB使线程睡眠只有当并发线程的数量是有限的。当有线程的数量没有限制,所有的人同样被预定。就是说,如果innodb_thread_concurrency,价值innodb_thread_sleep_delay被忽略

当有线程数限制(当innodb_thread_concurrency>0),InnoDB减少上下文允许多个请求的执行过程中进行切换的开销单独的SQL语句进入InnoDB不遵守的限制innodb_thread_concurrency。因为一个SQL语句(如加入)可以包含多行内的操作InnoDBInnoDB分配指定数量的这允许一个线程被调度多次以最小的开销。

当一个新的SQL语句开始,一个线程没有门票,它必须遵守innodb_thread_concurrency。一旦线程有权进入InnoDB,它分配一个编号的门票,可以使用随后进入InnoDB执行行操作。如果票用完,线程被驱逐,和innodb_thread_concurrency再次,观察可能发生线程回到先进/先出等待线程队列。当线程再次有资格进入InnoDB再次,门票分配。门票分配数量由全局选项指定innodb_concurrency_tickets,默认值是5000。一个线程正在等待锁了一张一旦锁定可用。

这些变量的正确值取决于你的环境和工作量。尝试各种不同的值来确定什么适合你的应用价值。在数量限制的并发执行的线程,查看配置选项可以提高性能InnoDB在多核多处理器计算机,如innodb_adaptive_hash_index

关于MySQL线程处理性能的信息,参见第8.12.4.1,“MySQL如何使用线程,客户端连接”

15.6.6配置背景InnoDB I/O线程数

InnoDB使用背景螺纹服务于各种类型的I/O请求。您可以配置一些后台线程服务读写I/O数据页上使用innodb_read_io_threadsinnodb_write_io_threads配置参数。这些参数意味着后台线程用于读取和写入请求的数量,分别。他们在所有支持的平台是有效的。你可以在MySQL选项文件这些参数的值(my.cnfmy.ini你不能改变值动态)。这些参数的默认值与允许值的范围从1-64

这些配置选项的目的InnoDB在高端系统的可扩展性。每一个后台线程可以处理多达256未决的I/O请求。背景的I / O的主要来源读前请求InnoDB试图平衡在大多数背景线程共享的工作同样这样传入请求的负载。InnoDB也试图分配读请求来自同一程度相同的线程,增加合并请求的机会。如果你有一个高端I/O子系统和你看到超过64×innodb_read_io_threads待读的要求显示引擎INNODB STATUS输出,你可能通过增加值提高性能innodb_read_io_threads

在Linux系统,InnoDB采用异步I/O子系统默认执行提前读写数据文件页面的请求,而改变的方式InnoDB后台线程服务这些类型的I/O请求。有关更多信息,参见第15.6.7,使用异步I/O的Linux”

为更多的信息关于InnoDBI/O性能,看第8.5.8,“优化InnoDB的磁盘I / O”

15.6.7使用异步I/O的Linux

InnoDB采用异步I/O子系统(本地AIO)在执行预读写数据文件的页面请求Linux。这种行为是由innodb_use_native_aio配置选项,适用于Linux系统只默认启用。在其他Unix系统,InnoDB使用同步I/O只。从历史上看,InnoDB只有异步I/O在Windows系统的应用。使用异步I/O子系统的基于Linux的要求图书馆

同步I/O,查询线程队列的I/O请求,并InnoDB后台线程检索排队请求一次,发出一个同步I/O调用每一。当一个I/O请求完成和I/O调用返回,这InnoDB后台线程处理请求调用I/O完成例程返回处理下一个请求。那可以并行处理请求数n,在那里n是多少InnoDB背景的线程。the number ofInnoDB后台线程控制innodb_read_io_threadsinnodb_write_io_threads。看到第15.6.6,“配置一些背景InnoDB I/O线程”

与本地的AIO,查询线程调度I/O请求直接向操作系统,从而消除由后台线程数的限制。InnoDB后台线程等待I/O事件信号完成请求。当一个请求完成,后台线程调用I/O完成例程和简历等待I/O事件。

本土AIO的优点是可扩展性重I/O密集型系统通常表现出许多悬而未决的读/写在SHOW ENGINE INNODB STATUS\G输出。增加并行处理中使用本地AIO当意味着类型的I/O调度程序或性能的磁盘阵列控制器的I/O性能影响较大。

一个潜在的不利本土AIO重I/O密集型系统是在一些缺乏控制I/O写派遣到操作系统的一次请求。太多的I / O写派遣到操作系统的并行处理的请求,在某些情况下,导致I / O读饥饿,取决于量的I/O活动和系统的能力。

如果用异步I/O子系统在操作系统的问题,防止InnoDB从一开始,你可以启动服务器innodb_use_native_aio=0。这个选项也可以禁用自动启动时,如果InnoDB检测到一个潜在的问题,如组合tmpdir位置,临时文件系统文件系统和Linux内核不支持异步I/O的tmpfs

15.6.8配置InnoDB主线程I/O速率

这个主线程在InnoDB是一个线程在后台执行各种任务。大多数这些任务是I/O相关,例如刷新缓冲池中的脏页或写从插入缓冲区适当的辅助指标。主线程试图在不影响服务器正常工作执行这些任务。它试图估计自由I/O带宽可调的活动,利用自由的能力。历史上,InnoDB使用硬编码的值100 IOPS(每秒输入/输出操作)为总的I/O服务器的能力。

参数innodb_io_capacity表明整体I/O容量可用InnoDB。这个参数应该设置为I/O操作次数,系统每秒可以执行。的值取决于你的系统配置。什么时候innodb_io_capacity是集,主线程估计I/O带宽可用于背景任务基于设定值。设定值一百恢复到旧的行为

你可以设置值innodb_io_capacity任意数的100或更高。默认值是二百,反映其性能的典型的现代的I / O设备比MySQL的早期。通常,在100以前的默认值是适当的消费级存储设备,如硬盘高达7200 RPM。更快的硬盘、RAID配置,和固态硬盘得益于更高的价值。

这个innodb_io_capacity设置所有缓冲池的情况下,总的限制。当脏页刷新,这innodb_io_capacity极限分缓冲池实例之间。更多信息,见innodb_io_capacity系统变量描述

你可以在MySQL选项文件中设置此参数的值(my.cnfmy.ini)或动态变化的SET GLOBAL命令,要求SYSTEM_VARIABLES_ADMIN超级的特权

这个innodb_flush_sync配置选择原因innodb_io_capacity设置要爆发的I/O活动发生在关卡中忽略。innodb_flush_sync默认情况下启用

在早期版本的MySQL,InnoDB主线程同时执行任何需要净化运营这些I/O操作是由其他后台线程进行控制的,其个数innodb_purge_threads配置选项

关于InnoDB的I/O性能的更多信息,参见第8.5.8,“优化InnoDB的磁盘I / O”

15.6.9自旋锁轮询配置

许多InnoDB互斥器读写锁保留时间短。在多核系统上,可如果能获得互斥锁或RW锁一会儿睡觉前一个线程不断检查更有效。如果互斥或RW锁定可用投票期间,线程可以立即继续,在相同的时间片。然而,过于频繁的轮询多个共享对象的线程可能会导致乒乓缓存不同的处理器部分,使彼此的缓存。InnoDB将这个问题,等待后续调查之间的随机时间。延迟是一个繁忙的循环实现。

你能控制的最大延迟的测试之间互斥或RW锁使用参数innodb_spin_wait_delay。环的延迟时间取决于C编译器和目标处理器。(在100MHz的Pentium时代,延迟的单位是一个微秒。)在一个系统中的所有处理器核心共享一个高速缓存,你可以最大限度的降低延迟或禁用忙环共设置innodb_spin_wait_delay=0。在多处理器系统中,能更显著的缓存失效的效果和可能增加的最大延迟。

默认值innodb_spin_wait_delay。自旋等待延迟是一个动态的,你可以指定MySQL选项文件的全局参数(my.cnfmy.ini)或在运行时改变命令SET GLOBAL innodb_spin_wait_delay=delay,在那里delay所需的最大延迟。改变设置要求SYSTEM_VARIABLES_ADMIN超级的特权

为性能考虑InnoDB锁定操作,看第11,“优化锁定操作”

15.6.10配置InnoDB净化调度

这个净化操作(一种垃圾收集),InnoDB自动执行可以由一个或多个独立的线程,而不是部分的执行主线程。单独的线程的使用提高了可扩展性允许主数据库操作独立运行维护工作的背景下发生的。

为了控制这一特点,增加配置选项的值innodb_purge_threads。如果DML操作集中在一个桌子或几张桌子,保持低使线程不会互相争夺进入繁忙的表。如果DML操作分散到多个表,增加设置。它的最大值是32。innodb_purge_threads是一种非动态的配置选项,这意味着它不能被配置在运行。

还有一个相关的配置选项,innodb_purge_batch_size在300和最大值,默认值5000。该选项主要用于试验和吹扫操作调整,而不应该是典型的用户兴趣。

关于InnoDB的I/O性能的更多信息,参见第8.5.8,“优化InnoDB的磁盘I / O”

15.6.11配置优化器统计InnoDB

本节介绍了如何配置持久性和非持久的优化器统计InnoDB

持续优化统计信息在服务器重启时坚持,允许更大的计划的稳定性和更一致的查询性能。持续优化统计还提供控制和灵活性这些额外的好处:

  • 你可以使用innodb_stats_auto_recalc配置选项控制是否自动更新后的统计表的实质性变化。

  • 你可以使用STATS_PERSISTENTstats_auto_recalc,和STATS_SAMPLE_PAGES保险条款CREATE TABLEALTER TABLE报表配置单独的表,优化器统计。

  • 你可以查询优化器的统计数据mysql.innodb_table_statsmysql.innodb _ index stats _

  • 你可以查看last_update列的mysql.innodb _ _ stats桌mysql.innodb_index_stats当看到统计表的最后更新。

  • 你可以手动修改mysql.innodb_table_statsmysql.innodb _ index stats _表强制一个特定的查询优化计划或测试替代方案不需要修改数据库。

默认启用的是持续的优化统计特征(innodb_stats_persistent=ON

非持久性优化统计了每个服务器重启等操作后,计算在下表访问。作为一个结果,可以产生不同的估计时,重新计算统计,导致执行计划和查询性能的变化,不同的选择。

本节还提供了有关估计ANALYZE TABLE的复杂性,可尝试实现准确统计平衡时ANALYZE TABLE执行时间

15.6.11.1配置持续优化统计参数

持续优化统计特征提高了计划的稳定性通过存储到磁盘并使其持续数据在服务器重新启动,优化器更可能是一次对于一个给定的查询作出一致的选择。

优化器统计信息都保存到磁盘时innodb_stats_persistent=ON或当个人表创建或改变STATS_PERSISTENT=1innodb_stats_persistent默认情况下启用

从前,优化器统计了每个服务器重启等操作后,计算在下表访问。因此,可以产生不同的估计时,重新计算统计、领导查询执行计划,这样的变化在查询性能上有不同的选择。

持久性数据存储在mysql.innodb_table_statsmysql.innodb _ index stats _表中所描述的第15.6.11.1.5,“会持续统计表”

恢复使用非持久性的优化统计信息,你可以修改表的使用ALTER TABLE tbl_name STATS_PERSISTENT=0声明。相关的信息,看第15.6.11.2,“配置非持续优化统计参数

15.6.11.1.1配置自动统计计算持续optimizerstatistics

这个innodb_stats_auto_recalc配置选项,默认情况下是启用的,确定统计计算时自动表进行实质性变化(超过百分之十的行)。您也可以配置为使用一个单独的表,自动统计计算stats_auto_recalc子句中CREATE TABLEALTER TABLE声明innodb_stats_auto_recalc默认情况下启用

由于自动统计计算的异步性(发生在后台),统计数据可能不重新计算立即运行一个DML操作影响多于一个表10%后,即使innodb_stats_auto_recalc启用。在某些情况下,统计计算,可以由一个几秒钟的延迟。如果最新的统计数据都需立即改变一个表的重要部分后,运行ANALYZE TABLE启动同步(前景)重新计算统计。

如果innodb_stats_auto_recalc是残疾人,确保优化器统计的准确性通过发放ANALYZE TABLE每个适用的表的语句后的索引列作出实质性的变化。你可能在有代表性的数据被加载到表运行该语句在你安装脚本,运行后定期DML操作显著改变索引列的内容,或按计划在空闲的时候。当一个新的索引添加到现有的表或列添加或删除指标统计计算和添加到“无辜”的索引表姑的价值innodb_stats_auto_recalc

注意安全

为确保统计信息的收集在一个新的索引被创建,或者使innodb_stats_auto_recalc选项,或运行ANALYZE TABLE在创建索引时,每个新的持久的统计模式启用。

15.6.11.1.2配置优化器统计参数的单个表

innodb_stats_persistentinnodb_stats_auto_recalc,和innodb_stats_persistent_sample_pages全局配置选项。覆盖这些系统范围的设置和配置单独的表,优化器的统计参数,您可以定义_持久性数据STATS_AUTO_RECALC,和页:1条款CREATE TABLEALTER TABLE声明.

  • STATS_PERSISTENT指定是否启用持续的统计对于一个InnoDBTable .the value默认导致持续统计表是由设置innodb_stats_persistent配置选项。的价值使表持续的统计,而价值0关闭此功能。使持续统计通过后创建表ALTER TABLE声明的问题ANALYZE TABLE表计算统计,加载后有代表性的数据到表中。

  • STATS_AUTO_RECALC指定是否自动重新计算持续的统计对于一个InnoDBTable .the value默认导致持续统计表是由设置innodb_stats_auto_recalc配置选项。的价值原因是时重新计算统计表中的数据10%已经改变了。的价值0防止此表的自动重新计算;使用此设置问题ANALYZE TABLE表重新计算统计后的表格作出实质性的变化。

  • STATS_SAMPLE_PAGES指定样本估计基数和其他统计索引列的索引页面的数量,如计算ANALYZE TABLE

三条款说明如下CREATE TABLE例子:

CREATE TABLE `t1` (`id` int(8) NOT NULL auto_increment,`data` varchar(255),`date` datetime,PRIMARY KEY  (`id`),INDEX `DATE_IX` (`date`)) ENGINE=InnoDB,  STATS_PERSISTENT=1,  STATS_AUTO_RECALC=1,  STATS_SAMPLE_PAGES=25;
15.6.11.1.3配置采样页数InnoDB优化器统计

MySQL查询优化器使用估计统计关于关键字的分布来选择执行计划指标,基于相对选择性该指数。等操作ANALYZE TABLE起因InnoDB样本随机从每个网页索引表上的估计基数该指数。(这种技术称为随机跳水。)

给你对统计质量控制的估计(从而更好的信息对查询优化器),你可以使用参数改变采样的页面数innodb_stats_persistent_sample_pages,它可以在运行时设置。

innodb_stats_persistent_sample_pages有一个默认值20。作为一般准则,考虑修改此参数时遇到下列问题:

  1. 统计不够准确和优化选择次优方案,如图所示EXPLAIN输出。统计数据的准确性可以通过比较某一指标实际基数检查(如返回运行SELECT DISTINCT在索引列)提供的估计mysql.innodb _ index stats _持续的统计表

    如果确定统计不够准确,价值innodb_stats_persistent_sample_pages应该增加到统计估计是足够准确的。增加的innodb_stats_persistent_sample_pages太多了,但是,可能导致ANALYZE TABLE运行缓慢

  2. ANALYZE TABLE太慢了。在这种情况下innodb_stats_persistent_sample_pages应该减少直到ANALYZE TABLE执行时间是可以接受的。减少的价值太多,但是,可能会导致第一个问题不准确的统计数据和次优的查询执行计划。

    如果一个平衡不能实现之间的准确的统计ANALYZE TABLE执行时,考虑减少索引的表中的列或限制分区数量减少ANALYZE TABLE复杂性.表中的主键列的数目也是很重要的考虑,因为主键列附加到每个非唯一索引。

    相关的信息,看第15.6.11.3,“估计分析表的复杂性InnoDB表”

15.6.11.1.4包括删除标记的记录持续的统计计算

默认情况下,InnoDB读取未提交的数据在计算统计。在一个事务中删除行从表的情况,InnoDB排除了删除标记时计算行估计和指数统计记录,从而导致非最优的执行计划的其他交易,操作上同时使用事务隔离级别以外READ UNCOMMITTED。为了避免这一情况的发生,innodb_stats_include_delete_marked能够确保InnoDB包括删除标记的记录计算时持续优化统计。

什么时候innodb_stats_include_delete_marked启用,ANALYZE TABLE考虑删除标记的记录时,重新计算统计。

innodb_stats_include_delete_marked是一个全球性的设置影响所有InnoDB表,它只适用于持续优化统计。

15.6.11.1.5 InnoDB持续统计表

持续的统计特征依赖于内部管理中的表mysql数据库,命名为_ _ InnoDB数据表innodb_index_stats。这些表是在所有的安装,自动升级设置,建立从源程序。

对innodb_table_stats列表15.3

列名称描述
database_name数据库名称
table_name表名,分区名称,或子分区的名称
last_update时间戳指示最后一次InnoDB更新了该行
n_rows表中的行数
clustered_index_size主索引的大小,在页面
sum_of_other_index_sizes其他的总大小(非主要)指标,在页

对innodb_index_stats列表15.4

列名称描述
database_name数据库名称
table_name表名,分区名称,或子分区的名称
index_name指标名称
last_update时间戳指示最后一次InnoDB更新了该行
stat_name统计的名称,其价值是在报道stat_value专栏
stat_value的统计值,命名为stat_name专栏
sample_size页面进行中提供的估计数stat_value专栏
stat_description的统计描述,为在stat_name专栏

innodb_table_stats“无辜”的索引表包括last_update列显示当InnoDB最后更新索引统计信息,如下面的示例所示:

mysql> SELECT * FROM innodb_table_stats \G
*************************** 1. row ***************************
           database_name: sakila
              table_name: actor
             last_update: 2014-05-28 16:16:44
                  n_rows: 200
    clustered_index_size: 1
sum_of_other_index_sizes: 1
...
MySQL的>SELECT * FROM innodb_index_stats \G*************************** 1。行*************************** database_name:sakila table_name:演员index_name:主要last_update:2014-05-28 16:16:44 stat_name:n_diff_pfx01 stat_value:200 sample_size:1…

这个innodb_table_stats“无辜”的索引桌子是普通的桌子和可以手动更新。手动更新统计信息的能力,使得它可以强制一个特定的查询优化计划或测试替代方案不修改数据库。如果你手动更新统计问题FLUSH TABLE tbl_name指挥使MySQL重装更新统计。

持续的统计是局部信息,因为它们涉及到服务器实例。这个innodb_table_stats“无辜”的索引表不能复制时自动统计计算的发生。如果你运行ANALYZE TABLE启动同步重新计算统计,这句话是复制的(除非你抑制它,并重新计算测井)发生在复制的奴隶。

15.6.11.1.6 InnoDB持续统计表的例子

这个innodb_table_stats表包含每个表的一行。收集到的数据,下面的例子演示了。

t1包含一个主索引(列b二级指标(柱)Cd),和唯一索引(列E f):

CREATE TABLE t1 (a INT, b INT, c INT, d INT, e INT, f INT,PRIMARY KEY (a, b), KEY i1 (c, d), UNIQUE KEY i2uniq (e, f)) ENGINE=INNODB;

插入5排样本数据后,出现如下表:

mysql> SELECT * FROM t1;
+---+---+------+------+------+------+
| a | b | c    | d    | e    | f    |
+---+---+------+------+------+------+
| 1 | 1 |   10 |   11 |  100 |  101 |
| 1 | 2 |   10 |   11 |  200 |  102 |
| 1 | 3 |   10 |   11 |  100 |  103 |
| 1 | 4 |   10 |   12 |  200 |  104 |
| 1 | 5 |   10 |   12 |  100 |  105 |
+---+---+------+------+------+------+

立即更新统计运行ANALYZE TABLE(如果innodb_stats_auto_recalc启用自动更新,统计数据在几秒钟内,假设10的阈值改变表格行达):

MySQL的>ANALYZE TABLE t1;--------- --------- ---------- ---------- |表| OP | msg_type | msg_text | --------- --------- ---------- ---------- | test.t1 |分析|状态|好| --------- --------- ---------- ----------

表统计表t1最后一次InnoDB更新表的统计(2014-03-14 14:36:34),表中的行数(),聚簇索引的大小(1页),和其他指标的大小(页)

mysql> SELECT * FROM mysql.innodb_table_stats WHERE table_name like 't1'\G
*************************** 1. row ***************************
           database_name: test
              table_name: t1
             last_update: 2014-03-14 14:36:34
                  n_rows: 5
    clustered_index_size: 1
sum_of_other_index_sizes: 2

这个innodb_index_stats表中各指标的多行。在每一行“无辜”的索引表提供了一个特定的指数的统计,即在相关数据stat_name柱中描述_状态描述柱。例如:

mysql> SELECT index_name, stat_name, stat_value, stat_description
       FROM mysql.innodb_index_stats WHERE table_name like 't1';
+------------+--------------+------------+-----------------------------------+
| index_name | stat_name    | stat_value | stat_description                  |
+------------+--------------+------------+-----------------------------------+
| PRIMARY    | n_diff_pfx01 |          1 | a                                 |
| PRIMARY    | n_diff_pfx02 |          5 | a,b                               |
| PRIMARY    | n_leaf_pages |          1 | Number of leaf pages in the index |
| PRIMARY    | size         |          1 | Number of pages in the index      |
| i1         | n_diff_pfx01 |          1 | c                                 |
| i1         | n_diff_pfx02 |          2 | c,d                               |
| i1         | n_diff_pfx03 |          2 | c,d,a                             |
| i1         | n_diff_pfx04 |          5 | c,d,a,b                           |
| i1         | n_leaf_pages |          1 | Number of leaf pages in the index |
| i1         | size         |          1 | Number of pages in the index      |
| i2uniq     | n_diff_pfx01 |          2 | e                                 |
| i2uniq     | n_diff_pfx02 |          5 | e,f                               |
| i2uniq     | n_leaf_pages |          1 | Number of leaf pages in the index |
| i2uniq     | size         |          1 | Number of pages in the index      |
+------------+--------------+------------+-----------------------------------+

这个stat_name列显示以下类型的统计:

  • size:where国家_ name=size,的_状态的价值列显示在索引中的总页数。

  • n_leaf_pages:where国家_ name=n_leaf_pages,的_状态的价值列显示在索引叶子页的数量。

  • n_diff_pfxNN:在哪里国家_ name=n_diff_pfx01,的_状态的价值列显示在索引中的第一列的不同值的个数。哪里stat_name=n _ _ pfx02 diff,的stat_value列显示在索引中的第一两列的不同值的个数,等等。此外,在国家_ name=n_diff_pfxNN,的_状态描述列显示一个逗号分隔的列表的索引的列数。

为了进一步说明n_diff_pfxNN统计数据为基数,考虑再次T1表的例子,介绍了以前。如下图所示,该t1表是一个初步建立索引(列b),次要指标(柱Cd),和一个唯一索引(列Ef):

CREATE TABLE t1 (  a INT, b INT, c INT, d INT, e INT, f INT,  PRIMARY KEY (a, b), KEY i1 (c, d), UNIQUE KEY i2uniq (e, f)) ENGINE=INNODB;

插入5排样本数据后,出现如下表:

mysql> SELECT * FROM t1;
+---+---+------+------+------+------+
| a | b | c    | d    | e    | f    |
+---+---+------+------+------+------+
| 1 | 1 |   10 |   11 |  100 |  101 |
| 1 | 2 |   10 |   11 |  200 |  102 |
| 1 | 3 |   10 |   11 |  100 |  103 |
| 1 | 4 |   10 |   12 |  200 |  104 |
| 1 | 5 |   10 |   12 |  100 |  105 |
+---+---+------+------+------+------+

当你查询index_name国家_ namestat_value,和_状态描述哪里stat_name LIKE 'n_diff%',下面的返回结果集:

MySQL的>SELECT index_name, stat_name, stat_value, stat_descriptionFROM mysql.innodb_index_statsWHERE table_name like 't1' AND stat_name LIKE 'n_diff%';————| ----------------- Enbrel ------- ----------------- Enbrel -------指标_ name name | _ |状态状态状态_价值| _描述| ----------------- Enbrel -------——----------------- Enbrel -------将|小学| N _差异_ pfx01 | | A 1 N | |小学| _差异_ pfx02 | 5 | A,B | | |(N _差异_ pfx01 | 1 | | | | C(n _差异_ pfx02 | 2 | C,D(N | | | _差异_ pfx03 | 2 | C,D,A(N | | | _差异_ pfx04 | 5 | C,D,A,B | | i2uniq | N _差异_ pfx01 | 2 |电子| | i2uniq | N _差异_ pfx02 | 5 | E、F——----------------- Enbrel -------将| ----------------- Enbrel -------

对于PRIMARY指数,有两n _ diff %排.行数等于索引中的列数。

笔记

对不起的反应InnoDB添加主键的列

  • 哪里index_name=首要stat_name=n_diff_pfx01,的stat_value,这表明有索引的第一列一个不同的值(柱a)。在列中不同值的个数由柱查看数据确认aT1,其中有一个不同的值(1)。计算列()所示stat_description结果集的列

  • 哪里index_name=首要stat_name=n _ _ pfx02 diff,的stat_value,这表明在两列索引五种不同的价值观(a,b)。在列中不同值的个数b通过查看数据证实在列bT1,其中有五个不同的值:(1,1),(1,2),(1,3),(1)和(1,5)。计算列(A,B)表现在stat_description结果集的列

第二次索引i1),有四n _ diff %排.只有两列为次要指标定义(c,d)但是有四n _ diff %对于二级索引行因为InnoDB后缀所有非唯一索引和主键。作为一个结果,有四n _ diff %行,而不是两个占二次索引列(c,d)和主键列(A,B

  • 哪里index_name=1stat_name=n_diff_pfx01,的stat_value,这表明有索引的第一列一个不同的值(柱c)。在列中不同值的个数C由柱查看数据确认cT1,其中有一个不同的值:(10)。计算列(C)所示stat_description结果集的列

  • 哪里index_name=1stat_name=n _ _ pfx02 diff,的stat_value,这表明在指数前两列的两个不同的值(c,d)。在列中不同值的个数C一个d通过查看数据证实在列CdT1,其中有两个不同的值:(10,11)和(10、12)。计算列(c,d)表现在_状态描述结果集的列

  • 哪里index_name=1stat_name=n_diff_pfx03,的stat_value,这表明在索引列第3 2个不同的值(c,d,a)。在列中不同值的个数Cd,和由柱查看数据确认cD,和aT1,其中有两个不同的值:(10,11,1)和(10,12,1)。计算列(c,d,a)表现在_状态描述结果集的列

  • 哪里index_name=1stat_name=n _ _ pfx04 diff,的stat_value,这表明在指数的四列五个不同的值(c,d,a,b)。在列中不同值的个数Cdb通过查看数据证实在列Cd,和bT1,其中有五个不同的值:(10,11,1,1),(10,11,1,2),(10,11,1,3),(10,12,1,4)和(10,12,1,5)。计算列(C,D,A,B)表现在stat_description结果集的列

唯一索引(for thei2uniq有两个)n _ diff %排.

  • 哪里index_name=i2uniqstat_name=n_diff_pfx01,的stat_value,这表明有索引的第一列的两个不同的值(柱e)。在列中不同值的个数E由柱查看数据确认eT1,其中有两个不同的值:(100)和(二百)。计算列(e)所示_状态描述结果集的列

  • 哪里index_name=i2uniqstat_name=n _ _ pfx02 diff,的stat_value,这表明在两列索引五种不同的价值观(e,f)。在列中不同值的个数Ef通过查看数据证实在列EfT1,其中有五个不同的值:(100,101),(二十万零一百零二),(100,103),(二十万零一百零四100,105)。计算列(E、F)表现在stat_description结果集的列

15.6.11.1.7检索索引的大小用innodb_index_stats表

索引表、大小的分区,或者子分区可以检索使用innodb_index_stats表在下面的例子中,索引大小的检索表T1。用于定义表t1相应的指标统计,看第15.6.11.1.6,“InnoDB持续统计表”为例

mysql> SELECT SUM(stat_value) pages, index_name,
       SUM(stat_value)*@@innodb_page_size size
       FROM mysql.innodb_index_stats WHERE table_name='t1'
       AND stat_name = 'size' GROUP BY index_name;
+-------+------------+-------+
| pages | index_name | size  |
+-------+------------+-------+
|     1 | PRIMARY    | 16384 |
|     1 | i1         | 16384 |
|     1 | i2uniq     | 16384 |
+-------+------------+-------+

对于分区或子分区,采用一种改进的同一查询WHERE条款可用于检索索引的大小。例如,下面的查询检索索引大小的分区表T1

mysql> SELECT SUM(stat_value) pages, index_name,
       SUM(stat_value)*@@innodb_page_size size
       FROM mysql.innodb_index_stats WHERE table_name like 't1#P%'
       AND stat_name = 'size' GROUP BY index_name;

15.6.11.2配置非持续优化统计参数

本节介绍了如何配置非持续优化统计。优化器统计信息不保存到磁盘时innodb_stats_persistent=OFF或当个人表创建或改变STATS_PERSISTENT=0。相反,数据是存储在内存中,并失去了当服务器关闭。统计数据也通过一定的操作,在一定的条件下,定期更新。

优化器统计信息都保存在磁盘上的默认情况下,启用了innodb_stats_persistent配置选项。关于持续优化统计信息,看第15.6.11.1”配置,持续优化统计参数

优化器统计信息更新

非持久性的优化统计信息更新时:

配置采样的页面数

MySQL查询优化器使用估计统计关于关键字的分布来选择执行计划指标,基于相对选择性of the index .当InnoDB更新优化统计,样本随机从每个网页索引表上的估计基数该指数。(这种技术称为随机跳水。)

给你对统计质量控制的估计(从而更好的信息对查询优化器),你可以使用参数改变采样的页面数innodb_stats_transient_sample_pages。样本页面的默认号码是8,这可能不足以产生一个准确的估计,导致贫困指数的选择由查询优化器。该技术用于大型表和表是特别重要的加入。不必要的全表扫描对于这样的表可以是一个重大的性能问题。看到第8.2.1.21,避免全表扫描”关于优化查询innodb_stats_transient_sample_pages是一个全局参数,可以在运行时设置。

价值innodb_stats_transient_sample_pages影响指数采样的所有InnoDB表和索引的时候innodb_stats_persistent=0。请注意以下潜在的显著影响,当你改变指数样本:

  • 小的值如1或2可以导致不准确的估计数。

  • 增加innodb_stats_transient_sample_pages值可能需要更多的磁盘读取。值远大于8(如100),会导致它需要打开一个表或执行时间显著放缓显示表状态

  • 优化器可能会选择基于索引的选择性不同的估计不同的查询计划。

任何价值innodb_stats_transient_sample_pages最适合的系统,设置选项,让它的价值。选择一个值,结果为所有的表在你的数据库,而不需要过多的I/O,因为统计数字是在执行自动重新计算比其他各次相当准确的估计ANALYZE TABLE,它不增加指数的样本意义,运行ANALYZE TABLE,然后再减少样本大小。

小表一般需要比较大的表少指数样本。如果你的数据库有许多表,考虑使用较高的值innodb_stats_transient_sample_pages如果你是小表

15.6.11.3估计分析InnoDB表的复杂性

ANALYZE TABLE复杂性InnoDB表是依赖于:

使用这些参数,估算的近似公式ANALYZE TABLE复杂性将:

价值innodb_stats_persistent_sample_pages*索引列表中的数×分区数

typically,resulting价值大的,大的执行时间ANALYZE TABLE

笔记

innodb_stats_persistent_sample_pages定义了页面在全球层面的采样数。设置页面进行不同的表的数量,使用页:1选项CREATE TABLEALTER TABLE。有关更多信息,参见第15.6.11.1”配置,持续优化统计参数

如果innodb_stats_persistent=OFF,页面抽取的样本数的定义是innodb_stats_transient_sample_pages。看到第15.6.11.2,“配置非持续优化统计参数额外的信息

为更深入的方法估计ANALYZE TABLE的复杂性,考虑下面的例子。

进入大O符号ANALYZE TABLE复杂性被描述为:

或(n _样品×(n _ cols _在_唯一_ N _ cols _ _ _唯一不在N中_ _ cols _ _ PK(1×N _ _唯一不_)×N _兼职)

哪里:

  • n_sample是页面抽取的样本数(定义innodb_stats_persistent_sample_pages

  • n_cols_in_uniq_i是所有唯一索引的所有列的总数(不包括主键列)

  • n_cols_in_non_uniq_i是在所有的非唯一索引的所有列的总数

  • n_cols_in_pk是主键中的列数(如果没有定义一个主关键字,InnoDB创建一个单列主键内部)

  • n_non_uniq_i表中的非唯一索引的数量

  • n_part是分区的数量。如果没有定义分区表被认为是一个分区。

现在,考虑下面的表格(表t),其中有一个主键(2列),一个唯一索引(2列),和两个非唯一索引(每两列):

创建表(一个int,int b INT,C,D E F int,int,int,int,int g,h,主键(A,B),(C,D i1uniq独特的关键),关键i2nonuniq(E,F),关键i3nonuniq(G,H));

通过上述算法所需的列和索引数据,查询mysql.innodb_index_stats持续性指标统计表表T。这个n_diff_pfx%统计数据显示,每个索引的列数。例如,列b算为主键索引。对于非唯一索引,主键列(A,B)进行计数,除了用户定义的列。

笔记

有关更多信息InnoDB持续的统计表,看第15.6.11.1”配置,持续优化统计参数

mysql> SELECT index_name, stat_name, stat_description
       FROM mysql.innodb_index_stats WHERE
       database_name='test' AND
       table_name='t' AND
       stat_name like 'n_diff_pfx%';
  +------------+--------------+------------------+
  | index_name | stat_name    | stat_description |
  +------------+--------------+------------------+
  | PRIMARY    | n_diff_pfx01 | a                |
  | PRIMARY    | n_diff_pfx02 | a,b              |
  | i1uniq     | n_diff_pfx01 | c                |
  | i1uniq     | n_diff_pfx02 | c,d              |
  | i2nonuniq  | n_diff_pfx01 | e                |
  | i2nonuniq  | n_diff_pfx02 | e,f              |
  | i2nonuniq  | n_diff_pfx03 | e,f,a            |
  | i2nonuniq  | n_diff_pfx04 | e,f,a,b          |
  | i3nonuniq  | n_diff_pfx01 | g                |
  | i3nonuniq  | n_diff_pfx02 | g,h              |
  | i3nonuniq  | n_diff_pfx03 | g,h,a            |
  | i3nonuniq  | n_diff_pfx04 | g,h,a,b          |
  +------------+--------------+------------------+   

基于指数统计数据显示在表定义,下面的值可以确定:

  • n_cols_in_uniq_i在所有的唯一指标,不包括主键列的所有列的总数是2(Cd

  • n_cols_in_non_uniq_i,在所有非唯一索引的所有列的总数是4(EfGh

  • n_cols_in_pk,主键中的列数,2(b

  • n_non_uniq_i,表中的非唯一索引的数量,是2(i2nonuniqi3nonuniq))

  • n_part,分区的数量,是1

你现在可以计算innodb_stats_persistent_sample_pages*(2 4 2×(1 2))×1确定扫描的页面数,叶。与_ InnoDB数据_坚持_ _ pages样品设置为默认值20,和一个16默认页面大小KIBinnodb_page_size=16384), you can then estimate that 20 * 12 * 16384字节读表t4,或大约MIB

笔记

所有4MiB可能无法从磁盘读取的,如一些叶子页面已经被缓存在缓冲池。

15.6.12配置合并阈值的索引页

您可以配置MERGE_THRESHOLD物有所值的索引页。if the全页对于索引页的百分比低于MERGE_THRESHOLD值时删除一行或一行后缩短了一UPDATE操作,InnoDB试图索引页与相邻的索引页合并。默认的MERGE_THRESHOLD值是50,这是以前的硬编码的值。最小merge_threshold值为1,最大值为50。

全页对于索引页的百分比低于50%,这是默认的MERGE_THRESHOLD设置,InnoDB试图与相邻页合并的索引页。如果两页接近50%满,一页页拆分后很快就可以合并发生。如果这个合并分裂行为频繁发生,这会对性能产生不利的影响。为了避免频繁的合并拆分,你可以降低MERGE_THRESHOLD值,InnoDB尝试合并在一个较低的网页全页百分比.合并在一个较低的页面百分点叶索引页更多空间页面,有助于减少合并分裂行为。

这个MERGE_THRESHOLD索引页可以为表或单个指标的定义。一merge_threshold价值为个人指标优先于一MERGE_THRESHOLD值为该表定义。如果不确定的merge_threshold默认值是50

设置一个表格merge_threshold

你可以设置MERGE_THRESHOLD值表使用table_option评论的条款CREATE TABLE声明。例如:

CREATE TABLE t1 (   id INT,  KEY id_index (id)) COMMENT='MERGE_THRESHOLD=45';

您还可以设置MERGE_THRESHOLD对现有的表使用table_option评论条款ALTER TABLE

CREATE TABLE t1 (   id INT,  KEY id_index (id));ALTER TABLE t1 COMMENT='MERGE_THRESHOLD=40';

设置个人指标merge_threshold

设置MERGE_THRESHOLD一个单独的索引值,你可以使用index_option评论条款CREATE TABLEALTER TABLE,或CREATE INDEX,如下图:

  • 设置MERGE_THRESHOLD一个索引的使用CREATE TABLE

    CREATE TABLE t1 (   id INT,  KEY id_index (id) COMMENT 'MERGE_THRESHOLD=40');
  • 设置MERGE_THRESHOLD一个索引的使用ALTER TABLE

    CREATE TABLE t1 (   id INT,  KEY id_index (id));ALTER TABLE t1 DROP KEY id_index;ALTER TABLE t1 ADD KEY id_index (id) COMMENT 'MERGE_THRESHOLD=40';
  • 设置MERGE_THRESHOLD一个索引的使用CREATE INDEX

    CREATE TABLE t1 (id INT);CREATE INDEX id_index ON t1 (id) COMMENT 'MERGE_THRESHOLD=40';
笔记

您不能修改MERGE_THRESHOLD在水平指数值gen_clust_index,这是聚集索引创建InnoDB当一个InnoDB创建了表没有主键或唯一键索引。你只能修改MERGE_THRESHOLD价值gen_clust_index通过设置MERGE_THRESHOLD为表

查询一个指数的merge_threshold价值

目前MERGE_THRESHOLD对于索引值可以通过查询INNODB_INDEXES表。例如:

MySQL的>SELECT * FROM INFORMATION_SCHEMA.INNODB_INDEXES WHERE NAME='id_index' \G*************************** 1。行*************************** index_id:91名称:id_index table_id:68型:0:1:4 n_fields page_no空间:57merge_threshold:40

你可以使用SHOW CREATE TABLE查看merge_threshold一个表中的值,如果明确定义的应用table_option评论条款:

mysql> SHOW CREATE TABLE t2 \G
*************************** 1. row ***************************
       Table: t2
Create Table: CREATE TABLE `t2` (
  `id` int(11) DEFAULT NULL,
  KEY `id_index` (`id`) COMMENT 'MERGE_THRESHOLD=40'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
笔记

MERGE_THRESHOLD价值的指标等级定义优先于一merge_threshold值为该表定义。如果未定义,MERGE_THRESHOLD默认值为50%(MERGE_THRESHOLD=50以前,这是硬编码的值。

同样,你可以使用SHOW INDEX查看merge_threshold一个索引值,如果明确定义的应用index_option评论条款:

mysql> SHOW INDEX FROM t2 \G
*************************** 1. row ***************************
        Table: t2
   Non_unique: 1
     Key_name: id_index
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment:
Index_comment: MERGE_THRESHOLD=40

测量merge_threshold设置的效果

这个INNODB_METRICS表中提供了两个计数器,可以用来衡量一个效果merge_threshold设置索引页合并

mysql> SELECT NAME, COMMENT FROM INFORMATION_SCHEMA.INNODB_METRICS
       WHERE NAME like '%index_page_merge%';
+-----------------------------+----------------------------------------+
| NAME                        | COMMENT                                |
+-----------------------------+----------------------------------------+
| index_page_merge_attempts   | Number of index page merge attempts    |
| index_page_merge_successful | Number of successful index page merges |
+-----------------------------+----------------------------------------+

当降低MERGE_THRESHOLD价值目标:

  • 一个较小的数页合并的尝试和成功的页面合并

  • 类似的一些尝试和成功的页页合并的合并

MERGE_THRESHOLD设置太小会造成大量的数据文件,由于过量的空页空间。

有关使用INNODB_METRICS计数器,看第15.14.6,“InnoDB information_schema度量表”

15.6.13启用自动配置一个专用的MySQL服务器

什么时候innodb_dedicated_server启用,InnoDB自动配置选项,根据服务器上检测到的内存量:

只考虑启用这个选项如果你的MySQL实例运行在一个专用的服务器,MySQL服务器能够消耗所有可用的系统资源。启用此选项不如果你的MySQL实例共享系统资源和其他应用的建议。

如果自动配置选项,配置文件或其他明确的一个选项,用于明确指定的设置和类似启动警告印刷stderr

[Warning] [000000] InnoDB: Option innodb_dedicated_server is ignored for innodb_buffer_pool_size because innodb_buffer_pool_size=134217728 is specified explicitly.

一个选项显式配置不阻止其他选项的自动配置。例如,如果innodb_dedicated_server启用和innodb_buffer_pool_size配置文件中明确的选择,innodb_log_file_sizeinnodb_flush_method仍受自动配置

自动配置设置进行了根据检测到的服务器内存每次MySQL服务器启动量。如果检测到服务器的内存量的变化,自动配置的设置进行相应的调整。

15.7 InnoDB表空间

本节涵盖的主题相关InnoDB表空间

15.7.1 InnoDB SYSTEM表空间大小

本节介绍了如何增加或减少的大小InnoDB系统表空间

增加InnoDB SYSTEM表空间的大小

增加大小的最简单的方法InnoDB系统表空间的配置从一开始就被自动扩展。指定自动在表空间的数据文件属性定义的最后一。然后InnoDB增加文件大小自动在64mb增量时,它的空间运行。增量的大小可以通过设定值的改变innodb_autoextend_increment系统变量,以兆字节

你可以通过适量添加另一个数据文件系统的扩展表空间:

  1. 关闭MySQL服务器。

  2. 如果之前的最后一个数据文件的关键字定义autoextend, change its definition to use a fixed size, based on how large it has actually grown. Check the size of the data file, round it down to the closest multiple of 1024 × 1024 bytes (= 1MB), and specify this rounded size explicitly ininnodb_data_file_path

  3. 添加一个新的数据文件结束innodb_data_file_path,选择使文件自动扩展。只有最后一个数据文件中innodb_data_file_path可以被指定为自动扩展。

  4. 再次启动MySQL服务器。

例如,这个表只有一个数据文件的自动扩展ibdata1

innodb_data_home_dir =innodb_data_file_path = /ibdata/ibdata1:10M:autoextend

假设这个数据文件,随着时间的推移,已经988mb。这里是配置上线后修改原始数据文件使用一个固定的尺寸和添加一个新的自动扩展的数据文件:

innodb_data_home_dir =
innodb_data_file_path = /ibdata/ibdata1:988M;/disk2/ibdata2:50M:autoextend

当你添加一个新的数据文件到系统表空间配置,确保文件不引用现有文件。InnoDB创建和初始化文件当您重新启动服务器。

降低InnoDB SYSTEM表空间的大小

你不能从系统表空间删除数据文件。为了减少系统表空间的大小,使用此程序:

  1. 使用mysqldump把你所有的InnoDB表,包括InnoDB位于MySQL数据库表。

    mysql> SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='mysql' and ENGINE='InnoDB';
    +---------------------------+
    | TABLE_NAME                |
    +---------------------------+
    | columns_priv              |
    | component                 |
    | db                        |
    | default_roles             |
    | engine_cost               |
    | func                      |
    | global_grants             |
    | gtid_executed             |
    | help_category             |
    | help_keyword              |
    | help_relation             |
    | help_topic                |
    | innodb_dynamic_metadata   |
    | innodb_index_stats        |
    | innodb_table_stats        |
    | plugin                    |
    | procs_priv                |
    | proxies_priv              |
    | role_edges                |
    | server_cost               |
    | servers                   |
    | slave_master_info         |
    | slave_relay_log_info      |
    | slave_worker_info         |
    | tables_priv               |
    | time_zone                 |
    | time_zone_leap_second     |
    | time_zone_name            |
    | time_zone_transition      |
    | time_zone_transition_type |
    | user                      |
    +---------------------------+
    
  2. 停止服务器

  3. 删除所有现有的表空间文件(*.ibd),including theibdataib_log文件不要忘记删除鸡传染性法氏囊病*对于位于MySQL数据库表文件。

  4. 一个新的表格

  5. 重新启动服务器

  6. 进口转储文件

笔记

如果只使用你的数据库InnoDB发动机,它可能是简单的转储全部数据库,停止服务器,删除所有数据库InnoDB日志文件,重新启动服务器,并导入转储文件。

15.7.2变化的数量或大小的InnoDB重做日志文件

更改号码或者您的尺寸InnoDB重做日志文件文件,执行以下步骤:

  1. 停止MySQL服务器,确保关闭时没有错误。

  2. 编辑my.cnf更改日志文件配置。更改日志文件的大小,配置innodb_log_file_size。增加日志文件的数量,配置innodb_log_files_in_group

  3. 再次启动MySQL服务器。

如果InnoDB检测到innodb_log_file_size不同于重做日志文件的大小,它就写日志检查点,关闭和删除旧的日志文件,创建新的日志文件所要求的尺寸,并打开新的日志文件。

15.7.3使用原始磁盘分区系统表空间

你可以使用原始磁盘分区中的数据文件InnoDB系统表空间。这项技术使非缓冲I/O在Windows和一些Linux和UNIX系统没有文件系统的开销。执行测试并没有原始分区是否这种变化实际上提高了系统性能。

当你使用一个磁盘分区,请确保运行MySQL服务器的读写权限,分配用户ID。例如,如果你运行的服务器mysql用户,分区必须是可读可写的MySQL。如果你运行的服务器的--memlock选项,服务器必须运行root,所以分区必须是可读可写的root

下面介绍的程序涉及选项文件修改。更多信息,参见第4.2.6、“使用选项文件”

配置Linux和UNIX系统的磁盘分区

  1. 当你创建一个新的数据文件,指定关键字newraw对于数据文件大小后立即innodb_data_file_path选项分区必须至少为你指定的大小一样大。注意:1MBInnoDB1024×1024字节,而1MB的磁盘规格通常是1000000字节。

    [mysqld]
    innodb_data_home_dir=
    innodb_data_file_path=/dev/hdd1:3Gnewraw;/dev/hdd2:2Gnewraw
    
  2. 重新启动服务器InnoDB注意事项newraw关键词并初始化新的分区。然而,不创造或改变任何InnoDB表吗。否则,当你下次重新启动服务器,InnoDB重新初始化分区和更改了。(作为一种安全措施InnoDB防止用户修改数据时,任何分区newraw是指定的。)

  3. InnoDB初始化新的分区,停止服务器,改变newraw在数据文件规范raw

    [mysqld]innodb_data_home_dir=innodb_data_file_path=/dev/hdd1:3Graw;/dev/hdd2:2Graw
  4. 重新启动服务器InnoDB现在允许进行更改

在Windows分配磁盘分区

在Windows系统中,相同的步骤和相应的指南描述了Linux和UNIX系统应用外,innodb_data_file_path在Windows设置略有不同。

  1. 当你创建一个新的数据文件,指定关键字newraw对于数据文件大小后立即innodb_data_file_path选项:

    [mysqld]innodb_data_home_dir=innodb_data_file_path=//./D::10Gnewraw

    这个//./对应于Windows语法\ \ \访问物理驱动器。在上面的例子中,D:是分区的盘符

  2. 重新启动服务器InnoDB注意事项newraw关键词并初始化新的分区。

  3. InnoDB初始化新的分区,停止服务器,改变newraw在数据文件规范raw

    [mysqld]innodb_data_home_dir=innodb_data_file_path=//./D::10Graw
  4. 重新启动服务器InnoDB现在允许进行更改

15.7.4 InnoDB表的表空间文件

从历史上看,所有的InnoDB表和索引存储在系统片。这个整体的方法是针对机器完全致力于数据库处理、精心策划的数据增长,其中分配到MySQL的任何磁盘存储不需要用于其他目的。InnoDB每个表的表空间文件功能提供了更灵活的选择,在每InnoDB表及其索引存储在一个单独的.ibd数据文件。每一个这样的.ibd数据文件代表一个人表空间。这个功能是由innodb_file_per_table配置选项,这是默认启用。

文件表的表空间的优势

  • 你可以回收磁盘空间时截断或删除一个表存储在一个文件中的每个表tablepace。截断或删除表存储在共享系统片创建自由空间在SYSTEM表空间的数据文件(ibdata文件)只能用于新InnoDB数据

    同样,一个表复制ALTER TABLE操作台位于共享表空间可以增加表空间使用的空间量。这样的操作可能需要在表格和索引数据的多少额外的空间。为表复制所需的额外空间ALTER TABLE操作不回操作系统是每个表的表空间文件发布。

  • 这个TRUNCATE TABLE运行更快,存储在每台tablepaces表运行时文件。

  • 你可以存储在不同的存储设备特定的表、I/O优化、空间管理、或备份的目的使用的语法指定每个表的位置CREATE TABLE ... DATA DIRECTORY = absolute_path_to_directory,解释第15.7.5”创建文件,每个表的表空间在数据目录”

  • 你可以运行OPTIMIZE TABLE紧凑型或创建一个文件,每个表的表空间。当你运行一个OPTIMIZE TABLEInnoDB创建一个新的.ibd一个临时文件名的文件,使用只需存储实际数据的空间。当优化完成,InnoDB删除旧的.ibd文件和替换它与新。如果说以前的鸡传染性法氏囊病文件增长显著,但实际数据只占其体积的一部分,运行OPTIMIZE TABLE回收未使用的空间

  • 您可以将个人InnoDB而不是整个数据库表

  • 你可以复制的个体InnoDB从一个MySQL实例到另一个表(称为可传输表空间特征)

  • 在每个表的表空间支持功能与文件创建的表压缩的动态行格式

  • 您可以启用表大更高效的存储BLOB文本柱的使用动态行格式

  • 每个表的表空间可以提高文件恢复成功的机会,节省时间,当一个腐败的发生,当服务器无法重新启动,或当备份和二进制日志不可用。

  • 你可以备份或还原单个表迅速用MySQL企业备份产品,不中断的使用等InnoDB表如果你有表需要备份较少或在不同的备份计划,这是有益的。看到使部分备份详情

  • 每个表的表空间文件每台状态报告时,复制或备份表方便。

  • 你可以在一个文件系统级监控表的大小,而无需访问MySQL。

  • 常见的Linux文件系统不允许同时写入一个文件时,innodb_flush_method是集直接_ O。因此,有可能的性能改进,当使用文件每表表空间结合innodb_flush_method

  • SYSTEM表空间存储数据字典和UNDO日志,和的大小是有限的InnoDB表空间大小的限制。See第15.8.1.7”限制,InnoDB表”。每个表的表空间文件,每个表都有自己的空间,它提供了成长的空间。

每个表的表空间文件潜在的缺点

  • 每个表的表空间文件,每个表可能有未使用的空间,这只能由同一个表中的行的利用。这可能会导致浪费的空间如果不妥善管理。

  • fsync操作必须运行在每一个打开的表,而不是一个单一的文件。因为有一个单独的fsync每个文件的操作,写操作在多个表不能被合并成一个单一的I/O操作。这可能需要InnoDB执行一个较高的总数量fsync运营

  • mysqld必须保持每桌一个打开的文件句柄,这可能会影响性能,如果你在每个表的表空间中有大量的表格文件。

  • 使用多个文件描述符

  • innodb_file_per_table默认情况下启用。你可以考虑禁用如果MySQL 5.5或更早版本的向后兼容性是一个问题。禁用innodb_file_per_table防止ALTER TABLE从移动InnoDB从系统表空间到一个单独的表.ibd文件的情况下ALTER TABLE重新创建表(ALGORITHM=COPY

    例如,当重组聚集索引的InnoDB表,表中重新创建使用当前设置innodb_file_per_table。这种行为不适用于添加或删除时InnoDB次要指标。当一次索引的创建没有重建表,索引存储在同一文件中的表格数据,无论当前innodb_file_per_table设置这种行为也不适用于表添加到系统表空间使用CREATE TABLE ... TABLESPACEALTER TABLE ... TABLESPACE语法。这些表不受影响innodb_file_per_table设置

  • 如果多个表越来越有更多的碎片可以阻碍潜在DROP TABLE和表扫描性能。然而,当碎片化的管理,在自己的表空间有文件可以提高性能。

  • 缓冲池扫描当滴每桌表空间文件,这可能需要几秒钟缓冲池大小的字节数。扫描是一个广泛的内部锁,这可能会延迟其他操作。在SYSTEM表空间的表不受影响。

  • 这个innodb_autoextend_increment变量,它定义了增量大小(MB)扩展延伸共享表空间文件当它成为全自动的大小,并不适用于每个表的表空间文件的文件,这是自动延伸的innodb_autoextend_increment设置最初的扩展是由少量,之后扩展发生在增量4MB。

15.7.4.1启用和禁用文件每个表的表空间

这个innodb_file_per_table选项是默认

设置innodb_file_per_table选择在启动时,用启动服务器--innodb_file_per_table命令行选项,或加入这一行的[ mysqld ]my.cnf

[mysqld]innodb_file_per_table=1

你也可以设置innodb_file_per_table动态,而服务器运行:

MySQL的>SET GLOBAL innodb_file_per_table=1;

innodb_file_per_table启用,您可以存储InnoDB表中的一个tbl_name.ibd文件不像MyISAM存储引擎,有自己独立的tbl_name.MYDtbl_name。我索引和数据文件,InnoDB存储数据和一起在一个单一的指标.ibd文件

如果您禁用innodb_file_per_table在你的启动选项,重新启动服务器,或使它与设置全局命令,InnoDB创建新的内部系统表空间表,除非你明确地把桌子放在每个表的表空间文件或一般的表空间使用CREATE TABLE ... TABLESPACE选项

你总是可以读写任何InnoDB表,无论文件每台设置。

将表从系统表空间的表空间,改变innodb_file_per_table设置和重建表:

MySQL的>SET GLOBAL innodb_file_per_table=1;MySQL的>ALTER TABLE table_name ENGINE=InnoDB;

表添加到系统表空间使用CREATE TABLE ... TABLESPACEALTER TABLE ... TABLESPACE语法不受影响innodb_file_per_table设置把这些表从系统表空间每个表的表空间文件,他们必须移动显式使用ALTER TABLE ... TABLESPACE语法

笔记

InnoDB总是需要SYSTEM表空间因为它的内部数据字典UNDO日志那里。这个.ibd文件是不够的InnoDB操作

当一台搬出SYSTEM表空间为自己.ibd文件,数据文件,使系统保持相同大小的表空间。以前由表占用的空间可重复使用的新InnoDB数据,而不是再生使用的操作系统。当移动大InnoDB表了SYSTEM表空间,磁盘空间是有限的,你可能更倾向于使innodb_file_per_table和重建整个实例应用mysqldump命令。如上所述,表添加到系统表空间使用CREATE TABLE ... TABLESPACEALTER TABLE ... TABLESPACE语法不受影响innodb_file_per_table设置这些表必须单独移动。

15.7.5每表表空间创建外部数据文件的目录

创建一个文件表在MySQL数据目录的位置表,使用DATA DIRECTORY = absolute_path_to_directory的条款CREATE TABLE声明

预先计划的位置,因为你不能使用DATA DIRECTORY条款与ALTER TABLE语句后改变位置。您指定的目录可以在另一个存储设备具有特殊性能或容量的特性,如快速SSD或大容量硬盘

在目标目录中创建一个子目录对应,MySQL数据库的名称,并在这一IBD文件为新表

下面的示例演示如何创建表空间在MySQL数据目录文件并显示.ibd在指定的目录中创建文件。

MySQL的>USE test;数据库changedmysql >SHOW VARIABLES LIKE 'innodb_file_per_table';----------------------- ------- | variable_name |价值| ----------------------- ------- | innodb_file_per_table |在| ----------------------- ------- MySQL >CREATE TABLE t1 (c1 INT PRIMARY KEY) DATA DIRECTORY = '/alternative/directory';# MySQL创建。在子目录对应的数据库# namedb_user @ Ubuntu新表的IBD文件:~ /替代/目录/试验lst1.ibd
笔记

表空间数据文件创建的MySQL数据目录之外被发现在恢复过程中,该目录必须是已知的InnoDB。做一个目录,将它添加到innodb_directories参数的值innodb_directories是一个只读的启动选项。需要重新启动服务器配置。

你也可以使用CREATE TABLE ... TABLESPACE结合数据目录子句创建表空间在MySQL数据目录文件。这样做,你必须指定innodb_file_per_tableas the表空间的名称。

MySQL的>CREATE TABLE t2 (c1 INT PRIMARY KEY) TABLESPACE = innodb_file_per_tableDATA DIRECTORY = '/alternative/directory';

你不需要使innodb_file_per_table使用这种方法时

使用说明:

  • MySQL最初持有.ibd打开文件,防止你拆卸装置,但最终可能如果服务器正在关闭表。虽然MySQL正在小心不小心拆卸外部设备,或启动MySQL而设备断开。试图访问一个表时,相关鸡传染性法氏囊病文件丢失导致一个严重的错误,需要重新启动服务器。

    服务器重启问题的错误和警告如果.ibd文件不在预期的路径。在这种情况下,您可以还原表空间鸡传染性法氏囊病文件从备份或删除表从删除关于它的信息数据字典

  • 在下表在一个NFS安装量,审查潜在问题概述使用NFS与MySQL

  • 如果你使用LVM快照,文件复制,或其他基于文件的备份机制.ibd文件,总是使用FLUSH TABLES ... FOR EXPORT声明首先是要确保所有更改缓冲存储器冲洗磁盘备份发生之前

  • 这个DATA DIRECTORY条款是支持的替代使用符号链接,这是不支持个人InnoDB

15.7.6复制文件到另一个实例的每个表的表空间

本节介绍如何复制文件表从一个MySQL实例到另一个表空间,否则称为迁移表空间功能特色此功能还支持分区InnoDB表和个人InnoDBTaltable Discial and Superation .

有关其他InnoDB表格临摹法,看第15.8.1.3,“移动或复制InnoDB表”

你可能有很多理由可以复制InnoDB文件表表空间不同的实例:

  • 运行报告没有把多余的负荷在生产服务器上。

  • 建立一个新表相同的数据从服务器

  • 要恢复备份的分区表或版本问题或错误后。

  • 作为一个移动数据比进口的结果更快的方法mysqldump命令。数据立即可用,而不必重新插入索引重建。

  • 移动文件表表空间的一个更适合系统要求存储介质服务器。例如,你可能想在一个繁忙的表SSD装置,或在一个大容量的大型表硬盘设备

局限性和用法说明

  • 表空间复制过程时,才有可能innodb_file_per_table启用,这是默认设置。居住在共享系统表空间不能被停止的表。

  • 当一个表是停止的,只有只读事务在受影响的表允许。

  • 导入表空间时,页面大小必须匹配输入实例的页面大小。

  • ALTER TABLE ... DISCARD TABLESPACE负载partitioned is forInnoDB表,并ALTER TABLE ... DISCARD PARTITION ... TABLESPACE支持InnoDB表分区

  • DISCARD TABLESPACE不是一个亲子间的支持(主键外键)关系时foreign_key_checks是集。在丢弃一亲子表的表空间,设置foreign_key_checks=0。分区InnoDB表不支持外键

  • ALTER TABLE ... IMPORT TABLESPACE不强制外键约束进口数据。如果有与表的外键约束,所有的表应该出口在同一时间点(逻辑)。分区InnoDB表不支持外键

  • ALTER TABLE ... IMPORT TABLESPACEALTER TABLE ... IMPORT PARTITION ... TABLESPACE不需要CFG桩复合地基元数据文件导入表空间。然而,元数据检查不进行导入时,没有.cfg文件,并警告类似下面的发行:

    信息:InnoDB:IO读取错误:(2,没有这样的文件或目录)打开错误”。\检验\ t.cfg ',将试图进口无图式核对行集(0秒)

    进口无能力.cfg文件可以更方便的时候没有模式匹配的预期。此外,进口无能力CFG桩复合地基文件可以在崩溃恢复的情况下,无法收集的元数据是有用的.ibd文件

    如果没有.cfg文件使用,InnoDB用一个等效的SELECT MAX(ai_col) FROM table_name FOR UPDATE语句初始化内存自动递增计数器,用于分配的值为汽车专栏否则,当前的最大自动递增计数器值的读取.cfg元数据文件。相关的信息,看InnoDB auto_increment计数器初始化

  • 由于一个.cfg元数据文件的限制,架构不匹配不报道的分区类型或分区定义差异时,进口表空间文件分区表。报道了柱的差异。

  • 当运行ALTER TABLE ... DISCARD PARTITION ... TABLESPACEALTER TABLE ... IMPORT PARTITION ... TABLESPACE在subpartitioned分区和子分区表,表名是允许的。当一个分区,分区名称指定,包括在操作的子分区。

  • 从另一个MySQL服务器实例导入表空间文件作品如果实例有GA(通用性)状态和服务器实例的文件导入是在相同或更高的版本在同一版本系列。导入表空间文件到一个服务器实例运行较早版本的MySQL不支持。

  • 在复制的情景,innodb_file_per_table必须设置为打开(放)对主人和奴隶

  • 在Windows,InnoDB存储数据库,表空间,并在小写字母表的名称。为了避免敏感的操作系统如Linux和Unix的进口问题,创建的所有数据库,表空间,使用小写的名字表。一个方便的方式来完成,这是添加下面一行的[ mysqld ]部分的你my.cnfmy.ini在创建数据库,文件表空间,或表:

    [mysqld]
    lower_case_table_names=1
    
    笔记

    禁止在启动服务器lower_case_table_names设置不同的设置时使用的服务器初始化。

  • ALTER TABLE ... DISCARD TABLESPACEALTER TABLE ...IMPORT TABLESPACE是不是属于一个表支持InnoDB一般的表空间。有关更多信息,参见CREATE TABLESPACE

  • 默认的行格式InnoDB表的配置使用innodb_default_row_format配置选项。试图导入的表不显式定义行格式(row_format),或使用ROW_FORMAT=DEFAULT,可能会导致一个模式失配误差如果innodb_default_row_format设置源实例不同于目标实例的设置。相关的信息,看第15.10.2,“指定行格式为表”

  • 在导出表空间,使用加密InnoDB表空间加密功能,InnoDB生成一个.cfp另外一个文件CFG桩复合地基元数据文件。这个.cfp文件必须复制到目标实例一起CFG桩复合地基文件和表空间文件之前执行ALTER TABLE ... IMPORT TABLESPACE在目标实例操作。这个。CFP文件包含一个传输密钥和加密密钥空间。进口,InnoDB使用传输密钥解密表空间的关键。相关的信息,看第15.7.11,“InnoDB表空间加密”

  • FLUSH TABLES ... FOR EXPORT不支持,有一个全文索引表。全文搜索辅助表不脸红。在导入一张全文指数运行OPTIMIZE TABLE重建全文指标。另外,降FULLTEXT指标导出操作之前和之后重新创建它们进口目标实例的表。

15.7.6.1表空间传输的例子

笔记

如果你是运输表,使用加密InnoDBTabesace enCRyumtion,see局限性和用法说明在你开始之前额外的程序信息。

例1:一个InnoDB表复制到另一个实例

本程序演示如何复制规则InnoDB从运行MySQL服务器实例到另一个运行实例表。有轻微的调整,可以使用相同的方法进行全表的同一实例恢复。

  1. 在源代码实例,创建一个表,如果不存在:

    mysql> USE test;
    mysql> CREATE TABLE t(c1 INT) ENGINE=InnoDB;
    
  2. 在目标实例,创建一个表,如果不存在:

    mysql> USE test;
    mysql> CREATE TABLE t(c1 INT) ENGINE=InnoDB;
    
  3. 在目标实例,抛弃现有的表空间。(前一个表空间可以进口,InnoDB必须抛弃的表空间是连接到接收表。)

    MySQL的>ALTER TABLE t DISCARD TABLESPACE;
  4. 在实例的源码,运行FLUSH TABLES ... FOR EXPORT暂停该表的创建CFG桩复合地基元数据文件:

    mysql> USE test;
    mysql> FLUSH TABLES t FOR EXPORT;
    

    元数据(.cfg)中创建InnoDB数据目录

    笔记

    这个FLUSH TABLES ... FOR EXPORT声明确保命名表的变化已被刷新到磁盘,一个二进制表复制可以在实例运行。什么时候FLUSH TABLES ... FOR EXPORT运行,InnoDB产生一个.cfg在同一个数据库文件的目录表。这个CFG桩复合地基文件包含用于架构验证导入表空间元数据文件时。

  5. 复制.ibd文件和CFG桩复合地基元数据文件从源到目标实例的实例。例如:

    shell> scp /path/to/datadir/test/t.{ibd,cfg} destination-server:/path/to/datadir/test
    
    笔记

    这个.ibd文件和CFG桩复合地基文件必须复制之前释放共享锁,为下一步的描述。

  6. 在实例的源码,使用UNLOCK TABLES释放获取的锁FLUSH TABLES ... FOR EXPORT

    MySQL的>USE test;MySQL的>UNLOCK TABLES;
  7. 在目标实例,导入的表空间:

    mysql> USE test;
    mysql> ALTER TABLE t IMPORT TABLESPACE;
    
    笔记

    这个ALTER TABLE ... IMPORT TABLESPACE功能不执行导入数据的外键约束。如果有与表的外键约束,所有的表应该出口在同一时间点(逻辑)。在这种情况下,你会停止更新表,提交所有交易,获取表上的共享锁,然后执行导出操作。

例2:复制InnoDB表分区到另一个实例

本程序演示如何复制分区InnoDB从运行MySQL服务器实例到另一个运行实例表。有轻微的调整,同样的步骤可以用来执行完全恢复分区InnoDB在同一实例表

  1. 在实例的源码,创建分区表如果不存在。在下面的例子中,三个分区表(P0,P1,P2)创建:

    mysql> USE test;
    mysql> CREATE TABLE t1 (i int) ENGINE = InnoDB PARTITION BY KEY (i) PARTITIONS 3;
    

    /datadir/test目录中,有一个单独的表空间(鸡传染性法氏囊病)每三个分区的文件

    mysql> \! ls /path/to/datadir/test/
    t1#P#p0.ibd  t1#P#p1.ibd  t1#P#p2.ibd
    
  2. 在目标实例,创建相同的分区表:

    mysql> USE test;
    mysql> CREATE TABLE t1 (i int) ENGINE = InnoDB PARTITION BY KEY (i) PARTITIONS 3;
    

    /datadir/test目录中,有一个单独的表空间(鸡传染性法氏囊病)每三个分区的文件

    mysql> \! ls /path/to/datadir/test/
    t1#P#p0.ibd  t1#P#p1.ibd  t1#P#p2.ibd
    
  3. 在目标实例,抛弃对分区表的表空间。(在表空间可以进口的目标实例,表空间是连接到接收表必须丢弃。)

    mysql> ALTER TABLE t1 DISCARD TABLESPACE;
    

    .ibd文件,弥补了分区表的表空间被丢弃的/datadir测试目录

  4. 在实例的源码,运行FLUSH TABLES ... FOR EXPORTto the the table和创造partitioned静默CFG桩复合地基元数据文件:

    mysql> USE test;
    mysql> FLUSH TABLES t1 FOR EXPORT;
    

    元数据(.cfg)文件,每一个表空间(鸡传染性法氏囊病)文件,创建于/datadir/test在源实例目录:

    MySQL的>\! ls /path/to/datadir/test/# p0.ibd T1 T1 # P P P # # # p1.ibd T1 T1 # p0.cfg # p2.ibdt1 # P P P T1的# # p1.cfg # # p2.cfg
    笔记

    FLUSH TABLES ... FOR EXPORT声明确保命名表的变化已被刷新到磁盘,二进制表复制可以在实例运行。什么时候FLUSH TABLES ... FOR EXPORT运行,InnoDB产生一个.cfg元数据文件表的表空间文件在同一数据库目录表。这个CFG桩复合地基文件包含元数据用于架构验证当导入表空间文件。FLUSH TABLES ... FOR EXPORT只能运行在桌子上,不是个人的表分区。

  5. 复制.ibdCFG桩复合地基从源实例的数据库目录到目标实例的数据库目录下的文件。例如:

    shell>scp /path/to/datadir/test/t1*.{ibd,cfg} destination-server:/path/to/datadir/test
    
    笔记

    这个.ibdCFG桩复合地基文件必须复制之前释放共享锁,为下一步的描述。

  6. 在实例的源码,使用UNLOCK TABLES释放获取的锁FLUSH TABLES ... FOR EXPORT

    MySQL的>USE test;MySQL的>UNLOCK TABLES;
  7. 在目标实例,导入表空间的分区表:

    mysql> USE test;
    mysql> ALTER TABLE t1 IMPORT TABLESPACE;
    
例三:InnoDB表分区复制到另一个实例

本程序演示如何复制InnoDB表分区从运行MySQL服务器实例到另一个运行实例。有轻微的调整,同样的步骤可以用来执行恢复InnoDB在同一实例中的分区表。在下面的例子中,一个分区表有四个分区(P0,P1,P2,P3)在源实例的创建。两分区(P2和P3)复制到目标实例。

  1. 在实例的源码,创建分区表如果不存在。在下面的例子中,四个分区表(P0,P1,P2,P3)创建:

    mysql> USE test;
    mysql> CREATE TABLE t1 (i int) ENGINE = InnoDB PARTITION BY KEY (i) PARTITIONS 4;
    

    /datadir/test目录中,有一个单独的表空间(鸡传染性法氏囊病- Fil for each of the Four Pacts .

    mysql> \! ls /path/to/datadir/test/
    t1#P#p0.ibd  t1#P#p1.ibd  t1#P#p2.ibd t1#P#p3.ibd
    
  2. 在目标实例,创建相同的分区表:

    mysql> USE test;
    mysql> CREATE TABLE t1 (i int) ENGINE = InnoDB PARTITION BY KEY (i) PARTITIONS 4;
    

    /datadir/test目录中,有一个单独的表空间(鸡传染性法氏囊病- Fil for each of the Four Pacts .

    mysql> \! ls /path/to/datadir/test/
    t1#P#p0.ibd  t1#P#p1.ibd  t1#P#p2.ibd t1#P#p3.ibd
    
  3. 在目标实例,将表空间的分区,您计划从源实例导入。(在表空间的分区可以进口的目标实例,是连接到接收表相应的分区必须被丢弃。)

    mysql> ALTER TABLE t1 DISCARD PARTITION p2, p3 TABLESPACE;
    

    这个.ibd对于两丢弃分区文件被删除的/datadir测试在目标实例目录,将下列文件:

    MySQL的>\! ls /path/to/datadir/test/# p0.ibd T1 T1 # P P # p1.ibd #
    笔记

    什么时候ALTER TABLE ... DISCARD PARTITION ... TABLESPACE运行在subpartitioned分区和子分区表,表名是允许的。当一个分区,分区名称指定,包括在操作的子分区。

  4. 在实例的源码,运行FLUSH TABLES ... FOR EXPORTto the the table和创造partitioned静默CFG桩复合地基Metadat-files。

    mysql> USE test;
    mysql> FLUSH TABLES t1 FOR EXPORT;
    

    元数据文件(.cfg文件)创建于/datadir测试在源实例目录。有一个CFG桩复合地基每个表空间文件(.ibd文件)

    MySQL的>\! ls /path/to/datadir/test/T1 # P # p0.ibd T1 # P # p1.ibd T1 # P # p2.ibd T1 # P # P3。ibdt1 # P # p0.cfg T1 # P # p1.cfg T1 # P # p2.cfg T1 # P # p3.cfg
    笔记

    FLUSH TABLES ... FOR EXPORT声明确保命名表的变化已被刷新到磁盘,二进制表复制可以在实例运行。什么时候FLUSH TABLES ... FOR EXPORT运行,InnoDB产生一个.cfg元数据文件表的表空间文件在同一数据库目录表。这个CFG桩复合地基文件包含元数据用于架构验证当导入表空间文件。FLUSH TABLES ... FOR EXPORT只能运行在桌子上,不是个人的表分区。

  5. 复制.ibdCFG桩复合地基从源实例的数据库目录到目标实例的数据库目录下的文件。在这个例子中,只有.ibdCFG桩复合地基2文件的分区(P2)和分区3(P3)复制到data在目标实例目录。分区0(P0)和分区1(P1)留在源码实例。

    内核>scp t1#P#p2.ibd  t1#P#p2.cfg t1#P#p3.ibd t1#P#p3.cfg destination-server:/path/to/datadir/test
    笔记

    这个.ibd文件和CFG桩复合地基文件必须复制之前释放共享锁,为下一步的描述。

  6. 在实例的源码,使用UNLOCK TABLES释放获取的锁FLUSH TABLES ... FOR EXPORT

    MySQL的>USE test;MySQL的>UNLOCK TABLES;
  7. 关于目的地,进出口部分(P2和P3):

    mysql> USE test;
    mysql> ALTER TABLE t1 IMPORT PARTITION p2, p3 TABLESPACE;
    
    笔记

    什么时候ALTER TABLE ... IMPORT PARTITION ... TABLESPACE运行在subpartitioned分区和子分区表,表名是允许的。当一个分区,分区名称指定,包括在操作的子分区。

15.7.6.2传输表空间内

以下信息介绍内部和误差对于普通的可移动表空间可以复制的程序日志消息InnoDB

什么时候ALTER TABLE ... DISCARD TABLESPACE是运行在目标实例:

  • 表锁定在X模式

  • 独立的表空间(tablespace)is the from the table。

什么时候FLUSH TABLES ... FOR EXPORT上运行的实例源码:

  • 桌子被冲洗出口被锁在共享模式。

  • 清除线程停止协调员

  • 脏页都同步到磁盘

  • 表的元数据写入二进制.cfg文件

预期的错误日志消息进行此操作:

2013-09-24T13:10:19.903526Z 2 [Note] InnoDB: Sync to disk of '"test"."t"' started.
2013-09-24T13:10:19.903586Z 2 [Note] InnoDB: Stopping purge
2013-09-24T13:10:19.903725Z 2 [Note] InnoDB: Writing table metadata to './test/t.cfg'
2013-09-24T13:10:19.904014Z 2 [Note] InnoDB: Table '"test"."t"' flushed to disk
 

什么时候UNLOCK TABLES上运行的实例源码:

  • 二CFG文件被删除

  • 共享锁在表或表进口释放和净化协调线程启动。

预期的错误日志消息进行此操作:

2013-09-24T13:10:21.181104Z 2 [Note] InnoDB: Deleting the meta-data file './test/t.cfg'
2013-09-24T13:10:21.181180Z 2 [Note] InnoDB: Resuming purge

什么时候ALTER TABLE ... IMPORT TABLESPACE是运行在目标实例,导入算法为每个表空间被进口执行下列操作:

  • 每个表空间的页查腐败。

  • 空间ID和日志序列号(LSN)在每一页的更新

  • 标志验证和LSN更新的标题页。

  • Btree页的更新

  • 页面状态设置为脏,写入磁盘。

预期的错误日志消息进行此操作:

2013-07-18 15:15:01 34960 [Note] InnoDB: Importing tablespace for table 'test/t' that was exported from host 'ubuntu'
2013-07-18 15:15:01 34960 [Note] InnoDB: Phase I - Update all pages
2013-07-18 15:15:01 34960 [Note] InnoDB: Sync to disk
2013-07-18 15:15:01 34960 [Note] InnoDB: Sync to disk - done!
2013-07-18 15:15:01 34960 [Note] InnoDB: Phase III - Flush changes to disk
2013-07-18 15:15:01 34960 [Note] InnoDB: Phase IV - Flush complete
笔记

你也可能会收到一个警告,一个表空间(如果你丢弃丢弃目标表的表空间)和消息指出,统计无法计算由于缺少.ibd文件:

2013-07-18 15:14:38 34960 [警告] InnoDB:表“测试”,“T”表空间设置为discarded.2013-07-18 15:14:38 7f34d9a37700 InnoDB:无法计算表的“测试”的统计,“T”因为IBD文件丢失。的帮助,请参阅tohttp://dev.mysql.com/doc/refman/8.0/en/innodb-troubleshooting.html

15.7.7移动表空间文件,而服务器离线

这个innodb_directories选项,它定义了扫描表空间文件的启动目录,支持移动或恢复表空间文件到一个新的位置,当服务器脱机。在启动过程中,发现表空间文件代替那些引用的数据字典和数据字典更新参考搬迁文件。如果重复的表空间文件被扫描发现,启动失败,错误显示多个文件,发现同样的表空间ID。

定义的目录innodb_data_home_dirinnodb_undo_directory,和datadir配置选项会自动添加到innodb_directories参数值。这些目录进行扫描,在启动时不管innodb_directories选项指定明确的。这些目录允许移动系统表空间文件的隐式添加,数据目录,或撤销表空间文件没有配置innodb_directories设置然而,设置时必须更新目录的变化。例如,将数据目录后,您必须更新--datadir设置在重新启动服务器。

这个innodb_directories选项可以指定在启动命令或MySQL选项文件。行情是在参数值用否则分号(;)是由一些命令解释器解释为一个特殊的字符。(UNIX shell作为命令终止符,例如。)

启动命令:

mysqld --innodb-directories="directory_path_1;directory_path_2"

MySQL选项文件:

[mysqld]
innodb_directories="directory_path_1;directory_path_2"

下列程序适用于移动个人文件表一般的表空间文件夹,系统片文件夹,撤销表空间文件或数据目录。在移动文件或目录,审查使用笔记,跟随。

  1. 停止服务器

  2. 将表空间的文件或目录。

  3. 使新的目录称为InnoDB

  4. 重新启动服务器

使用说明

  • 通配符表达式不能用于innodb_directories参数的值

  • 这个innodb_directories扫描指定的目录的子目录也穿越。复制目录和子目录被丢弃从目录列表进行扫描。

  • 这个innodb_directories选项仅支持移动InnoDB表空间文件。运动属于一个比其他存储引擎文件InnoDB不支持。这个限制也适用于移动整个数据目录。

  • 这个innodb_directories选项支持重命名的表空间文件时将文件移动到一个扫描目录。它还支持移动表空间文件到其他支持的操作系统。

  • 当移动表空间文件到一个不同的操作系统,确保表空间文件名不包含禁止的字符或字符与目标系统上的一个特殊的意义。

  • 如果移动表空间文件到一个不同的操作系统,介绍了跨平台的复制,它是数据库管理员的责任确保DDL语句包含特定于平台的目录的复制。语句允许指定目录包括CREATE TABLE ... DATA DIRECTORYCREATE TABLESPACE ... ADD DATAFILE

  • 该目录的文件表和一般的表空间创建的文件的绝对路径或在数据目录以外的位置应该被添加到innodb_directories参数的值。否则,InnoDB是不是能够找到这些文件的恢复。CREATE TABLE ... DATA DIRECTORYCREATE TABLESPACE ... ADD DATAFILE允许的绝对路径表空间文件的创建。CREATE TABLESPACE ... ADD DATAFILE也允许表空间文件目录,是相对于数据目录。查看表空间文件位置,查询INFORMATION_SCHEMA.FILES

    MySQL的>SELECT TABLESPACE_NAME, FILE_NAME FROM INFORMATION_SCHEMA.FILES \G
  • CREATE TABLESPACE ... ADD DATAFILE要求目标目录存在并且是众所周知的InnoDB。已知的目录包括隐式和显式定义的innodb_directories选项

15.7.8 undo表空间配置

默认情况下,UNDO日志居住在两基于还原表空间。I/O模式的UNDO日志作出撤销表空间的很好的候选人SSD存储因为UNDO日志可以在长期交易变得很大,有UNDO日志在多个撤销表空间,减少任何一个undo表空间的最大大小。

配置数量的撤销表空间

这个innodb_undo_tablespaces配置选项定义的数量的撤销表空间使用InnoDB。默认的最小值为2。您可以配置innodb_undo_tablespaces在启动或在服务器正在运行。

笔记

innodb_undo_tablespaces是过时的、将在未来的版本中删除。

增加innodb_undo_tablespaces设置创建指定数量的撤销表空间,并将其添加到列表主动撤销表空间。降低innodb_undo_tablespaces设置删除撤销表空间从主动撤销表空间的表。然而,撤销表空间,从活动列表中删除仍然有效,直到他们不再使用现有的交易。撤销表空间是消极而不是积极的号码删除,撤销表空间可以很容易地再次增加。

个人或个人部分在这些表空间不能丢。然而,UNDO日志存储在undo表空间可以被截断。有关更多信息,参见第15.7.9,“Truncating Undo Tablespaces”

配置位置的undo表空间

undo表空间文件中定义的位置创建innodb_undo_directory配置选项。此选项通常用于将撤消对不同存储设备的日志。如果没有指定路径,撤销表空间中创建MySQL数据目录,定义为datadir。这个innodb_undo_directory期权是非动态。需要重新启动服务器配置。

undo表空间文件名的形式undo_NNN,在那里NNN是一个撤销空间数1 127之间。撤销空间数和撤销空间ID相关的如下:

  • undo space number = 0xFFFFFFF0 - undo space ID

  • undo space ID = 0xFFFFFFF0 - undo space number

一个undo表空间文件的默认大小是10mib。

配置回滚段的数目

这个innodb_rollback_segments配置选项定义数回滚段分配给每一个undo表空间。这个选项可以配置在启动或在服务器正在运行。

这个innodb_rollback_segments配置选项也定义了分配到回滚段数临时表空间

设置为默认innodb_rollback_segments为128,也是最大的价值。每个回滚段可以支持最大为数据修改事务。

15.7.9截断撤销表空间

截断基于还原表空间,MySQL实例的配置必须以最小的两个undo表空间,它是默认和MySQL 8中的最小值。最小的两个撤销表空间,确保一个undo表空间仍然有效,而其他脱机被截断。数撤销表空间的定义是innodb_undo_tablespaces选项使用此语句检查的价值innodb_undo_tablespaces

MySQL的>SELECT @@innodb_undo_tablespaces;Taballacco,Annod,Annod Change,Annod Change,Annod Change,Annod Change,Annod Change,Annod Change,Annod Change,Annod Change,Annod Can,Annodb Conseiller,Taballages Industry
笔记

innodb_undo_tablespaces是过时的、将在未来的版本中删除。

有关配置undo表空间的信息,参见第15.7.8”配置,撤销表空间”

使截断撤销表空间

截断的撤销表空间,使innodb_undo_log_truncate

MySQL的>SET GLOBAL innodb_undo_log_truncate=ON;

什么时候innodb_undo_log_truncate启用,撤销表空间文件大小限制,超过规定的innodb_max_undo_log_size用于截断innodb_max_undo_log_size是一个动态的全局变量有1024 MIB的默认值(1073741824字节)。

MySQL的>SELECT @@innodb_max_undo_log_size;第二次世界大战期间发生的事件

您可以配置innodb_max_undo_log_size使用设置全局声明:

mysql> SET GLOBAL innodb_max_undo_log_size=2147483648;

什么时候innodb_undo_log_truncate启用:

  1. 撤销表空间,超过innodb_max_undo_log_size设置标记为截断。选择一个undo表空间截断是以循环的方式进行避免截断的undo表空间的每一次。

  2. 回滚段居住在选定的undo表空间是不活跃的,它们没有被分配到新的交易。现有的交易,目前正在使用的回滚段被允许完成。

  3. 这个净化系统释放那些不再需要的回滚段。

  4. 在undo表空间是释放所有的回滚段,截断操作运行和undo表空间是截断其初始大小。一个undo表空间文件取决于初始大小innodb_page_size的价值。for the default 16KInnoDB页面大小,初始的undo表空间的文件大小是10mib。4K,8K,32K、64K的页面大小,初始undo表空间文件大小7mib,8mib,20mib,和40mib,分别。

    一个截断术后撤销表空间的大小可能大于由于直接使用下面的操作完成的初始大小。

    这个innodb_undo_directory选项定义了undo表空间文件的位置。默认值代表所在的目录InnoDB默认情况下创建日志文件。

    MySQL的>SELECT @@innodb_undo_directory;见到| @ @ InnoDB _ Undo _ |见到|目录。|见到
  5. 回滚段可以分配给新的交易活动。

加快截断的undo表空间文件

UNDO表空间不能被截断,直到它的回滚段被释放。通常情况下,吹扫系统释放回滚段每128次清洗时。为了加快截断的撤销表空间,使用innodb_purge_rseg_truncate_frequency选择临时增加的频率,吹扫系统释放回滚段。默认的innodb_purge_rseg_truncate_frequency设置为128,这也是最大的价值。

MySQL的>SELECT @@innodb_purge_rseg_truncate_frequency;---------------------------------------- | @ @ InnoDB _ _ truncate _频电磁_ rseg | ---------------------------------------- | | ---------------------------------------- 128

增加其清除线程释放回滚段的频率,降低价值innodb_purge_rseg_truncate_frequency。。。。。。。例如:

MySQL的>SET GLOBAL innodb_purge_rseg_truncate_frequency=32;

性能影响截断undo表空间文件在线

而一个undo表空间被截断,在暂时停用的回滚段表空间。剩下的主动回滚段在其他撤销表空间承担整个系统的负载的责任,这可能会导致轻微的性能下降。性能下降的程度取决于很多因素,包括:

  • number of Undo表空间

  • 一些UNDO日志

  • undo表空间的大小

  • 的I / O susbsystem速度

  • 现有的长时间运行的事务

  • 系统负荷

15.7.10 Innodb General Tabessoes

一般的表空间是一个共享InnoDB表空间创建CREATE TABLESPACE语法。一般的表空间的功能和特点是本节中的以下主题下的描述:

一般表空间的能力

一般的空间特征提供以下功能:

  • 类似的系统表空间,表空间是共享表空间一般可以存储数据的多个表。

  • 一般的表空间有一个潜在的内存优势每个表的表空间文件。表空间元数据服务器保存在内存中的表空间的寿命。更少的一般表空间多个表的表空间元数据的消耗比在单独的文件中的每个表的表空间表相同数量的内存少。

  • 一般表空间数据文件可以放在一个目录相关或独立的MySQL数据目录,它为你提供了许多数据文件和存储管理能力每个表的表空间文件。与每个表的表空间文件,将数据文件的MySQL数据目录之外的能力允许你管理关键表分别表现,设定RAID或DRBD的特定的表,或将表特定的磁盘,例如。

  • 一般表空间支持的羚羊和梭鱼的文件格式,因此支持所有的表行的格式和相关特征。对文件格式的支持,一般表空间没有依赖innodb_file_formatinnodb_file_per_table设置这些变量,也不会有任何影响的一般表空间。

  • 这个TABLESPACE选项可用于CREATE TABLE在一般的表空间中创建表,每个表的表空间文件,或在SYSTEM表空间。

  • 这个TABLESPACE选项可用于ALTER TABLE从一般的表空间,表,每个表的表空间文件,和系统表空间。以前,它是不可能移动一个表每表表空间文件系统表空间。与一般的表空间的功能,现在你可以这样做。

创建一个表空间

一般表空间的创建使用CREATE TABLESPACE语法

CREATE TABLESPACE tablespace_name    ADD DATAFILE 'file_name'    [FILE_BLOCK_SIZE = value]        [ENGINE [=] engine_name]

一般的表空间可以在MySQL数据目录或目录外的MySQL数据目录中创建。避免与隐式创建的每个表的表空间文件冲突,MySQL数据目录下创建子目录中的一个通用的表空间是不支持的。另外,当创建一个表空间的MySQL数据目录外,目录必须存在并且必须知道InnoDB创建表空间之前。让一个未知的目录称为InnoDB,目录添加到innodb_directories参数的值innodb_directories是一个只读的启动选项。需要重新启动服务器配置。

实例:

创建MySQL数据目录一般表空间:

mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB;

在创建目录之外的MySQL数据目录一般表空间:

mysql> CREATE TABLESPACE `ts1` ADD DATAFILE '/my/tablespace/directory/ts1.ibd' Engine=InnoDB;

你可以指定一个路径是相对于MySQL数据目录只要表目录不是MySQL数据目录下。在这个例子中,该my_tablespace目录是在MySQL数据目录相同的水平:

MySQL的>CREATE TABLESPACE `ts1` ADD DATAFILE '../my_tablespace/ts1.ibd' Engine=InnoDB;
笔记

这个ENGINE = InnoDB条款必须定义的一部分CREATE TABLESPACE声明或InnoDB必须定义为默认存储引擎(default_storage_engine=InnoDB

添加表,一般的表空间

在创建一个InnoDBtablespace将军,您可以使用CREATE TABLE tbl_name ... TABLESPACE [=] tablespace_nameALTER TABLE tbl_name TABLESPACE [=] tablespace_name添加表的表空间,如下面的示例所示:

CREATE TABLE

MySQL的>CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=COMPACT;

ALTER TABLE

MySQL的>ALTER TABLE t2 TABLESPACE ts1;

详细的语法信息,看CREATE TABLEALTER TABLE

一般表行格式的支持

一般表空间支持所有格式(表格行REDUNDANT粉盒DYNAMIC压缩的)但在压缩和非压缩表不能因不同的物理页面大小相同的表空间并存。

对于含有压缩表的表空间(一般ROW_FORMAT=COMPRESSED),file_block_size必须指定,并FILE_BLOCK_SIZE值必须是一个有效的压缩页面的大小的关系innodb_page_size价值。另外,该压缩表的物理页面大小(key_block_size)必须等于FILE_BLOCK_SIZE/1024。例如,如果innodb_page_size=16KFILE_BLOCK_SIZE=8K,的KEY_BLOCK_SIZE该表必须8

下表显示了允许innodb_page_sizefile_block_size,和KEY_BLOCK_SIZE组合file_block_size的值也可以被指定的字节数。确定一个有效的KEY_BLOCK_SIZE对于一个给定的值file_block_size,分FILE_BLOCK_SIZE值1024。表压缩是不为32K和64K的支持InnoDB页面大小。为更多的信息关于KEY_BLOCK_SIZE,看到CREATE TABLE,和第15.9.1.2,“创建压缩表”

表15.7允许的页面大小,file_block_size,和key_block_size组合压缩表

InnoDB Page Size(innodb_page_size)允许file_block_size价值允许key_block_size价值
64K(65536)64k压缩不支持
32K(32768)32k压缩不支持
16k(16384)16k如果N /innodb_page_size等于file_block_sizeTabesace Can Notnot Contain。
16k(8192)8k
16k(4096)4k
16k(2048)2k
16k(1024)1k
8K(8192)8k如果N /innodb_page_size等于file_block_sizeTabesace Can Notnot Contain。
8K(4096)4k
8K(2048)2k
8K(1024)1k
4k(4096)4k如果N /innodb_page_size等于file_block_sizeTabesace Can Notnot Contain。
4k(2048)2k
4k(1024)1k

此示例演示如何创建一个通用表和添加压缩表。这个例子假设默认innodb_page_size大学16kfile_block_size8192要求压缩表有KEY_BLOCK_SIZE8

MySQL的>CREATE TABLESPACE `ts2` ADD DATAFILE 'ts2.ibd' FILE_BLOCK_SIZE = 8192 Engine=InnoDB;MySQL的>CREATE TABLE t4 (c1 INT PRIMARY KEY) TABLESPACE ts2 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;

如果你不指定FILE_BLOCK_SIZE创建一个表空间时,file_block_size默认值为innodb_page_size。什么时候file_block_size等于innodb_page_size,表空间只能包含表与未压缩格式(行粉盒REDUNDANT,和动态行格式)

移动非分区表之间使用ALTER TABLE表空间

你可以使用ALTER TABLE表空间在partitioned option to move -不InnoDB表到现有的表空间,表空间的每一个新的文件,或者对系统表空间。

将非分区表每表表空间文件或从系统表空间一般的表,指定表空间的名字一般。一般的表空间必须存在。看到CREATE TABLESPACE更多信息

ALTER TABLE tbl_name TABLESPACE [=]tablespace_name

将非分区表从表空间或一般每桌表空间文件系统表空间,指定innodb_systemas the表空间的名称。

ALTER TABLE tbl_name ... TABLESPACE [=] innodb_system

将非分区表从系统表空间或表空间文件一般指定表空间,innodb_file_per_tableas the表空间的名称。

ALTER TABLE tbl_name ... TABLESPACE [=] innodb_file_per_table

ALTER TABLE ... TABLESPACE行动总是引起全表重建,即使表空间属性没有改变,从以前的价值。

ALTER TABLE ... TABLESPACE语法不支持移动台从一个临时表空间的一个持久的表空间。

这个DATA DIRECTORY条款允许CREATE TABLE ... TABLESPACE=innodb_file_per_table但是并不支持使用结合TABLESPACE选项

一般表表分区支持

这个TABLESPACE选项可以用来指定表分区或子分区的一个人一般的表空间每个表的表空间,一个单独的文件,或者系统表空间。所有分区都必须属于相同的存储引擎。在以下的例子演示了使用。

mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB;
mysql> CREATE TABLESPACE `ts2` ADD DATAFILE 'ts2.ibd' Engine=InnoDB;

mysql> CREATE TABLE t1 (a INT, b INT) ENGINE = InnoDB
       PARTITION BY RANGE(a) SUBPARTITION BY KEY(b) (
        PARTITION p1 VALUES LESS THAN (100) TABLESPACE=`ts1`,
        PARTITION p2 VALUES LESS THAN (1000) TABLESPACE=`ts2`,
        PARTITION p3 VALUES LESS THAN (10000) TABLESPACE `innodb_file_per_table`,
        PARTITION p4 VALUES LESS THAN (100000) TABLESPACE `innodb_system`);

mysql> CREATE TABLE t2 (a INT, b INT) ENGINE = InnoDB
       PARTITION BY RANGE(a) SUBPARTITION BY KEY(b) (
        PARTITION p1 VALUES LESS THAN (100) TABLESPACE=`ts1`
          (SUBPARTITION sp1,
           SUBPARTITION sp2),
        PARTITION p2 VALUES LESS THAN (1000)
          (SUBPARTITION sp3,
           SUBPARTITION sp4 TABLESPACE=`ts2`),
        PARTITION p3 VALUES LESS THAN (10000)
          (SUBPARTITION sp5 TABLESPACE `innodb_system`,
           SUBPARTITION sp6 TABLESPACE `innodb_file_per_table`));

这个TABLESPACE选项也支持ALTER TABLE

MySQL的>ALTER TABLE t1 ADD PARTITION (PARTITION p5 VALUES LESS THAN (1000000) TABLESPACE = `ts1`);
笔记

如果TABLESPACE = tablespace_name选择是没有定义的,ALTER TABLE ... ADD PARTITION运行添加分区表的默认表空间,它可以指定在表级中CREATE TABLEALTER TABLE

一个ALTER TABLE tbl_name TABLESPACE [=] tablespace_name手术on a分区表只修改表的默认表空间。它不动的表分区。然而,改变默认表空间后,手术,重建表,如ALTER TABLE操作使用ALGORITHM=COPY、移动分区到另一个表空间的默认表空间如果没有定义明确的使用TABLESPACE [=] tablespace_name条款.

确认分区放置在指定的表空间,你可以查询INFORMATION_SCHEMA.INNODB_TABLES

MySQL的>SELECT NAME, SPACE, SPACE_TYPE FROM INFORMATION_SCHEMA.INNODB_TABLESWHERE NAME LIKE '%t1%';----------------------- ------- ------------ |名字|空间| space_type | ----------------------- ------- ------------ |测试/ T1 # P # P1 # SP # p1sp0 | 57 |一般| |测试/ T1 # P # P2 # SP # p2sp0 | 58 |一般| |测试/ T1 # P # P3 # SP # p3sp0 | 59 |单| |测试/ T1 # P # P4 # SP # p4sp0 | 0 |系统| |测试/ T1 # P # P5 # SP # p5sp0 | 57 |一般| ----------------------- ------- ------------ MySQL >SELECT NAME, SPACE, SPACE_TYPE FROM INFORMATION_SCHEMA.INNODB_TABLESWHERE NAME LIKE '%t2%';--------------------- ------- ------------ |名字|空间| space_type | --------------------- ------- ------------ |测试/ T2 # P # P1 # SP # SP1 | 57 |一般| |测试/ T2 # P # P1 # SP # SP2 | 57 |一般| |测试/ T2 # P # P2 # SP # SP3 | 60 |单| |测试/ T2 # P # P2 # SP # SP4 | 58 |一般| |测试/ T2 # P # P3 # SP # SP5 | 0 |系统| |测试/ T2 # P # P3 # SP # SP6 | 61 |单| --------------------- ------- ------------

移动分区表之间的表空间使用ALTER TABLE

将表分区到不同的表空间,你必须把每个分区使用ALTER TABLE tbl_name REORGANIZE PARTITION声明

下面的示例演示如何将表分区到不同的表空间。INFORMATION_SCHEMA.INNODB_TABLESINFORMATION_SCHEMA.INNODB_TABLESPACES查询验证分区放置在预期的表空间。

笔记

如果TABLESPACE = tablespace_name选项中没有定义reorganize partition声明,InnoDB将分区表的默认表空间。在下面的例子中,表空间TS1,这是在表级定义的,是表的默认表空间t1。分区P3从系统表空间移动到表空间ts1因为没有表空间选项中指定的ALTER TABLE t1 REORGANIZE PARTITION表分区P3

手术重建表,如ALTER TABLE操作使用ALGORITHM=COPY移动分区,如果分区的默认表空间放在不同的表空间是没有明确定义的使用TABLESPACE [=] tablespace_name条款.

MySQL的>CREATE TABLESPACE ts1 ADD DATAFILE 'ts1.ibd';MySQL的>CREATE TABLESPACE ts2 ADD DATAFILE 'ts2.ibd';MySQL的>CREATE TABLE t1 ( a INT NOT NULL, PRIMARY KEY (a))ENGINE=InnoDB TABLESPACE ts1PARTITION BY RANGE (a) PARTITIONS 3 (PARTITION P1 VALUES LESS THAN (2),PARTITION P2 VALUES LESS THAN (4) TABLESPACE `innodb_file_per_table`,PARTITION P3 VALUES LESS THAN (6) TABLESPACE `innodb_system`);MySQL的>SELECT A.NAME as partition_name, A.SPACE_TYPE as space_type, B.NAME as space_nameFROM INFORMATION_SCHEMA.INNODB_TABLES ALEFT JOIN INFORMATION_SCHEMA.INNODB_TABLESPACES BON A.SPACE = B.SPACE WHERE A.NAME LIKE '%t1%' ORDER BY A.NAME;|分区---------------- ----------------- Enbrel -------——_ name |太空_型|太空_ name | ----------------- Enbrel ------- |;T1——试验/ # P # P1 |将军| TS1 | |测试/ # P2 P T1 # |单|测试/ # # P2 P T1 T1 | |测试/ # P3 P # |系统|空| MySQL ----------------- Enbrel -------——>;ALTER TABLE t1 REORGANIZE PARTITION P1INTO (PARTITION P1 VALUES LESS THAN (2) TABLESPACE = `ts2`);MySQL的>ALTER TABLE t1 REORGANIZE PARTITION P2INTO (PARTITION P2 VALUES LESS THAN (4) TABLESPACE = `ts2`);MySQL的>ALTER TABLE t1 REORGANIZE PARTITION P3INTO (PARTITION P3 VALUES LESS THAN (6));MySQL的>SELECT A.NAME AS partition_name, A.SPACE_TYPE AS space_type, B.NAME AS space_nameFROM INFORMATION_SCHEMA.INNODB_TABLES ALEFT JOIN INFORMATION_SCHEMA.INNODB_TABLESPACES BON A.SPACE = B.SPACE WHERE A.NAME LIKE '%t1%' ORDER BY A.NAME;|分区---------------- ----------------- Enbrel ------- ----------------- Enbrel ------- _ name |太空_型|太空_ name | ---------------- ----------------- Enbrel ------- ----------------- Enbrel ------- |测试/ P T1 # # P1 |将军| ts2 | |测试/ # P2 P T1 # |将军| ts2 | |测试/ P T1 # # P3 |将军| TS1 | ---------------- ----------------- Enbrel ------- ----------------- Enbrel -------

重命名一般表空间

重命名一个表空间是支持使用一般ALTER TABLESPACE ... RENAME TO语法

修改表空间重命名S2 S1;

这个CREATE TABLESPACE特权需要重命名一个一般的表空间。

RENAME TO操作是隐式执行autocommit模式,无论对autocommit设置

RENAME TO而不能进行手术LOCK TABLESFLUSH TABLES WITH READ LOCK实际上是为居住在表空间表。

独家元数据锁采取表内一般表而表重命名,防止并发DDL。支持并行DML。

烟草公司

这个DROP TABLESPACE语句用于删除InnoDB一般的表空间

所有表格必须退出之前,一个表空间DROP TABLESPACE运营如果空间不是空的,DROP TABLESPACE返回一个错误

一般InnoDB表空间是不会自动删除在表空间上表被删除。表空间必须删除显式使用DROP TABLESPACE tablespace_name

一般的表空间不属于任何特定的数据库。一DROP DATABASE操作可降,属于一个总的表表但不能下降的空间,即使DROP DATABASE操作滴所有属于表表。一般的表空间必须删除显式使用DROP TABLESPACE tablespace_name

类似的系统表空间,截断或删除表存储在表空间创建的自由空间一般在一般的表空间IBD数据文件这只能用于新InnoDB数据空间不释放回操作系统它是当一个文件删除表空间中DROP TABLE运营

这个例子演示了如何删除InnoDBTabesace将军Tabesace将军TS1是一个表创建。表之前必须删除删除表空间。

mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB;

mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts10 Engine=InnoDB;

mysql> DROP TABLE t1;

mysql> DROP TABLESPACE ts1;
笔记

tablespace_name是一个敏感的标识符在MySQL。

通用表空间的限制

  • 一个生成的或现有的表空间不能被改变到一个一般的表空间。

  • 临时表空间创建一般不支持。

  • 一般不支持临时表的表空间。

  • 类似的系统表空间,截断或删除表存储在表空间创建的自由空间一般在一般的表空间IBD数据文件这只能用于新InnoDB数据空间不回操作系统它是释放文件表表空间

    此外,表复制ALTER TABLE操作台位于共享表空间(一般的表空间或SYSTEM表空间)可以增加表空间使用的空间量。这样的操作需要在表格和索引数据的多少额外的空间。为表复制所需的额外空间ALTER TABLE操作不回操作系统是每个表的表空间文件发布。

  • ALTER TABLE ... DISCARD TABLESPACEALTER TABLE ...IMPORT TABLESPACE不属于一个总的表空间表支持。

更多信息见第13.1.19,“创建表的语法”

15.7.11 InnoDB表空间加密

InnoDB支持数据表存储在数据加密文件表表空间。此功能提供了在表空间的数据文件加密的身体休息。

表空间加密采用12级密钥体系结构,由一个主密钥和密钥空间。当一台是加密的,加密并存储在表空间的表空间的关键是头。当一个应用程序或认证的用户要访问加密的表空间的数据,InnoDB使用一个主密钥来解密密钥的表空间。的解密版本表密钥不会变化,但主加密密钥可以根据需要改变。这种行为被称为万能钥匙转动

表空间加密功能依赖于一个主密钥加密密匙的插件。

所有的MySQL版本提供keyring_file插件,它在文件服务器的本地主机存储密匙数据。

MySQL企业版提供这些额外的钥匙圈插件:

  • 这个keyring_encrypted_file插件,这在一个加密的服务器主机的本地文件存储密匙数据。

  • 这个keyring_okv插件,包括KMIP客户端(KMIP 1.1)采用KMIP兼容的产品作为一个密匙存储后端。支持KMIP兼容的产品包括集中式的密钥管理解决方案,如Oracle密钥库,金雅拓KeySecure,泰勒斯Vormetric的密钥管理服务器,并fornetix关键业务流程。

  • 这个keyring_aws插件,这与亚马逊网络服务(AWS公里通信密钥管理服务)作为后端的密钥生成和使用密钥存储本地文件。

警告

这个keyring_filekeyring_encrypted文件插件是不是合规解决方案。安全标准,如PCI,FIPS,和其他需要使用密钥管理系统的安全管理,保护关键的金库或硬件安全模块(HSM)加密密钥。

一个安全可靠的密钥管理解决方案,由其他插件的支持,是对安全和各种安全标准符合性的关键。当表空间加密功能使用集中式的密钥管理方案,该功能被称为MySQL企业透明数据加密(TDE)

表空间加密支持高级加密标准(AES)的基于块的加密算法。它采用电子密码本(ECB)分组加密模式的表空间加密和密码块链接(CBC)用于数据加密的块加密模式。

常见的表空间加密功能的问题,看“16节,“MySQL 8常见问题:InnoDB表空间加密”

无误片

  • 一个钥匙圈插件必须安装和配置。钥匙圈插件安装进行启动使用early-plugin-load选项早期加载确保插件可以初始化之前InnoDB存储引擎。因为钥匙插件安装和配置说明,见第6.5.4,“MySQL的钥匙”

    只有一个钥匙圈插件应该是一次启用。使多个钥匙圈插件不支持。

    重要

    一旦加密表在MySQL实例创建的密钥环插件加载创建加密表时要继续加载使用early-plugin-load选择,prior toInnoDB初始化。如果不这样做,在错误的结果在启动和InnoDB恢复

    验证一个钥匙圈的插件是活跃的,使用SHOW PLUGINS表或查询INFORMATION_SCHEMA.PLUGINS表。例如:

    MySQL的>SELECT PLUGIN_NAME, PLUGIN_STATUSFROM INFORMATION_SCHEMA.PLUGINSWHERE PLUGIN_NAME LIKE 'keyring%';-------------- --------------- | plugin_name | plugin_status | -------------- --------------- | keyring_file |主动| -------------- ---------------
  • 这个innodb_file_per_table备选案文1:InnoDB表空间加密只支持文件表表空间。或者,您可以指定TABLESPACE='innodb_file_per_table'当创建一个加密选项表或改变现有的表启用加密。

  • 使用前InnoDB表空间加密功能与生产数据,确保你已经采取了措施来防止主密钥丢失。如果主密钥丢失,加密存储在表空间文件的数据是不可恢复的。如果你使用的是keyring_filekeyring_encrypted_file插件,建议您创建的密钥数据备份文件后立即创建第一个加密表前和万能钥匙旋转后。对于keyring_file插件,到此数据文件的位置是确定的keyring_file_data配置选项。for thekeyring_encrypted_file插件,到此数据文件的位置是确定的keyring_encrypted_file_data配置选项。如果你使用的是keyring_okvkeyring_aws插件,确保你完成必要的配置。有关说明,见第6.5.4,“MySQL的钥匙”

启用和禁用InnoDB表空间加密

使一个新的加密InnoDB表,指定加密选择一个CREATE TABLE声明

MySQL的>CREATE TABLE t1 (c1 INT) ENCRYPTION='Y';

为了使现有的加密InnoDB表,指定加密选择一个ALTER TABLE声明

MySQL的>ALTER TABLE t1 ENCRYPTION='Y';

为禁用加密InnoDB表,集ENCRYPTION='N'使用ALTER TABLE

MySQL的>ALTER TABLE t1 ENCRYPTION='N';
笔记

计划时适当改变现有的表的ENCRYPTION选项ALTER TABLE ... ENCRYPTION重建表使用操作ALGORITHM=COPYALGORITHM=INPLACE不支持

重做日志数据加密

重做日志数据启用加密使用innodb_redo_log_encrypt配置选项。重做日志加密默认是禁用的。

为表空间的数据,重做日志数据加密时,重做日志数据写入磁盘,解密时重做日志数据从磁盘中读取。一旦重做日志数据读入内存,它是以未加密的形式。重做日志数据进行加密和解密使用tablepace加密密钥。

什么时候innodb_redo_log_encrypt启用加密,磁盘上的重做日志页仍然存在未加密的,和新的重做日志页写入磁盘加密。同样的,当innodb_redo_log_encrypt是残疾人,加密磁盘上的重做,现在登录页面保持加密,和新的重做日志页面写入到磁盘中的未加密的形式。

重做日志加密元数据,包括表空间加密密钥存储在第一个重做日志文件头(ib_logfile0)。如果这个文件被删除,重做日志加密被禁用。

一旦重做日志启用加密,正常启动无钥匙插件或没有加密密钥是不可能的,因为InnoDB必须能够扫描重做页面在启动过程中,这是不可能的如果重做日志页面加密。没有钥匙的插件或加密密钥,只有被迫启动没有重做日志(_ SRV _队不_ _我日志这是可能的。见第15.20.2,迫使InnoDB恢复”

UNDO日志数据加密

UNDO日志数据启用加密使用innodb_undo_log_encrypt配置选项。撤消日志加密适用于UNDO日志驻留在基于还原表空间。看到第15.7.8”配置,撤销表空间”。UNDO日志数据加密默认是禁用的。

为表空间的数据,UNDO日志数据加密时撤销日志数据写入磁盘,解密时撤销日志数据从磁盘中读取。一旦撤销日志数据读入内存,它是以未加密的形式。UNDO日志数据进行加密和解密使用tablepace加密密钥。

什么时候innodb_undo_log_encrypt启用加密撤消磁盘上存在日志页面保持未加密的,和新的UNDO日志页写入磁盘加密。同样的,当innodb_undo_log_encrypt是残疾人,加密撤消磁盘上存在日志页面保持加密,和新的UNDO日志页面写入到磁盘中的未加密的形式。

撤消日志加密元数据,包括表空间加密密钥存储在UNDO日志文件头(undoN.ibd,在那里Nis the空间ID)。

InnoDB表空间加密主密钥轮换

主密钥必须定期更换,每当你怀疑密钥可能已被破坏。

主密钥轮换是一个原子,实例级操作。每次主密钥是旋转的,在MySQL实例的所有表空间的密钥重新加密并保存回各自的表标题。作为一个原子操作,重新加密所有表空间必须成功的钥匙一旦开始旋转操作。如果主密钥旋转由服务器故障中断,InnoDB辊运行了服务器重启。有关更多信息,参见InnoDB表空间加密和恢复

旋转的主加密密钥只改变主加密密钥和加密密钥空间。它没有解密或重新加密相关的表空间。

旋转的主加密密钥需要ENCRYPTION_KEY_ADMINSUPER特权

转动主密钥、运行:

mysql> ALTER INSTANCE ROTATE INNODB MASTER KEY;

ALTER INSTANCE ROTATE INNODB MASTER KEY支持并行DML。然而,它不能同时运行着CREATE TABLE ... ENCRYPTEDALTER TABLE ... ENCRYPTED操作,并锁定以防止冲突产生于这些语句的并行执行。如果其中一个冲突语句正在运行,它必须完成之前,另一个可以进行。

InnoDB表空间加密和恢复

如果主密钥旋转过程中发生服务器故障,InnoDB继续在服务器操作重启。

到此插件必须装在存储引擎初始化,需要解密的表空间的数据页可从表标题前的信息InnoDB初始化和恢复活动访问表数据。(见无误片。)

什么时候InnoDB初始化和恢复开始,主密钥旋转操作的简历。由于服务器故障,一些表空间的钥匙可能已经在使用新的主密钥加密。InnoDB读取各个表空间集加密数据,如果数据表明使用旧的主加密密钥加密密钥的表空间,InnoDB从检索的钥匙圈旧密钥并用它来解密tablepace关键。InnoDB然后重新加密的表空间的关键使用新的主密钥重新加密密钥保存表回表标题。

出口的加密表

当加密的表是出口,InnoDB生成一个转移的关键这是用于加密的表空间的关键。加密密钥和传输表空间的密钥存储在一个tablespace_name.cfp文件这个文件连同加密的表空间文件要求执行导入操作。进口,InnoDB采用传递的密钥来解密该表空间中的关键tablespace_name.cfp文件相关的信息,看第15.7.6,“每表表空间文件复制到另一个实例”

InnoDB表空间加密和复制

识别表使用InnoDB表空间加密

ENCRYPTION选项指定一个CREATE TABLEALTER TABLE声明,这是记录在创建_选项INFORMATION_SCHEMA.TABLES。这个字段可以查询以确定在一个MySQL实例的加密表。

MySQL的>SELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLESWHERE CREATE_OPTIONS LIKE '%ENCRYPTION="Y"%';+--------------+------------+----------------+| TABLE_SCHEMA | TABLE_NAME | CREATE_OPTIONS |+--------------+------------+----------------+| test         | t1         | ENCRYPTION="Y" |+--------------+------------+----------------+

计算机应用软件

  • 如果服务器退出或正常运行时停止,建议使用相同的加密设置,之前配置重新启动服务器。

  • 第一主加密密钥时产生的第一个新的或现有的表是加密的。

  • 主密钥重新加密钥匙转动的表空间,但不改变表空间密钥本身。改变表空间的关键,必须禁用和重新启用表加密使用ALTER TABLE tbl_name ENCRYPTION,这是一个ALGORITHM=COPY这是rebuilds手术真的结束了。

  • 如果一个表创建的COMPRESSIONENCRYPTION选项,在表空间的数据进行压缩加密。

  • 如果一个钥匙圈数据文件(文件名的keyring_file_datakeyring_encrypted_file_data系统变量)是空的或缺少的,第一次执行ALTER INSTANCE ROTATE INNODB MASTER KEY创建一个主密钥

  • 卸载keyring_filekeyring_encrypted_file插件不删除现有的密匙数据文件。

  • 建议你不要把钥匙数据文件同目录下的表空间的数据文件。

  • 修改keyring_file_datakeyring_encrypted_file_data在运行时设置或重新启动服务器可以导致以前的加密表无法访问,导致数据丢失。

Innodb Indir外空Engoy吸附局限性

  • 高级加密标准(AES)是唯一支持的加密算法。InnoDB表空间加密使用电子密码本(ECB)分组加密模式的表空间加密和密码块链接(CBC)用于数据加密的块加密模式。

  • 改变ENCRYPTION一个表的属性是一个ALGORITHM=COPY运营ALGORITHM=INPLACE不支持

  • 表空间加密只支持存储在一个表文件表表空间。加密是不是存储在其他表空间的类型包括表支持禁忌将军,的系统表空间,UNDO日志表空间和临时表空间。

  • 你不能移动或复制加密表从文件表表空间的表空间类型不支持。

  • 默认情况下,表空间加密只适用于表空间的数据。重做日志和重做日志数据可能使用加密innodb_redo_log_encryptinnodb_undo_log_encrypt选项看到重做日志数据加密,和UNDO日志数据加密。二进制日志的数据是不加密的。

  • 不允许更改一个表,加密或先前加密的存储引擎。

15.8 InnoDB表和索引

本节涵盖的主题相关InnoDB表和索引

15.8.1 InnoDB表

本节涵盖的主题相关InnoDB

15.8.1.1 InnoDB表的创建

创建一个InnoDB表,使用CREATE TABLE声明

CREATE TABLE t1 (a INT, b CHAR (20), PRIMARY KEY (a)) ENGINE=InnoDB;

你不需要指定ENGINE=InnoDB条款如果InnoDB定义为默认存储引擎,它是默认的。检查默认存储引擎,发出以下声明:

mysql> SELECT @@default_storage_engine;
+--------------------------+
| @@default_storage_engine |
+--------------------------+
| InnoDB                   |
+--------------------------+

你仍然可以使用ENGINE=InnoDB如果你计划使用条款mysqldump或复制重播CREATE TABLE语句在服务器上的默认存储引擎不InnoDB

一个InnoDB表及其索引可以创建在系统片,在文件表表空间,或在一般的表空间。什么时候innodb_file_per_table启用,这是默认的,一个InnoDB表是一个单独的文件每表表空间隐式创建。相反,当innodb_file_per_table是一个残疾人,InnoDB表中的隐式创建InnoDB系统表空间。在一般的表空间中创建一个表,使用CREATE TABLE ... TABLESPACE语法。有关更多信息,参见第15.7.10”一般,InnoDB表空间”

当你创建表表空间文件表,MySQL创建一个鸡传染性法氏囊病MySQL数据目录下的数据库中的表空间文件的目录,默认情况下。一个表中创建InnoDBSYSTEM表空间是在一个现有的创建ibdata文件,它驻留在MySQL数据目录。在一般的表空间中创建表是在现有的普通表空间的创建IBD文件。一般表空间文件可以是内部或外部的MySQL数据目录中创建。有关更多信息,参见第15.7.10”一般,InnoDB表空间”

内部,InnoDB增加了对每个表的数据字典的条目。该项包括数据库名称。例如,如果表T1是建立在test数据库,数据库的数据字典条目名称测试/ T1”。这意味着你可以创建一个表的名称相同(t1)在不同的数据库和表名,不停在InnoDB

InnoDB表和列的格式

默认的行格式InnoDB表定义的innodb_default_row_format配置选项,其中有一个默认值动态Dynamic压缩的行格式允许你利用InnoDB如表压缩及高了长列值的页面存储功能。使用这些列的格式,innodb_file_per_table必须启用(默认)

SET GLOBAL innodb_file_per_table=1;CREATE TABLE t3 (a INT, b CHAR (20), PRIMARY KEY (a)) ROW_FORMAT=DYNAMIC;CREATE TABLE t4 (a INT, b CHAR (20), PRIMARY KEY (a)) ROW_FORMAT=COMPRESSED;

或者,您可以使用CREATE TABLE ... TABLESPACE语法来创建一个InnoDB在一般的表表。一般表空间支持所有的行格式。有关更多信息,参见第15.7.10”一般,InnoDB表空间”

CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=DYNAMIC;

CREATE TABLE ... TABLESPACE语法也可以用来创建InnoDB表一Dynamic行格式在系统表空间、表alongside with a粉盒Redundant行格式

CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE = innodb_system ROW_FORMAT=DYNAMIC;

为更多的信息关于InnoDB行格式,见15.10节,“InnoDB行存储和列格式”。如何确定一个行格式InnoDB表和物理特性InnoDB行格式,见第15.8.1.2,“物理行结构的InnoDB表”

InnoDB表的主键

总是定义primary key对于一个InnoDB表,指定一列或多列:

  • 最重要的是通过查询引用。

  • 没有留下空白

  • 永远不会有重复的值

  • 很少变化值一旦插入

例如,在一个表中包含的信息的人,你就不会创建一个主键(firstname, lastname)因为不止一个人可以有相同的名字,有些人有空白的姓氏,有时人改变他们的名字。有这么多的限制,往往没有使用主键列的一个明显的设置,所以你创建一个新的列一个数字ID作为全部或部分的主键。你可以声明一个自增量柱,升值填充自动插入行:

# The value of ID can act like a pointer between related items in different tables.
CREATE TABLE t5 (id INT AUTO_INCREMENT, b CHAR (20), PRIMARY KEY (id));

# The primary key can consist of more than one column. Any autoinc column must come first.
CREATE TABLE t6 (id INT AUTO_INCREMENT, a INT, b CHAR (20), PRIMARY KEY (id,a));

虽然表正常工作没有定义一个主键,主键是涉及许多方面的性能,是任何大的或经常使用的表的一个关键设计方面。建议您总是指定的主键CREATE TABLE声明。如果你创建的表格,数据加载,然后运行ALTER TABLE添加一个主键后,操作比定义主键创建表时要慢的多。

查看InnoDB表属性

要查看一个性质InnoDB表,问题SHOW TABLE STATUS声明:

MySQL的>SHOW TABLE STATUS FROM test LIKE 't%' \G;*************************** 1。行***************************名称:T1发动机:InnoDB版本:十row_format:紧凑的行数:0:0 avg_row_length data_length:16384max_data_length:0:0 0 index_length data_free:auto_increment:空create_time:2015-03-16 15:13:31 update_time:空check_time:空整理:utf8mb4_0900_ai_ci校验:空create_options:评论:

有关SHOW TABLE STATUS输出,看第13.7.6.36,“显示表状态语法”

InnoDB表格属性也可以查询使用InnoDB信息架构的系统表:

mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME='test/t1' \G
*************************** 1. row ***************************
     TABLE_ID: 45
         NAME: test/t1
         FLAG: 1
       N_COLS: 5
        SPACE: 35
   ROW_FORMAT: Compact
ZIP_PAGE_SIZE: 0
   SPACE_TYPE: Single

有关更多信息,参见第15.14.3,“InnoDB information_schema架构对象表”

15.8.1.2 InnoDB表的物理行结构

一个物理行结构InnoDB表取决于行的格式指定在创建表时。如果未指定列的格式,默认行格式的使用。默认的行格式InnoDB表定义的innodb_default_row_format配置选项,其中有一个默认值动态

以下各节描述的特征InnoDB行格式

为更多的信息关于InnoDB行格式,见15.10节,“InnoDB行存储和列格式”

确定一个InnoDB表的行格式

确定一个行格式InnoDB表格,你可以使用SHOW TABLE STATUS。。。。。。。例如:

MySQL的>SHOW TABLE STATUS IN test1\G*************************** 1。行***************************名称:T1发动机:InnoDB版本:10 row_format:动态的行:0 avg_row_length:0 data_length:16384max_data_length:0 index_length:16384:0:1 data_free auto_increment create_time:2016-09-14 16:29:38 update_time:空check_time:空整理:utf8mb4_0900_ai_ci校验:空create_options:评论:

你也可以决定一个行格式InnoDB表的查询INFORMATION_SCHEMA.INNODB_TABLES

MySQL的>SELECT NAME, ROW_FORMAT FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME='test1/t1';---------- ------------ |名字| row_format | ---------- ------------ | test1/T1 |动态| ---------- ------------
多余的行格式的特点

这个REDUNDANT格式可以保留旧版本的MySQL的兼容性。

一排排InnoDB表使用冗余行格式有以下特点:

  • 每个索引记录包含6个字节的报头。这个头是用来连接连续的记录,也用于行级锁。

  • 在聚集索引记录包含所有用户定义的列字段。此外,有6个字节的事务ID字段和7-byte辊指针字段。

  • 如果没有主键是定义一个表,每个群集索引记录还包含6个字节的行ID字段。

  • 每一次索引记录包含所有主键字段聚集索引的关键不在二级指标定义。

  • 记录包含一个指针指向记录的每个字段。如果记录中字段的总长度小于字节,一个字节的指针;否则,两个字节。这些指针的数组被称为记录目录。这些指针指向的地方称为记录的数据部分。

  • 内部,InnoDB存储固定长度的字符列如CHAR(10)在固定长度格式InnoDB不截断的尾随空格VARCHAR专栏

  • InnoDB固定长度字段大于或等于76字节长度变长字段的编码,它可以存储页。例如,一个char(255)柱可以超过768字节如果字符集的最大字节长度大于3,因为它是utf8mb4

  • 一个SQLNULL价值储备的唱片目录的一个或两个字节。除此之外,SQL无效的价值储备零字节的数据记录的一部分,如果存储在可变长度列。在固定长度列,它保留了在记录的数据部分的固定长度列。保留固定的空间NULL值使栏目的更新无效的在非NULL将不会导致网页索引碎片做的价值。

紧凑的行格式的特点

这个COMPACT行行格式存储空间减少约20%相比,冗余在增加一些操作CPU使用成本格式。如果你的工作量是一个典型的一个有限的缓存命中率和磁盘速度,COMPACT格式可能会更快。如果工作量是一个罕见的情况下,由CPU速度有限,紧凑的格式可能较慢。

一排排InnoDB表使用粉盒行格式有以下特点:

  • 每个索引记录包含一个5字节的标头,可以冠以一个变长的头。这个头是用来连接连续的记录,也用于行级锁。

  • 该记录头的长度可变的部分包含指示位向量NULL专栏如果列数的指数,可以无效的N,位向量占用ceiling(N八)字节。(例如,如果有9到16列,可无效的,位向量使用两个字节。)柱,NULL不占空间比其他在这个向量的点。标题的长度可变的部分还包含可变长度列的长度。每个长度以一个或两个字节,这取决于该列的最大长度。如果索引中的所有列不为空有一个固定的长度,记录头没有变长的部分。

  • 每个非NULL可变长度字段,记录头包含在一个或两个字节的列的长度。只需两字节如果列部分存储在外部溢出页或最大长度超过255字节和字节的实际长度超过127。一个外部存储的列的字节长度表示内部存储的部分加上20字节指针指向外部存储部分的长度。内部768字节,所以长度为20。20字节的指针存储列的真实长度。

  • 记录头的后面是非数据内容—NULL专栏

  • 在聚集索引记录包含所有用户定义的列字段。此外,有6个字节的事务ID字段和7-byte辊指针字段。

  • 如果没有主键是定义一个表,每个群集索引记录还包含6个字节的行ID字段。

  • 每一次索引记录包含所有主键字段聚集索引的关键不在二级指标定义。如果任何这些主键字段的长度是可变的,每一次索引记录头具有可变长度的部分记录的长度,即使次要指标是固定长度列定义。

  • 在内部,为固定长度的字符集,InnoDB存储固定长度的字符列如CHAR(10)在固定长度格式

    InnoDB不截断的尾随空格VARCHAR专栏

  • 在内部,对可变长度字符集等utf8mb3utf8mb4InnoDB试图保存CHAR(N)进入N通过修整尾随空格字节。如果一个字节的长度CHAR(N)列值超过N字节,InnoDBTRIMs尾随空格最少的列值的字节长度。一个最大长度CHAR(N)柱的最大字节长度×N

    InnoDB储备最低N字节CHAR(N)。最小预留空间N在许多情况下,使栏目更新到位而造成的碎片做索引页。通过比较,为ROW_FORMAT=REDUNDANTCHAR(N)柱的最大字节长度×占据N

    InnoDB固定长度字段大于或等于76字节长度变长字段的编码,它可以存储页。例如,一个char(255)柱可以超过768字节如果字符集的最大字节长度大于3,因为它是utf8mb4

    ROW_FORMAT=DYNAMICROW_FORMAT=COMPRESSED手柄CHAR存储在相同的方式ROW_FORMAT=COMPACT

动态压缩行格式的特点

DYNAMIC压缩的行格式的变化COMPACT行格式。关于这些行格式的信息,参见第15.10.3,动态压缩行格式”

15.8.1.3移动或复制InnoDB表

本节描述了移动或复制部分或全部技术InnoDB表不同的服务器或实例。例如,你可以移动整个MySQL实例规模更大、更快的服务器;你可以克隆一个完整的MySQL实例的一个新的复制从服务器;你可以复制单个表的另一个实例的开发和测试应用程序,或数据仓库服务器产生报告。

在Windows,InnoDB在小写总是存储数据库和表的名称。移动数据库在从UNIX到Windows二进制格式或从Windows到Unix,创建数据库和表使用小写的名字。一个方便的方式来完成,这是添加下面一行的[ mysqld ]部分的你my.cnfmy.ini在创建数据库和表文件:

[mysqld]
lower_case_table_names=1
笔记

禁止在启动服务器lower_case_table_names设置不同的设置时使用的服务器初始化。

移动或复制技术InnoDB表包括:

迁移表空间

可移动表空间功能使用FLUSH TABLES ... FOR EXPORT准备好InnoDB从一个服务器复制到另一个表。要使用此功能,InnoDB表必须创建innodb_file_per_table设置打开(放)所以,每个InnoDB桌上有自己的空间。使用的信息,参见第15.7.6,“每表表空间文件复制到另一个实例”

MySQL企业备份

MySQL企业备份产品允许您备份MySQL数据库运行以最小的中断操作而产生一个一致的数据库快照。当MySQL企业备份复制表,读取和写入可以继续。此外,MySQL企业备份可以创建压缩的备份文件,备份集表。在MySQL的二进制日志相结合,可以执行时间点恢复。MySQL企业备份是包含在MySQL企业认购部分。

关于MySQL企业备份的更多细节,参见第29,MySQL企业备份概述”

复制数据文件(冷备份方法)

你可以移动InnoDB数据库复制的所有相关文件列出的“冷备份”下第15.17.1,“InnoDB Backup”

InnoDB数据和日志文件是二进制兼容的具有相同的浮点格式的所有平台。如果浮点格式不同,但你有没有用FLOATDOUBLE表中的数据类型,然后程序是一样的:简单的复制相关文件。

当你移动或复制文件/表格.ibd文件、数据库目录的名称必须相同的源和目的系统。存储在表定义InnoDB共享表空间包含数据库名称。事务ID和日志序列号存储在表空间文件也不同数据库之间。

移动.ibd文件及相关的表从一个数据库到另一个,使用一个RENAME TABLE声明:

重命名表db1.tbl_namedb2.tbl_name

如果你有一个清洁备份一个.ibd文件,你可以恢复它的MySQL安装它源自如下:

  1. 桌子上没有删除或截断你复制.ibd文件,因为这样会改变存储在表空间的表ID。

  2. 这一问题ALTER TABLE语句删除当前鸡传染性法氏囊病文件:

    ALTER TABLE tbl_name DISCARD TABLESPACE;
    
  3. 复制备份.ibd文件到适当的数据库目录。

  4. 这一问题ALTER TABLE声明中说InnoDB使用新的.ibd文件内容表:

    修改表tbl_name导入表;
    笔记

    这个ALTER TABLE ... IMPORT TABLESPACE功能不执行导入数据的外键约束。

在这样的背景下,一个清洁.ibd文件备份是指下列要求得到满足:

  • 有交易的任何未提交的修改.ibd文件

  • 有无合并插入缓冲中的条目.ibd文件

  • 清除已删除所有删除标记索引的记录.ibd文件

  • mysqld已经刷新所有修改过的页面的.ibd从缓冲池的文件

你可以做一个干净的备份.ibd使用以下文件的方法:

  1. 停止一切活动,从mysqld所有的交易服务器和承诺。

  2. 等到SHOW ENGINE INNODB STATUS显示数据库中有没有活跃的交易,而主线程的状态InnoDBWaiting for server activity。然后你可以复制的鸡传染性法氏囊病文件

制作一个干净的副本的另一种方法.ibd文件是使用MySQL企业备份产品:

  1. 使用MySQL企业备份程序备份InnoDB安装

  2. 开始第二mysqld服务器上的备份,让它清理.ibd在备份文件

进出口(就)

你可以使用mysqldump转储你的表在一台机器上,然后导入转储文件在另一台计算机。使用这种方法,它不无论格式不同或者你的表包含浮点数据的问题。

提高该方法的性能的方法之一是关闭自动提交模式导入数据时,假设空间对进口交易产生大的回滚段足够的空间。做的承诺只有在把整个表或一段表。

15.8.1.4转换表,从MyISAM到InnoDB

如果你有MyISAM表要转换为InnoDB更好的可靠性和可扩展性,在转换之前,检查下列指导和技巧。

笔记

分区MyISAM在MySQL的早期版本创建的表没有MySQL 8兼容。这样的表格必须事先准备好升级,或者删除分区,或将它们转换为InnoDB。看到第22.6.2,分区限制有关存储引擎”为更多的信息

MyISAM和InnoDB调整内存使用

你的转变MyISAM表、低值的key_buffer_size配置选项来缓存结果不再需要释放内存。增加的价值innodb_buffer_pool_size配置选项,一种类似分配缓存角色表演InnoDB表这个InnoDB缓冲池缓存表的数据和索引数据,加快查询和查询结果的记忆保持重用查找。关于缓冲池大小配置指导,看第8.12.3.1,“MySQL如何使用内存”

处理时间过长或过短的交易

因为MyISAM表不支持交易,你可能没有注意到autocommit配置选项和COMMITROLLBACK声明.这些关键词是允许多个会话读写很重要InnoDB表的同时,提供了大量的可扩展性的好处写繁重的工作量。

而交易是开放的,保持系统的数据在事务开始时的快照,可如果系统插入、更新和删除造成很大的开销,数百万行而流浪交易保持运行。因此,要避免使用太长的交易:

  • 如果你使用的是MySQL互动实验环节,总是COMMIT(敲定的变化)或ROLLBACK(撤销更改)完成时。关闭互动环节,而不是让他们开了很长时间,避免长时间打开的事务由事故。

  • 确保您的应用程序中的任何错误处理程序也ROLLBACK不完全的改变或COMMIT完成后的变化

  • ROLLBACK是一种比较昂贵的操作,因为INSERTUPDATE,和DELETE操作写入InnoDB之前的表COMMIT,与期望,大多数都是成功提交和回滚是罕见的。当试验的大量数据,避免更改大量行然后回滚这些变化。

  • 加载大量的数据序列时INSERT报表,定期COMMIT结果避免了交易的最后几个小时。在典型的负载操作的数据仓库,如果做错了事情,你截断该表(使用TRUNCATE TABLE)和从头开始而不是做ROLLBACK

前面的提示节省内存和磁盘空间,可以在交易中浪费了太久。当交易比他们应该的,问题是过度的I / O每COMMIT确保每一个变化是,MySQL安全记录到磁盘,其中涉及到一些我/ O.

  • 对于大多数操作InnoDB表格,你应该使用的设置autocommit=0。从效率的角度来看,这就避免了不必要的I / O当你发行大量连续的INSERTUPDATE,或DELETE声明.从安全角度来看,这可以让你的问题ROLLBACK语句来恢复丢失或数据被破坏,如果你在犯一个错误MySQL命令行,或者在一个异常处理程序在您的应用程序。

  • 的时候autocommit=1适用于InnoDB表是当运行一个查询序列生成报告或统计分析。在这种情况下,没有I/O处罚相关COMMITROLLBACK,和InnoDB可以自动优化只读的工作量

  • 如果你把一系列相关的变化,最终在一个单独的所有改变COMMIT最后.例如,如果您将相关的信息分成几个表,做一个COMMIT在所有的变化。如果你运行多个INSERT报表,做单COMMIT毕竟数据加载;如果你是做百万INSERT报表,也许分手的巨大的交易通过发行COMMIT每一万或几十万条记录,所以交易不太大。

  • 记住,即使SELECT语句打开一个交易,所以在运行一些报告或在交互式调试查询MySQL会议期间,无论是问题COMMIT或关闭MySQL会话

处理死锁

你可能会看到警告消息指死锁在MySQL错误日志,或输出SHOW ENGINE INNODB STATUS。尽管听起来很可怕的名字,一个死锁是不是一个严重的问题InnoDB表,往往不需要任何纠正行动。当两个交易开始修改多个表,按不同的顺序访问表,他们可以达到一种状态,每一笔交易是等待对方也不可以。什么时候死锁检测启用(默认),MySQL立即检测这个条件和取消(回滚交易,允许其他继续。如果死锁检测是残疾人使用innodb_deadlock_detect选项配置InnoDB依靠innodb_lock_wait_timeout设置回滚事务在死锁的情况下。

无论哪种方式,你的应用程序需要的错误处理逻辑重新启动交易,强行取消由于死锁。当你再次发出相同的SQL语句之前,原来的定时问题不再适用。对方的交易已经完成,你可以继续进行,或其他交易仍在进行,你的事务等待直到它完成。

如果死锁的警告不断出现,你可能会回顾应用程序代码以一致的方式来重新排序的SQL操作,或缩短交易。你可以测试的innodb_print_all_deadlocks选择能够看到在MySQL错误日志所有死锁的警告,而不是只在最后的警告SHOW ENGINE INNODB STATUS输出

有关更多信息,参见第15.5.5,“会”Deadlocks

规划的存储布局

从获得最佳性能InnoDB表,你可以调整一些存储布局相关参数。

当你转换MyISAM表大,经常访问的,把重要的数据,调查和考虑innodb_file_per_tableinnodb_page_size配置选项ROW_FORMATkey_block_size条款CREATE TABLE声明

在最初的实验中,最重要的设置是innodb_file_per_table。如果启用此设置,这是默认的,新InnoDB表被隐式地创建文件表表空间。在与InnoDBSYSTEM表空间,文件的每个表的表空间允许磁盘空间是由操作系统回收表时截断或删除。每个表的表空间也支持文件动态压缩的行的格式和相关的如表压缩功能,有效关闭页面存储长可变长度列,和大的前缀索引。有关更多信息,参见第15.7.4“InnoDB文件,每个表的表空间”

你也可以保存InnoDB在一个共享的通用表表,支持多个表和所有行的格式。有关更多信息,参见第15.7.10”一般,InnoDB表空间”

将现有的表

将一个非—InnoDB表格的使用InnoDB使用ALTER TABLE

修改表table_nameENGINE=InnoDB;
克隆一个表的结构

你可能会InnoDB表是MyISAM表的克隆,而不是用ALTER TABLE进行转换,在转换旧的和新的并行测试表。

创建一个空的InnoDB具有相同的列和索引的定义表。使用显示创建表table_nameG看到完整的CREATE TABLE语句的使用。改变引擎条款ENGINE=INNODB

将现有的数据

传输大量数据到一个空的InnoDB表创建的前一节所示,插入行插入innodb_tableSELECT * FROMmyisam_table顺序primary_key_columns

你也可以创建索引InnoDB插入后的数据表。从历史上看,创造新的次要指标是InnoDB缓慢运行,但现在你可以在加载数据从索引的创建步骤相对较少的开销创建索引。

如果你有UNIQUE次级键的限制,你可以通过关掉唯一性检查暂时进口操作过程中,一个表的输入速度:

SET unique_checks=0;... import operation ...SET unique_checks=1;

对于大表,这样可以节省磁盘I/O,因为InnoDB可以使用它变化的缓冲写辅助索引记录作为批处理。可以肯定,数据不包含重复的键。unique_checks允许但不要求存储引擎忽略重复键。

为更好地控制在插入过程中,您可以插入件大表:

INSERT INTO newtable SELECT * FROM oldtable
   WHERE yourkey > something AND yourkey <= somethingelse;

插入之后的所有记录,您可以重命名表。

大表的转换过程中,增加的大小InnoDB缓冲池来减少磁盘I/O,最大值为物理内存的80%。你也可以增加大小InnoDB日志文件

存储要求

如果你想让你的数据在几个临时副本InnoDB在转换过程中的表,建议您创建在每个表表空间文件的表使您可以回收磁盘空间,当你放下表。当innodb_file_per_table配置选项(默认),新创建的InnoDB表中每个表的表空间隐式创建的文件。

你是否将MyISAM表直接或创建一个克隆InnoDB表,确保您有足够的磁盘空间来保存旧的和新的表中。InnoDB表需要更多的磁盘空间比MyISAM如果一个ALTER TABLE操作的空间运行,它开始回滚,并且如果磁盘绑定需要几个小时。插入物,InnoDB使用插入缓冲合并继发性指数指标的批记录。这节省了大量的磁盘I / O的回滚,没有这样的机构,以及回滚可以比插入长30倍。

在一个失控的回滚的情况下,如果你不在你的数据库中有价值的数据,可以将数据库的过程中杀死而不是磁盘I/O操作完成数百万等待。为完整的程序,看第15.20.2,迫使InnoDB恢复”

定义每个表的主键

这个PRIMARY KEY条款是影响MySQL查询、表和索引的空间使用性能的一个关键因素。主键唯一标识表中的一行。该表中的每一行必须有一个主键值,没有两行具有相同的主键值。

这些都是主要的指导方针,随后更详细的解释。

  • 声明一个PRIMARY KEY每个表。通常,这是你所指的是最重要的列哪里条款在查找一行

  • 申报PRIMARY KEY在原来的条款CREATE TABLE声明中,而不是添加后通过ALTER TABLE声明

  • 选择列及其数据类型的仔细。喜欢的数字列在字符或字符串的。

  • 如果没有一个稳定的、独特的、非空的考虑使用自动递增列,数值列使用。

  • 一个自动递增列也是一个不错的选择,如果有任何怀疑的主键列的值会改变。改变一个主键列中的值是一个昂贵的操作,可能涉及到重新排列的表中的数据在每个二级指标。

考虑添加一个主键任何表不已经有一个了。使用最小的实际数值类型基于最大投影尺寸表。这可以使每排更紧凑,可大表的产量大幅节省空间。的节省空间,如果表中有任何增加次要指标,因为主键值在每个二级指标条目重复。除了减少在磁盘上的数据的大小,一个小的主键也让数据更适合缓冲池,加快各种操作和提高并发。

如果表中已经有一些长柱的主键,如VARCHAR,可以考虑增加一个新的符号汽车柱切换的关键,即使不参考查询中的列。这种设计的改变可以在二级指标产生实质性的节约空间。你可以指定主键列前UNIQUE NOT NULL执行相同的约束为主键条款,即防止重复或空值在所有这些列。

如果你把相关信息在多个表,每个表使用相同的主键列。例如,一个人才数据库可能有几个表,每个员工编号主键。销售数据可能与客户编号主键有表和其他表的主键顺序号。因为使用主键查找速度非常快,你可以构建高效的加入这样的表的查询。

如果你离开PRIMARY KEY条款完全,MySQL创建一个看不见你。这是一个6字节值,可能比你需要更长的时间,因此浪费空间。因为它是隐藏的,你不能参考查询到它。

应用性能的研究

功能的可靠性和可扩展性InnoDB需要比更多的磁盘存储MyISAM表你可以更改列和索引的定义略,更好的利用空间,减少I/O和内存消耗处理结果集时,更好的查询优化计划使得查找索引的高效利用。

如果你做为主键建立数字ID列,使用价值的交叉引用其他表相关的价值观,特别是加入查询。例如,而不是接受一个国家的名字作为输入和查询搜索同样的名字,做一个查找来确定国家的身份,然后做其他查询(或单连接查询)来查找相关信息在多个表。而不是存储客户或目录项的数目作为一个数字串,可能使用了几个字节,将其转换为存储和查询的数字ID。4字节无符号INT柱可以在40亿项指标(与美国义亿:10亿)。对不同的整数类型的范围,看到第11.2.1,”Integer Types(精确值)整数int、smallint、TINYINT、MEDIUMINT,bigint”

理解InnoDB表关联的文件

InnoDB文件需要更多的照顾和规划比MyISAM文件

15.8.1.5 auto_increment处理InnoDB

InnoDB提供了一个可配置的锁定机制,可以显著提高可扩展性和SQL语句行添加到表的性能汽车专栏使用AUTO_INCREMENT机制与InnoDB表一AUTO_INCREMENT列必须定义为一个指数,它是可能执行索引的等值部分选择最大(ai_col在查表获得最大的列值。通常,这是通过使列一些表索引的第一列实现。

本节描述的行为AUTO_INCREMENT锁模式,针对不同的使用意义汽车锁模式的设置,以及如何InnoDB初始化汽车计数器

InnoDB auto_increment锁模式

本节描述的行为AUTO_INCREMENT锁模式用于生成自动增量值,以及如何影响每个锁模式复制。自动增量的锁模式配置在启动时使用innodb_autoinc_lock_mode配置参数

以下术语用于描述innodb_autoinc_lock_mode设置

  • INSERT喜欢声明

    所有陈述,产生新的表行,包括INSERTINSERT ... SELECTREPLACEREPLACE ... SELECT,和LOAD DATA。包括简单的插入批量插入,和混合模式插入

  • 简单的插入

    陈述的是插入的行数可以事先确定(当语句初步处理)。这包括单排、多排INSERTREPLACE声明没有嵌套的子查询,但不INSERT ... ON DUPLICATE KEY UPDATE

  • 批量插入

    陈述的是插入的行数(和所需的自动增量值的数量)在事先是不知道的。这包括INSERT ... SELECTREPLACE ... SELECT,和LOAD DATA陈述,而不是单纯的插入InnoDB指定新的值为汽车列在一个时间的每一行进行处理。

  • 混合模式插入

    这些都是简单的插入语句指定了自动增量值(但不是全部)的新的行。一个例子如下,其中c1是一个汽车列的表t1

    插入T1(C1,C2)values(1,a),(a &#39; a),(Null,b),(5 &#39; c),(Null,d &#39;);

    另一种类型的混合模式插入INSERT ... ON DUPLICATE KEY UPDATE,在最坏的情况下实际上是一种INSERT其次是UPDATE,在分配值为汽车柱可能会或可能不会更新期使用。

有三种可能的设置innodb_autoinc_lock_mode配置参数。设置为0, 1,或2,为传统连续的,或交错锁定模式,分别为。在MySQL 8,交错的锁模式(innodb_autoinc_lock_mode=2)是默认设置。MySQL 8之前,连续锁模式是默认的(innodb_autoinc_lock_mode=1

交错的锁模式在MySQL 8的默认设置反映了从基于语句的复制基于行的复制作为默认复制类型的变化。基于语句的复制需要连续自动增量的锁模式确保自动增量值在可预测和可重复的顺序分配给SQL语句序列,而基于行的复制不到SQL语句的执行顺序的敏感。

  • innodb_autoinc_lock_mode = 0传统锁定模式)

    传统的锁模式提供了在存在相同的行为innodb_autoinc_lock_mode配置参数介绍了MySQL 5.1。传统的锁模式的选择提供了向后兼容性,性能测试,并在“混合模式插入”问题的工作,由于在语义上可能存在的差异。

    在这种锁定模式,所有插入像报表获得特殊的表级AUTO-INC锁插入表汽车专栏这锁通常被认为语句的末尾(不到交易结束)确保自动增量值被分配在一个可预测和可重复的,对于一个给定的序列INSERT报表,并确保自动增量值的任何语句分配是连续的。

    在基于语句的复制的情况下,这意味着当一个SQL语句是在从服务器上复制,相同的值用于自动递增列作为主服务器上。执行多个结果INSERT报表是确定性的,和从再现相同的数据作为主人。如果由多个自动增量值INSERT报表是交错的,两个并行的结果INSERT报表将具有不确定性,并不能可靠地传播到使用基于语句的复制从服务器。

    清楚地说明这一点,考虑一个例子,使用此表:

    CREATE TABLE t1 (
      c1 INT(11) NOT NULL AUTO_INCREMENT,
      c2 VARCHAR(10) DEFAULT NULL,
      PRIMARY KEY (c1)
    ) ENGINE=InnoDB;
    

    假设有两交易,每个插入到表中的AUTO_INCREMENT专栏一个事务使用INSERT ... SELECT语句,插入1000行,另一个是使用一个简单的INSERT表插入一行:

    TX1:插入T1(C2)选择1000行与另一个表中插入…2:T1(C2)值(&#39;xxx”);

    InnoDB不知道提前多少行提取SELECTINSERT声明在TX1,它将自动增加值一次为报表收益。与表级锁,在语句的末尾,只有一个INSERT声明指表T1可以执行一次,并由不同的报表自动增量数代不交错。由TX1所产生的自动增量值INSERT ... SELECT语句是连续的,和(单)自动增值利用INSERT声明在TX2是小于或大于那些用于TX1,根据语句首先执行。

    只要在SQL语句执行时相同的顺序重演的二进制日志(当使用基于语句的复制,或恢复情况),结果都是一样的因为他们当TX1和TX2第一跑。因此,表级锁直到语句的结束使INSERT通过使用自动增量安全基于语句的复制语句。然而,那些表级锁的并发性和可扩展性限制当多个事务同时执行INSERT语句。

    在前面的例子中,如果没有表级锁,用于自动递增列的值INSERT在TX2依靠精确的语句执行时。如果INSERT对TX2执行而INSERTTX1运行(而不是在它开始之前或之后完成),由两个指定特定的自动增量值INSERT陈述是不确定的,并可以运行。

    连续的锁模式,InnoDB可以避免使用表级auto-inc简单的插入报表所在行数是已知的,并且仍然保持为基于语句的复制确定执行和安全。

    如果你没有使用二进制日志重播SQL语句作为恢复或复制部分的交错锁定模式可以用来消除所有使用表级AUTO-INC锁更大的并发性和性能,在成本允许的情况下自动递增编号分配差距的声明和潜在的数据并发执行的语句交错布置。

  • innodb_autoinc_lock_mode = 1连续的锁定模式)

    在这种模式下,批量插入使用专用的AUTO-INC表级锁和保持它在语句结束。这适用于所有INSERT ... SELECTREPLACE ... SELECT,和LOAD DATA声明.只有一个声明持auto-inc锁可以执行一次。如果批量插入操作的源表不同于目标表的AUTO-INC在目标表锁在一个共享锁被选定的源表中的第一行了。如果源和批量插入操作的目标是相同的表,auto-inc锁是在共享锁上所有选定的行了。

    简单的插入(为要插入的行数是已知的)避免表水平AUTO-INC由一个互斥体的控制下获得所需的自动增量值的数量(一个轻量级的锁锁),只有分配过程的持续时间,直到语句完成。没有表水平AUTO-INC锁是使用除非auto-inc锁被另一个事务举行。如果另一个事务持有AUTO-INC锁,一简单的插入等待AUTO-INC锁,如果它是一个大容量插入

    这种锁定模式确保,在存在INSERT报表所在行数是事先不知道(在自动递增编号为声明的进展),所有自动增量值指定的任何INSERT喜欢语句是连续的,操作安全的基于语句的复制。

    简单地说,这种锁模式显著提高了可扩展性,安全使用基于语句的复制。此外,与传统锁定模式,自动增加的数字的任何语句分配连续的。有无变化在语义比较传统任何声明,使用自动增量模式,一个重要的例外。

    例外的是混合模式插入,在用户提供了一个明确的价值观AUTO_INCREMENT列一些,但不是全部,在一个多行行简单的插入。这种刀片,InnoDB分配更多的自动增量值比行数插入。然而,所有的值自动分配连续产生(因此高于)通过最近执行先前的陈述所产生的自动增量值。过剩数据丢失

  • innodb_autoinc_lock_mode = 2交错锁定模式)

    在这种锁定模式,没有INSERT喜欢语句中使用表级auto-inc锁,和多个语句可以同时执行。这是最快和最可扩展的锁定模式,但它是不安全当使用基于语句的复制或恢复的情况时,SQL语句是从二进制日志重播。

    在这种锁定模式,自动增量值保证在所有并发执行的是独特的和单调递增INSERT喜欢声明.然而,由于多个语句可以同时生成数(即分配数交错在陈述),价值观产生的任何语句插入的行可能不连续。

    如果唯一的语句的执行是简单的插入在要插入的行数是事先已知的,有在一个语句生成的数字没有差距,除了混合模式插入。然而,当批量插入执行时,有可能在汽车增量值的任何语句分配是。

InnoDB auto_increment锁模式使用的影响
  • 使用自动增量复制

    如果您使用的是基于语句的复制,设置innodb_autoinc_lock_mode0或1,使用相同的值对主人和奴隶。自动增量值不保证对奴隶一样在主如果使用innodb_autoinc_lock_mode= 2 (交错)或配置,主人和奴隶都使用相同的锁定模式。

    如果您使用的是基于行的或混合格式的复制,所有的自动增量的锁模式是安全的,因为基于行的复制不会对SQL语句的执行顺序敏感(和混合格式使用基于行的复制任何陈述,不安全的基于语句的复制)。

  • 迷路的自动增量值序列的空白

    在所有的锁模式(0, 1,2),如果一个事务产生自动增量值回滚,那些自动增量值迷路的。一旦一个值是一个自动递增列生成的,它不能被回滚,是否INSERT喜欢陈述完毕,是否包含事务回滚。这样的损失值不重复使用。因此,有可能存储在一个值是空白汽车一个表列

  • 指定为null或者0AUTO_INCREMENT专栏

    在所有的锁模式(0, 1,2),如果用户指定为零或0AUTO_INCREMENT柱在INSERTInnoDB将行如果值没有指定,它产生一个新值。

  • 给一个负值AUTO_INCREMENT专栏

    在所有的锁模式(0, 1,2),该自动递增机制的行为是不确定如果你到指定一个负值AUTO_INCREMENT专栏

  • 如果AUTO_INCREMENT值变得大于指定的整数类型的最大整数

    在所有的锁模式(0,1,2),该自动递增机制的行为是未定义的值,如果较大,可以存储在指定的整数类型的最大整数。

  • 自动增量值的差距批量插入

    innodb_autoinc_lock_mode设置为0(传统(1)或连续的),任何给定的语句生成的自动增量值是连续的,没有间隙,因为表级AUTO-INC锁在语句的结尾,只有一个这样的语句可以执行一次。

    innodb_autoinc_lock_mode设置为2(交错),有可能产生的自动增加值是空白批量插入,但如果有concurrently执行只读INSERT喜欢声明.

    锁模式1或2,差距之间可能会发生连续的陈述,因为批量插入的每个语句所需的精确自动增量值的数量可能不被高估是可能的。

  • 自动增加值分配混合模式插入

    考虑一个混合模式插入,其中一个简单的插入指定一些自动增量值(但不是全部)产生的行。这样一个声明的行为不同的锁模式0,1,和2。例如,假设c1是一个汽车列的表t1,和最新的自动生成的序列号是100。

    MySQL的&#62;CREATE TABLE t1 (-&#62;c1 INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, -&#62;c2 CHAR(1)-&#62;) ENGINE = INNODB;

    现在,考虑以下混合模式插入声明:

    mysql> INSERT INTO t1 (c1,c2) VALUES (1,'a'), (NULL,'b'), (5,'c'), (NULL,'d');
    

    innodb_autoinc_lock_mode设置为0(传统),四个新的行:

    mysql> SELECT c1, c2 FROM t1 ORDER BY c2;
    +-----+------+
    | c1  | c2   |
    +-----+------+
    |   1 | a    |
    | 101 | b    |
    |   5 | c    |
    | 102 | d    |
    +-----+------+
    

    下一个可用的自动增量的数值是103,自动增加值分配一次,不能一下子在语句执行的开始。这个结果是真的是否有并发执行INSERT喜欢2 . Statements(of any type).

    innodb_autoinc_lock_mode设置为1(连续的),四行也:

    mysql> SELECT c1, c2 FROM t1 ORDER BY c2;
    +-----+------+
    | c1  | c2   |
    +-----+------+
    |   1 | a    |
    | 101 | b    |
    |   5 | c    |
    | 102 | d    |
    +-----+------+
    

    然而,在这种情况下,下一个可用的自动增量值为105,不是103,因为四自动增量值分配在时间的语句的处理,但只有两个用于。这个结果是真的是否有并发执行INSERT喜欢2 . Statements(of any type).

    innodb_autoinc_lock_mode设置为方式2(交错),四个新的行:

    mysql> SELECT c1, c2 FROM t1 ORDER BY c2;
    +-----+------+
    | c1  | c2   |
    +-----+------+
    |   1 | a    |
    |   x | b    |
    |   5 | c    |
    |   y | d    |
    +-----+------+
    

    价值观xy是独一无二的,比任何先前生成的行。然而,具体的值xy取决于并发执行的语句生成的自动增量值的数目。

    最后,考虑下面的语句,发出最近生成的序列号是100:

    mysql> INSERT INTO t1 (c1,c2) VALUES (1,'a'), (NULL,'b'), (101,'c'), (NULL,'d');
    

    与任何innodb_autoinc_lock_mode设置,该语句将生成一个重复键错误23000(不能写;重复键表101)由于分配给排(NULL, 'b')与行插入(101、C)失败.

  • 修改AUTO_INCREMENT在一个序列中的列值INSERT声明

    在MySQL 5.7和更早的版本,修改AUTO_INCREMENT在一个序列中的列值INSERT声明可能导致重复的条目错误.例如,如果你进行了UPDATE手术改变了汽车一个值大于最大电流自动增量值的列的值,随后INSERT操作,没有指定一个未使用的自动增量值可能会遇到重复的条目错误.在MySQL 8后,如果修改AUTO_INCREMENT一个值大于最大电流自动增量值的列的值,新值是坚持,和随后的INSERT操作将自动增加值从新的、更大的价值。这种行为是下面的例子演示了。

    MySQL的&#62;CREATE TABLE t1 (-&#62;c1 INT NOT NULL AUTO_INCREMENT,-&#62;PRIMARY KEY (c1)-&#62;) ENGINE = InnoDB;MySQL的&#62;INSERT INTO t1 VALUES(0), (0), (3);MySQL的&#62;SELECT c1 FROM t1;噢,| C1 | - | | | 1 2 3 | | | - MySQL &#62;UPDATE t1 SET c1 = 4 WHERE c1 = 1;MySQL的&#62;SELECT c1 FROM t1;噢,| C1 | - | | | 2 3 4 | | | - MySQL &#62;INSERT INTO t1 VALUES(0);MySQL的&#62;SELECT c1 FROM t1;- | C1 | - | | | 2 3 4 5 | | | | | -
InnoDB auto_increment计数器初始化

本节介绍了如何InnoDB初始化汽车计数器

如果你指定一个AUTO_INCREMENT列一个InnoDB表,内存中表对象包含一个特殊的计数器称为自动递增计数器,用于分配新值的列。

在MySQL 5.7和更早的版本中,自动递增计数器只存储在内存中,而不是磁盘上。初始化后重启服务器,自动增量计数器,InnoDB将执行相当于先插入以下语句为一个表包含一个汽车专栏

SELECT MAX(ai_col) FROM table_name FOR UPDATE;

在MySQL 8中,这种行为的改变。当前最大的自动增加计数器的值写入到重做日志的每一次变动,保存到一个引擎私人系统表在每个检查点。这些变化使电流最大值自动递增计数器的值持续在服务器重新启动。

在服务器重启后正常关机,InnoDB初始化使用的最大电流自动增量值存储在数据字典系统表在内存中自动递增计数器。

在重新启动服务器崩溃恢复过程,InnoDB初始化使用的最大电流自动增量值存储在数据字典系统表在内存中自动递增计数器和扫描日志自动递增计数器的值从上一个检查点写。如果重做日志值大于内存计数器的值,应用重做日志的价值。然而,在服务器崩溃的情况下,一个先前分配的自动增量值不能再保证。每一次的最大电流自动增量值是由于一个改变INSERTUPDATE操作,新值写入到重做日志,但如果崩溃发生在重做日志刷新到磁盘,以前分配值可以重复使用时自动递增计数器被初始化后重新启动服务器。

只有在这种情况下InnoDB用一个等效的选择最大(ai_col)从table_name更新声明在MySQL 8以后初始化一个自动递增计数器时导入表空间没有一个.cfg元数据文件。否则,当前的最大自动递增计数器值的读取CFG桩复合地基美德

在MySQL 5.7和更早的版本中,服务器重启取消的影响AUTO_INCREMENT = N表选项,可用于创建表ALTER TABLE语句设置一个初始计数器值或改变现有的计数器的值,分别。在MySQL 8中,服务器重启不取消的影响AUTO_INCREMENT = N表选项。如果你初始化自动递增计数器一个特定的值,或者如果您改变自动递增计数器的值到一个更大的价值,新的价值是坚持在服务器重新启动。

笔记

ALTER TABLE ... AUTO_INCREMENT = N能改变的只有自动递增计数器的值大于当前最大值。

在MySQL 5.7早,服务器重启后立即ROLLBACK操作可能导致自动增量值,以前被分配到回滚事务的重用,有效地击退最大电流自动增量值。在MySQL 8中,目前最大的汽车增加值持续,防止先前分配的值的重用。

如果一个SHOW TABLE STATUS语句检查表前自动递增计数器初始化,InnoDB打开表并初始化计数器的值使用的最大电流自动增加的值是存储在数据字典系统表。该值被存储在存储器中使用的插入或更新后。该计数器的值初始化使用正常的独占锁定,持续到最后的成交表中读取。InnoDB遵循相同的程序初始化一个新创建的表,用户指定的自动增量值是大于0时自动递增计数器。

后自动递增计数器被初始化,如果没有显式指定自动增量值插入一行时,InnoDB隐式增量计数器并指定列的新值。如果你插入一行,明确指定一个自增列的值,和值大于当前最大的计数器值,计数器设置为指定的值。

InnoDB使用存储器自动增量计数器只要服务器运行。当服务器停止和重新启动,InnoDB重新初始化自动递增计数器,如前所述。

这个auto_increment_offset配置选项确定为出发点汽车列值。默认设置为1

这个auto_increment_increment配置选项控制连续列值之间的时间间隔。默认设置为1。

15.8.1.6 InnoDB和外键约束

如何InnoDB存储引擎处理外键约束是本节中的以下主题下的描述:

外键使用信息和例子,看第13.1.18.6,“使用外键约束”

外键定义

外键定义InnoDB表格须符合以下条件:

  • InnoDB允许一个外键引用的任何索引列或一组列。然而,在所引用的表,必须有一个索引引用的列列为第一在同一顺序的列

  • InnoDB目前不支持外键与用户定义的分区表。这意味着没有用户分区InnoDB表格可能包含外键引用或列的外键引用。

  • InnoDB允许外键约束引用唯一的密钥。这是一个InnoDB标准的SQL扩展

引用操作

对于外键参照动作InnoDB表格须符合以下条件:

  • SET DEFAULT由MySQL服务器允许的,它拒绝无效的InnoDBCREATE TABLEALTER TABLE使用这一条款的声明是不容许的InnoDB表。

  • 如果有在父表中具有相同关键值引用几行,InnoDB行为在外键检查如果其他母行相同的键值不存在。例如,如果你定义了一个限制类型约束,并有几个父行子行,InnoDB不允许任何人父行删除。

  • InnoDB进行级联操作通过深度优先算法,基于记录在对应的外键约束指标。

  • 如果ON UPDATE CASCADE在更新设置空递归更新相同的表它已在级联更新,就像RESTRICT。这意味着你不能使用自我参照级联更新ON UPDATE SET NULL运营这是为了防止无限循环产生的级联更新。一个自我指涉删除设置空,另一方面,是可能的,是一种自我参照ON DELETE CASCADE。连锁经营不能嵌套超过15层。

  • 像MySQL,SQL语句中插入、删除或更新的行数,InnoDB检查独特FOREIGN KEY约束排排。执行外键检查时,InnoDB设置共享行级锁在孩子或父母记录它看看。InnoDB外键约束立即检查;检查不推迟提交事务。根据SQL标准,违约行为应暂缓检查。那是,约束只检查后整个SQL语句已被处理。直到InnoDB实现了延迟约束检查,有些事情是不可能的,如删除一个记录,是指本身使用外键。

对于生成的列和虚拟索引外键约束
  • 在一个外键约束存储生成的列不能使用ON UPDATE CASCADE删除设置空ON UPDATE SET NULL删除默认设置,或ON UPDATE SET DEFAULT

  • 外键约束不能引用虚拟生成的列

  • MySQL 8之前,外键约束不能引用一个虚拟生成的列定义的辅助索引。

15.8.1.7限制InnoDB表

限制InnoDB表是本节中的以下主题下的描述:

警告

在使用NFS与InnoDB,审查潜在问题概述使用NFS与MySQL

Maximums和最小值
  • 一个表最多可包含1017列。虚拟生成的列都包含在这个极限。

  • 一个表最多可包含64二级指标

  • 索引键前缀长度限制为3072字节InnoDB表使用动态COMPRESSED行格式

    索引键前缀长度限制为767字节InnoDB表使用冗余COMPACT行格式。例如,你可能有一个达到这个极限列前缀超过191个字符的索引上TEXTvarchar柱,假设utf8mb4字符集和每个字符4字节的最大。

    尝试使用一个索引键前缀长度超过限制返回一个错误。

    适用于索引键前缀也适用于全列索引键的限制。

  • 如果你减少InnoDB页面大小对8kb即4KB通过指定innodb_page_size选择创建MySQL实例时,索引键的最大长度是降低比例,基于16KB的页面大小为3072字节的限制。即最大索引键的长度为1536字节时,页面大小为8KB,768字节时,页面大小是4KB。

  • 最大的16列是多列索引允许。超过限制将返回一个错误。

    ERROR 1070 (42000): Too many key parts specified; max 16 parts allowed
    
  • 最大的行长度,除了可变长度列(VARBINARYVARCHARBLOBTEXT),略少于一半的一页为4KB,8KB,16KB、32KB的页面大小。例如,在默认的最大行长度innodb_page_size16kb的大约是8000字节。对于一个InnoDB64KB页面大小,最大长度为16000字节的行。LONGBLOBLONGTEXT列必须小于4GB,和总的行长度,包括BLOBTEXT列,必须小于4GB

    如果行不到半页,都是本地存储页面内的。如果超过半页,可变长度列选择外部关闭页面存储到行符合半页描述第15.11.2,“文件管理”

  • 虽然InnoDB支持行的大小大于65535字节的内部,MySQL本身施加一个65535行大小限制的所有列的大小:

    MySQL的&#62;CREATE TABLE t (a VARCHAR(8000), b VARCHAR(10000),-&#62;c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),-&#62;f VARCHAR(10000), g VARCHAR(10000)) ENGINE=InnoDB;(4):错误1118排尺寸太大。对于二手台式的行大小的最大值,不可计数的斑点,是65536。你必须改变带来的一些列的文本或斑点

    看到第c.10.4,“限制表的列数和行的大小”

  • 在一些老的操作系统,文件必须小于2GB。这不是一个限制InnoDB本身,但是如果你需要一个大的空间,配置它使用几个较小的数据文件,而不是一个大的数据文件。

  • 该组合尺寸InnoDB日志文件可以高达512GB。

  • 最小空间尺寸略大于10MB。最大的表空间的大小取决于InnoDB页面大小

    表15.8 InnoDB表空间大小的最大值

    InnoDB页面大小最大尺寸尺寸
    4kb16tb
    8kb32tb
    16kb64tb
    32kb128tb
    64kb256tb

    最大设置尺寸的也是最大尺寸的桌子。

  • 默认的页大小InnoDB16KB。你可以增加或减少页面大小配置innodb_page_size选择创建MySQL实例时。

    32kb和64KB页面大小的支持,但ROW_FORMAT=COMPRESSED不支持的页面大小大于16kb。为32kb和64KB页面大小,最大记录大小为16KB。为innodb_page_size=32k,大小为2MB。为innodb_page_size=64k,大小为4MB

    使用特定的MySQL实例InnoDB页面大小不能使用数据文件或日志文件的一个实例,使用不同的页面大小。

在InnoDB表的限制
  • ANALYZE TABLE确定指标的基数(如显示在基数SHOW INDEX通过输出)随机跳水在每个索引树并更新相应指标的基数估计。因为这些都只是估计,重复运行ANALYZE TABLE可以产生不同的数字。这使得ANALYZE TABLEInnoDB表而不是100%准确的因为它不需要考虑所有的行。

    你能做的统计收集的ANALYZE TABLE通过打开更精确、更稳定innodb_stats_persistent配置选项,解释第15.6.11.1”配置,持续优化统计参数。当这个设置被启用,它是重要的是要跑ANALYZE TABLE在索引列数据的重大变化,因为统计数字是不是周期性地重新计算(如在服务器重启)。

    如果持续的统计设置是启用的,你可以改变随机跳数的修改innodb_stats_persistent_sample_pages系统变量。如果持续的统计设置被禁用,修改innodb_stats_transient_sample_pages系统变量来代替

    MySQL使用索引的基数估计在连接优化。如果一个连接是不正确的方法进行优化,尽量使用ANALYZE TABLE。在少数情况下,ANALYZE TABLE不产生价值的足够好,你的特殊的表,你可以使用力量指数你的疑问迫使某一指标的使用,或者设置max_seeks_for_key系统变量以确保MySQL喜欢查找索引在表扫描。看到第b.5.5,“优化问题”

  • 如果语句或事务表上的运行,并ANALYZE TABLE是运行在同一台再进行一次ANALYZE TABLE操作,第二ANALYZE TABLE操作被阻塞直到报表或交易完成。发生此行为的原因ANALYZE TABLE标志着当前加载的表定义为过时的时候ANALYZE TABLE完成后运行。新的报表或交易(包括二ANALYZE TABLE声明)必须加载新的表定义为表缓存,不能发生,直到目前运行报表或交易的完成和旧表的定义被清除。加载多个并发表定义是不支持的。

  • SHOW TABLE STATUS不提供准确的统计InnoDB表除物理尺寸由表保留。行计数仅用于SQL优化的粗略估计。

  • InnoDB不保持在一个表中的行数可能会因为内部事务看见同时行不同的号码。因此,SELECT COUNT(*)陈述只算行到当前事务可见。

    有关InnoDB过程select count(*)报表,请参阅COUNT()描述第12.19.1,“总(集团)功能描述

  • 在Windows,InnoDB在小写总是存储数据库和表的名称。移动数据库在从UNIX到Windows二进制格式或从Windows到Unix,创建数据库和表使用小写的名字。

  • 一个AUTO_INCREMENT专栏ai_col必须定义为一个指数,它是可能执行索引的等值部分选择最大(ai_col在查表获得最大的列值。通常,这是通过使列一些表索引的第一列实现。

  • InnoDB设置关联的指标最终独占锁汽车初始化时预先指定的列AUTO_INCREMENT在表列

    innodb_autoinc_lock_mode=0InnoDB使用一种特殊的AUTO-INC表锁模式锁的所在取得并持有到当前的SQL语句结束访问自动递增计数器而。其他客户不能插入表时auto-inc表锁。同样的行为发生批量插入innodb_autoinc_lock_mode=1。表级auto-inc锁是没有用的innodb_autoinc_lock_mode=2。有关更多信息,参见第15.8.1.5,”auto_increment InnoDB”处理

  • 当一个AUTO_INCREMENT整数列运行的值,随后插入操作返回重复键错误。这是一般的MySQL的行为。

  • DELETE FROM tbl_name不再生,而是删除表的所有行,一个接一个。

  • 级联外键动作不激活触发器。

  • 你不能创建一个列名称相匹配的内部名称表InnoDB柱(包括_分贝_ ROW IDDB_TRX_ID_辊_ PTR分贝,和DB_MIX_ID)。这个限制适用于在任何情况下使用字母的名字。

    MySQL的&#62;CREATE TABLE t1 (c1 INT, db_row_id INT) ENGINE=INNODB;结论:正确错误(4)列名“db_row_id”
锁定交易
  • LOCK TABLES获得每桌两锁如果innodb_table_locks=1(默认)。除了对MySQL层表锁,它还获得了InnoDB表锁。在没有获得MySQL版本4.1.2InnoDB表锁;旧的行为可以选择设置innodb_table_locks=0。如果没有InnoDB表锁了,LOCK TABLES完成即使一些表记录被其他事务锁定。

    在MySQL 5.0,innodb_table_locks=0没有效果明确锁定表LOCK TABLES ... WRITE。它有一个效果表锁定为读或写的LOCK TABLES ... WRITE隐式(例如,通过触发)或LOCK TABLES ... READ

  • 全部InnoDB由一个事务持有的锁被释放时,事务提交或中止。因此,它不调用多大意义LOCK TABLES打开(放)InnoDBautocommit=1因为收购模式InnoDB表锁将被立即释放

  • 你不能锁定附加表在一个事务中因为LOCK TABLES执行隐式COMMITUNLOCK TABLES

  • 对数据的修改交易的限制是96×1023并发事务产生撤销记录。32 128回滚段分配给非重做事务修改临时表和相关对象的日志。这意味着并发修改数据交易的最大数量是96K职业。96k的限制是交易不修改临时表。如果所有的数据修改事务也修改临时表,极限是32k并发事务。

15.8.2 InnoDB索引

本节涵盖的主题相关InnoDB指标

15.8.2.1聚集和次要指标

每一个InnoDB桌上有一个特殊的指数称为聚集索引其中的行的数据存储。通常,聚集索引的同义词主键。从查询,插入性能最好,和其他的数据库操作,你必须了解InnoDB使用聚集索引来优化每个表最常见的查询和DML操作。

  • 当你定义一个PRIMARY KEY在你的桌子上,InnoDB使用它作为聚集索引。定义一个主键的每个表的创建。如果没有逻辑的独特的和非空的列或列集,添加一个新的自增量列,其值是自动填充

  • 如果未定义PRIMARY KEY你的表,MySQL定位第一独特索引所有键列在哪里NOT NULLInnoDB使用它作为聚集索引

  • 如果表没有PRIMARY KEY或合适的独特指数,InnoDB在内部产生一个隐藏的聚集索引的命名gen_clust_index在合成塔含行ID值。行命令的IDInnoDB指定在这样的表中的行。行ID是一个6字节字段的单调增加,在插入新行。因此,由行ID命令行插入时的物理顺序。

如何聚集索引加快查询

通过聚簇索引访问行快,因为索引搜索直接导致页面的所有行的数据。如果表很大,聚集索引结构通常可以节省磁盘I/O操作相比,存储组织,使用从索引记录不同的页面存储行数据。

如何辅助索引与聚集索引

非聚集索引是所有索引次要指标。进入InnoDB在一次索引,每个记录包含该行的主键列,以及次级索引指定的列。InnoDB使用此主键值搜索的聚集索引中的行。

如果主键长,次要指标使用更多的空间,从而有利于有一个短的主键。

为准则,利用InnoDB聚集和二级指标,看8.3节,“优化指标”

15.8.2.2 InnoDB索引的物理结构

随着空间指标异常,InnoDB指标B-树数据结构。空间索引的使用R树,这是专门为多维数据的索引数据结构。索引记录存储在他们的树或树的数据结构的叶级页。一个索引页的默认大小为16KB。

当新的记录插入InnoDB聚集索引InnoDB试图离开1/16页的自由未来的插入与更新索引记录。如果索引记录的插入顺序(升序或降序),由此产生的索引页约15 / 16。如果记录被插入一个随机的顺序,页面是从1/2到15/16。

InnoDB执行大容量加载创建或重新生成索引时。这个索引创建的方法称为一个排序的索引构建。这个innodb_fill_factor配置选项定义空间的百分比在每个树页填充排序索引建立的过程,用剩余的空间留给未来的指数增长。排序的索引生成不支持空间索引。有关更多信息,参见第15.8.2.3,“分类指标”。一个innodb_fill_factor100叶簇自由未来的指数增长的索引页1/16的空间设置。

如果一个填充因子InnoDB索引页merge_threshold,默认值是50%如果没有指定,InnoDB从合同自由的网页索引树。这个merge_threshold设置适用于B-树和R-树索引。有关更多信息,参见第15.6.12,“配置合并阈值的索引页”

你可以定义页面大小所有InnoDB表空间在MySQL实例的设置innodb_page_size配置选项来初始化MySQL实例之前。一旦一个实例的页面大小是确定的,你不能改变它无需重新初始化实例。支持大小为32KB,64KB,16kb(默认),和4KB,8KB,相应的期权价值64K32k16k8k,和4k

使用特定的MySQL实例InnoDB页面大小不能使用数据文件或日志文件的一个实例,使用不同的页面大小。

15.8.2.3 sorted指数builds

InnoDB执行大容量加载而不是一次创建或重新生成索引时,插入一个索引记录。这一指标的创作方法也被称为一个排序的索引构建。排序的索引生成不支持空间索引。

有三个阶段的指标构建。在第一阶段,该聚集索引扫描,索引项是生成并添加到排序缓冲区。当排序缓冲区已满,条目排序并写入到一个临时中间文件。这个过程也被称为运行。在第二阶段,与一个或多个运行写入临时中间文件,归并排序是对文件中的所有条目进行。在第三和最后阶段,排序的条目插入B-树

对排序的索引生成出台之前,索引条目插入到B树一个记录一次使用插入的API。这个方法是打开一个树光标找到插入的位置,然后插入条目到一个B-tree页面使用乐观的插入。如果由于一个页面被完全插入失败,一悲观插入将被执行,其中涉及开放树光标拆分和合并的B树的节点作为必要找到入口空间。这种弊端自上而下的建立索引的方法是寻找插入位置和不断的分裂与合并的B树节点的成本。

Sorted Index Builds Use a自底向上构建指数的方法。通过这种方法,参考了最右叶页是各级B举行。在必要的B-树的深度最右叶页分配和条目插入按排序顺序。一页是满的,一个节点的指针是追加到父页面和同级叶页分配给下一个插入。这个过程一直持续到插入所有的条目,这可能导致在插入到基层。当兄弟姐妹页分配,到以前把叶页的引用被释放,和新分配的页成为最右叶页和新的默认插入的位置。

未来的指数增长树页预留空间

抛开对未来的指数增长的空间,你可以使用innodb_fill_factor配置选项保留树页空间的百分比。例如,设置innodb_fill_factor80储量的百分之二十的空间在B-tree页面排序索引构建。此设置适用于B-树叶与非叶级页。它不适用于用于外部页TEXTBLOB条目.那是保留的空间量未必完全一样的配置,为innodb_fill_factor值被解释为暗示而不是硬限制。

排序的索引建立全文索引支持

排序的索引生成支持全文索引。此前,SQL是用来插入条目到一个全文索引。

排序的索引生成和压缩表

压缩表创建索引的方法,以前的附加条目来压缩和未压缩的页面。当修改日志(代表压缩页面的自由空间)变得丰满,压缩页面将再压缩。如果由于缺乏空间压缩失败,页面会分裂。排序指标的建立,条目只追加到未压缩的页面。当一个未压缩的页面已满,这是压缩。自适应填充用于确保压缩成功在大多数情况下,如果压缩失败,页面分割和压缩是再次尝试。这个过程一直持续到压缩成功。关于B-树页压缩的更多信息,参见第15.9.1.5,“如何压缩InnoDB表”

排序的索引生成重做日志

重做日志禁用排序索引建立的过程。相反,有一个检查点确保索引建立能承受崩溃或失败。检查点的力量把所有脏页的磁盘。在排序索引的建立,页面干净线程信号定期冲洗脏页确保检查点操作可以快速处理。通常情况下,页面清洁螺纹冲脏页当干净的页面数量低于设定的阈值。排序的索引建立、脏页刷新及时减少检查点开销和I/O和CPU活动并行。

排序的索引建立和优化统计

排序的索引生成可能导致优化器不同于以往的创作方法生成的统计指标。在统计上的差异,并不会影响系统性能,是由于用于填充索引不同的算法。

15.8.2.4 InnoDB FullText指数

FULLTEXT基于文本的列上创建索引(CHARVARCHAR,或TEXT列)来帮助加快对包含在这些列的数据查询和DML操作,省略任何字被定义为构建。

FULLTEXT指标定义的一部分CREATE TABLE语句或添加到现有的表使用ALTER TABLECREATE INDEX

全文检索是通过使用MATCH() ... AGAINST语法。使用的信息,参见12.9节,“全文搜索功能”

InnoDB全文指标是本节中的以下主题下的描述:

InnoDB全文索引的设计

InnoDB全文索引的倒排索引的设计。倒排索引存储一个单词列表,并为每一个单词,一个文件的列表,这个词出现在。支持模糊查询,也存储为每个字的位置信息,作为一个字节偏移量。

Innodb full - text index tables

当创建一个InnoDB全文指数,一套索引表的创建,如下面的示例所示:

mysql> CREATE TABLE opening_lines (
       id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
       opening_line TEXT(500),
       author VARCHAR(200),
       title VARCHAR(200),
       FULLTEXT idx (opening_line)
       ) ENGINE=InnoDB;

mysql> SELECT table_id, name, space from INFORMATION_SCHEMA.INNODB_TABLES
       WHERE name LIKE 'test/%';
+----------+----------------------------------------------------+-------+
| table_id | name                                               | space |
+----------+----------------------------------------------------+-------+
|      333 | test/fts_0000000000000147_00000000000001c9_index_1 |   289 |
|      334 | test/fts_0000000000000147_00000000000001c9_index_2 |   290 |
|      335 | test/fts_0000000000000147_00000000000001c9_index_3 |   291 |
|      336 | test/fts_0000000000000147_00000000000001c9_index_4 |   292 |
|      337 | test/fts_0000000000000147_00000000000001c9_index_5 |   293 |
|      338 | test/fts_0000000000000147_00000000000001c9_index_6 |   294 |
|      330 | test/fts_0000000000000147_being_deleted            |   286 |
|      331 | test/fts_0000000000000147_being_deleted_cache      |   287 |
|      332 | test/fts_0000000000000147_config                   |   288 |
|      328 | test/fts_0000000000000147_deleted                  |   284 |
|      329 | test/fts_0000000000000147_deleted_cache            |   285 |
|      327 | test/opening_lines                                 |   283 |
+----------+----------------------------------------------------+-------+ 

第一表六个代表的倒排索引,称为辅助索引表。当传入的文件代号,个别单词(也被称为令牌)插入索引表连同位置信息和相关的文档ID(DOC_ID)。的话是完全分类的基础上划分了单词的第一个字符的字符集的排序权重的6索引表中。

倒排索引划分成六辅助索引表支持并行创建索引。默认情况下,两个线程标记、排序、插入文字和相关的数据的索引表。线程的数量是可配置的应用innodb_ft_sort_pll_degree选项考虑增加线程的数量在创建全文宽大的反射

辅助索引的表的名称前缀fts_固定带索引。每个索引表和索引表相关的十六进制值索引表中的名称相匹配的table_id该索引表。例如,在table_idtest/opening_lines三百二十七,这是0x147 HEX值。如前面的例子所示,该一百四十七十六进制值出现在有关联的索引表的名称test/opening_lines

一个十六进制值表示index_id全文指数也出现在辅助索引的表的名称。例如,在辅助表名称test/fts_0000000000000147_00000000000001c9_index_1,十六进制值1c9有一个小数价值457。在定义的索引opening_lines表(IDX)可以通过查询INFORMATION_SCHEMA.INNODB_INDEXES本表为value(457)。

MySQL的&#62;SELECT index_id, name, table_id, space from INFORMATION_SCHEMA.INNODB_INDEXESWHERE index_id=457;我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,

索引表是如果主表中创建一个存储在自己的表空间文件表表空间

在前面的示例中所示的其他索引表称为普通索引表和用于删除操作和储存的内部状态FULLTEXT指标。不同的倒排索引表,这是每个全文索引创建的,这套表是在一个特定的表创建全文索引常见。

常见的辅助表的全文索引保留即使下降。当一个全文索引是下降的FTS_DOC_ID列为创建的索引被保留,去除_ FTS _ doc ID柱需要重建表。常见的腋表都需要管理FTS_DOC_ID专栏

  • fts_*_deleted(FTS)* * * * * * * * * * * * * * * *

    包含文档ID(doc_id),删除,但其数据尚未从全文索引中删除文件。这个fts_*_deleted_cache是在记忆版fts_ * _deleted

  • fts_*_being_deletedfts_ * _being_deleted_cache

    包含文档ID(doc_id),被删除的数据正在被从全文索引删除程序文件。这个fts_*_being_deleted_cache表是在记忆版fts_ * _being_deleted

  • fts_*_config

    商店的内部状态的信息FULLTEXT指数最重要的是,它的商店fts_synced_doc_id,确定被解析并刷新到磁盘文件。崩溃恢复的情况下,FTS_SYNCED_DOC_ID值是用来确定尚未刷新到磁盘,文件可以重新解析和重新添加到文件全文索引缓存。这个表中查看数据,查询INFORMATION_SCHEMA.INNODB_FT_CONFIG

InnoDB全文索引缓存

当一个文件被插入,它是符号,和个别单词和相关的数据插入FULLTEXT指数这个过程中,即使很小的文件,可能会导致大量的小插入辅助索引表,使并发访问这些表的焦点。为了避免这个问题,InnoDB使用一个FULLTEXT暂时最近插入的行的索引表插入缓存索引缓存。这在内存中缓存结构持有插入到缓存已满,然后分批冲到磁盘(对辅助索引表)。你可以查询INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE表查看最近插入的行标记过的数据。

高速缓存和批量冲洗行为避免了频繁更新的辅助索引表,这可能会导致并发访问的问题在忙碌的插入和更新时间。配料技术也避免了多次插入同一个单词,并最大限度地减少重复的条目。而不是每个单词单独冲洗,因为一个单词插入合并刷新到磁盘作为一个单一的输入,提高效率的同时保持插入辅助索引表尽可能小。

这个innodb_ft_cache_size变量是用来配置全文索引缓存大小(以桌为单位),从而影响到全文索引缓存经常冲洗。你也可以定义一个全局的全文索引缓存大小限制在一个给定的实例的所有表的使用innodb_ft_total_cache_size选项

全文索引缓存中存储了相同的信息作为辅助索引表。然而,全文索引缓存的高速缓存标记过的数据最近插入的行。这已经刷新到磁盘中的数据(全文辅助表)不带回的全文索引时,查询缓存。在辅助索引表的数据直接查询,并从辅助索引表的结果进行合并,从全文索引缓存结果在返回之前。

InnoDB全文索引的文档ID和fts_doc_id柱

InnoDB使用一个唯一的文件标识符称为文档ID(DOC _ ID)图词在全文索引文件记录的地方出现的词。测绘的需要FTS_DOC_ID对索引表列。如果一个_ FTS _ doc ID柱没有定义,InnoDB自动添加一个隐藏的_ FTS _ doc ID全文索引创建列时。下面的示例演示此行为。

下表定义不包括FTS_DOC_ID专栏

MySQL的&#62;CREATE TABLE opening_lines (id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,opening_line TEXT(500),author VARCHAR(200),title VARCHAR(200)) ENGINE=InnoDB;

当你创建一个全文索引的表的使用CREATE FULLTEXT INDEX语法,警告还报道了InnoDB重建表添加FTS_DOC_ID专栏

MySQL的&#62;CREATE FULLTEXT INDEX idx ON opening_lines(opening_line);查询好,0行受影响,警告(0.19秒)记录:0 0副本:警告:1mysql &#62;SHOW WARNINGS;--------- ------ -------------------------------------------------- |水平|代码|消息| --------- ------ -------------------------------------------------- |警告| 124 | InnoDB表添加列fts_doc_id重建| --------- ------ --------------------------------------------------

同样的警告是返回时使用ALTER TABLE添加一个全文索引的表不有_ FTS _ doc ID专栏如果你创建一个全文索引在CREATE TABLE时间并没有指定_ FTS _ doc ID柱,InnoDB增加了一个隐藏的_ FTS _ doc ID柱,没有警告

定义一个FTS_DOC_IDCREATE TABLE时间比创建一个表,已加载数据的全文索引的便宜。如果一个_ FTS _ doc ID列在表加载数据之前定义的表及其索引不需要重建来添加新的列。如果你不关心CREATE FULLTEXT INDEX性能,离开了_ FTS _ doc ID柱有InnoDB创造了你InnoDB创建一个隐藏的FTS_DOC_ID随着一个唯一索引列(FTS ID ODS ID ID AIDS Index是的)FTS_DOC_ID专栏如果你想创建你自己的_ FTS _ doc ID列,列必须定义为BIGINT UNSIGNED NOT NULL和命名_ FTS _ doc ID(大写),如下面的例子:

笔记

这个FTS_DOC_ID列不需要被定义为一个汽车柱,但AUTO_INCREMENT可以加载数据更容易

MySQL的&#62;CREATE TABLE opening_lines (FTS_DOC_ID BIGINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,opening_line TEXT(500),author VARCHAR(200),title VARCHAR(200)) ENGINE=InnoDB;

如果你选择定义FTS_DOC_ID列你自己,你是负责管理以避免空或重复值的列。_ FTS _ doc ID值不能重复使用,这意味着FTS_DOC_ID值必须不断增加

或者,您可以创建所需的唯一FTS_DOC_ID_INDEX(全上的案例)_ FTS _ doc ID专栏

mysql> CREATE UNIQUE INDEX FTS_DOC_ID_INDEX on opening_lines(FTS_DOC_ID);

如果你不创造FTS_DOC_ID_INDEXInnoDB创建自动

笔记

FTS_DOC_ID_INDEX不能被定义为一个递减指数因为InnoDBSQL解析器不使用降序索引。

允许的最大的使用之间的差距FTS_DOC_ID价值和新_ FTS _ doc ID值为65535

为了避免重建表的FTS_DOC_ID柱被保留在删除全文索引。

InnoDB全文索引删除处理

删除记录,全文索引列会导致辅助索引表的许多小的缺失,使并发访问这些表的焦点。为了避免这个问题,文档ID(DOC_ID一个被删除的文件)被记录在一个特殊的fts_ * _deleted表时,记录从表中删除一个索引,索引记录和保留在全文索引。在返回的查询结果,信息在FTS_*_DELETED表是用来过滤掉删除文档ID。这种设计的好处是,缺失是快速和廉价的。缺点是索引的大小是不后立即删除记录减少。删除删除记录的全文索引、运行优化表对索引表innodb_optimize_fulltext_only=ON重建全文索引。有关更多信息,参见InnoDB全文索引优化

InnoDB全文索引事务处理

InnoDB全文由于它的缓存和批处理行为指标有特殊的事务处理特性。具体来说,在更新和插入FULLTEXT指标进行处理,在事务提交时,这意味着全文搜索只能看到提交的数据。下面的示例演示此行为。这个FULLTEXT搜索只返回一个结果后,插入线承诺。

MySQL的&#62;CREATE TABLE opening_lines (id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,opening_line TEXT(500),author VARCHAR(200),title VARCHAR(200),FULLTEXT idx (opening_line)) ENGINE=InnoDB;MySQL的&#62;BEGIN;MySQL的&#62;INSERT INTO opening_lines(opening_line,author,title) VALUES('Call me Ishmael.','Herman Melville','Moby-Dick'),('A screaming comes across the sky.','Thomas Pynchon','Gravity\'s Rainbow'),('I am an invisible man.','Ralph Ellison','Invisible Man'),('Where now? Who now? When now?','Samuel Beckett','The Unnamable'),('It was love at first sight.','Joseph Heller','Catch-22'),('All this happened, more or less.','Kurt Vonnegut','Slaughterhouse-Five'),('Mrs. Dalloway said she would buy the flowers herself.','Virginia Woolf','Mrs. Dalloway'),('It was a pleasure to burn.','Ray Bradbury','Fahrenheit 451');MySQL的&#62;SELECT COUNT(*) FROM opening_lines WHERE MATCH(opening_line) AGAINST('Ishmael');---------- |计数(*)| ---------- | 0 | ---------- MySQL &#62;COMMIT;MySQL的&#62;SELECT COUNT(*) FROM opening_lines WHERE MATCH(opening_line) AGAINST('Ishmael');---------- |计数(*)| ---------- | 1 | ----------
InnoDB全文监测指标

您可以监视和检查的特殊文本处理方面InnoDB全文通过查询以下指标INFORMATION_SCHEMA

您还可以查看基本信息FULLTEXT通过查询索引和目录INNODB_INDEXESINNODB_TABLES

有关更多信息,参见第15.14.4,“InnoDB information_schema全文索引表”

15.9 InnoDB表和网页压缩

本节提供了有关InnoDB表压缩InnoDB网页压缩功能。网页压缩功能也被称为透明页

使用压缩功能InnoDB,您可以创建表的数据是以压缩形式存储。压缩可以提高原料的性能和可扩展性。压缩意味着更少的数据磁盘和内存之间传输,占用较少的空间在磁盘和内存。好处是放大的表次要指标,因为索引数据压缩也。压缩可以是特别重要的SSD存储设备,因为他们往往有较低的容量比硬盘设备

15.9.1 InnoDB表压缩

本节介绍InnoDB表压缩,这是支持InnoDB表驻留在file_per_table表空间或禁忌将军。表压缩是启用使用ROW_FORMAT=COMPRESSED属性CREATE TABLEALTER TABLE

15.9.1.1概述表压缩

因为处理器和高速缓存存储器在速度超过磁盘存储设备的增加,许多工作负载磁盘绑定。数据压缩使较小的数据库的大小,减少I/O,提高吞吐量,在提高CPU利用率的小成本。压缩是读密集型应用特别有价值,有足够的RAM来保持经常使用的数据存储系统。

一个InnoDB表的创建ROW_FORMAT=COMPRESSED可以使用一个较小的页面大小在磁盘的配置比innodb_page_size价值。较小的页面需要更少的I/O读写磁盘,这是特别有价值的SSD设备

压缩页面的大小是指定的CREATE TABLEALTER TABLEkey_block_size参数.不同的页面大小要求表被放置在一个文件表表空间或一般的表空间而不是在系统表空间,为系统表空间不能存储压缩表。有关更多信息,参见第15.7.4“InnoDB文件,每个表的表空间”,和第15.7.10”一般,InnoDB表空间”

压缩的级别是一样的KEY_BLOCK_SIZE价值。当你指定较小的值key_block_size,你获得的I / O效益越来越小的页面。但如果你指定的值太小,有额外的开销整理网页时,数据不能压缩到足够多行,在每一页。有多小的硬限制KEY_BLOCK_SIZE可以为一个表,基于关键列的长度为各项指标。指定一个值太小,而CREATE TABLEALTER TABLE语句失败

在缓冲池中,压缩后的数据在小页面举行,一种基于页面大小KEY_BLOCK_SIZE价值。提取或更新的列的值,MySQL也创造了与未压缩的数据缓冲池中的一个未压缩的页面。缓冲池内,任何更新的未压缩的页面也重新写回等效压缩页。你可能需要你的缓冲池大小以容纳压缩和压缩页面的附加数据,虽然未经压缩的页面驱逐从缓冲池时,空间是必要的,然后在下次访问压缩。

15.9.1.2创建压缩表

压缩表可以创建文件表表空间或一般的表空间。表压缩是没有InnoDB系统片。SYSTEM表空间(空间的0,ibdata文件)可以包含用户创建的表,但它也包含了内部系统的数据,这是从来没有的压缩。因此,压缩仅适用于表(索引)存储在每个表或表空间文件。

创建一个压缩的表每表表空间

创建一个压缩文件中的每个表的表空间表,innodb_file_per_table必须启用(默认)。你可以在MySQL的配置文件设置此参数(my.cnfmy.ini)或动态,使用SET声明

innodb_file_per_table选项配置,指定ROW_FORMAT=COMPRESSED条款或KEY_BLOCK_SIZE这一条款,或在CREATE TABLEALTER TABLE语句创建一个压缩文件中的每个表的表空间表。

例如,你可以使用下面的语句:

SET GLOBAL innodb_file_per_table=1;
CREATE TABLE t1
 (c1 INT PRIMARY KEY)
 ROW_FORMAT=COMPRESSED
 KEY_BLOCK_SIZE=8;
创建一个压缩的表中的一个通用表

在一般的表空间创建一个压缩的表,FILE_BLOCK_SIZE必须为一般表空间的定义,并指定在表空间创建。这个file_block_size值必须是一个有效的压缩页面的大小的关系innodb_page_size价值,并且压缩表的页面大小,定义的CREATE TABLEALTER TABLEkey_block_size条款,必须等于FILE_BLOCK_SIZE/1024。例如,如果innodb_page_size=16384FILE_BLOCK_SIZE=8192,的KEY_BLOCK_SIZE该表必须是8。有关更多信息,参见第15.7.10”一般,InnoDB表空间”

下面的示例演示如何创建一个通用表和添加压缩表。这个例子假设默认innodb_page_size大学16kfile_block_size8192要求压缩表有KEY_BLOCK_SIZE8

MySQL的&#62;CREATE TABLESPACE `ts2` ADD DATAFILE 'ts2.ibd' FILE_BLOCK_SIZE = 8192 Engine=InnoDB;MySQL的&#62;CREATE TABLE t4 (c1 INT PRIMARY KEY) TABLESPACE ts2 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
笔记
  • 在MySQL 8,用于压缩的表的表空间文件使用的物理页面大小而创建的InnoDB页面大小,使空压表比在以前的MySQL释放表空间文件的初始大小。

  • 如果你指定ROW_FORMAT=COMPRESSED,你可以省略key_block_size;的KEY_BLOCK_SIZE设置默认值的一半innodb_page_size价值

  • 如果你指定一个有效的KEY_BLOCK_SIZE价值,可以省略ROW_FORMAT=COMPRESSED压缩是自动启用

  • 确定最佳值KEY_BLOCK_SIZE,通常你创建同一桌几份与此条款不同的值,然后测量所得到的尺寸鸡传染性法氏囊病文件和查看每个执行与现实工作量。对于一般的表空间,记住删除表不减少一般表空间的大小.ibd文件,也不能返回到操作系统的磁盘空间。有关更多信息,参见第15.7.10”一般,InnoDB表空间”

  • 这个KEY_BLOCK_SIZE价值作为一个提示;不同的大小可以用InnoDB如果需要的话。For File - per-table Tableaces,theKEY_BLOCK_SIZE只能小于或等于innodb_page_size价值。如果你指定一个值大于innodb_page_size值,指定的值将被忽略,一个警告,并key_block_size将一半的innodb_page_size价值。如果innodb_strict_mode=ON,指定一个无效的KEY_BLOCK_SIZE值返回一个错误。对于一般的表空间,有效key_block_size值取决于FILE_BLOCK_SIZE表空间的设置。有关更多信息,参见第15.7.10”一般,InnoDB表空间”

  • InnoDB支持为32K和64K的页大小,但这些页面大小不支持压缩。有关更多信息,请参阅innodb_page_size文档

  • 默认的压缩大小InnoDB数据网页16KB。根据期权价值的组合,MySQL使用1KB,2KB,4KB,8kb页面大小,16KB的表空间的数据文件(.ibd文件)。实际的压缩算法不受影响key_block_size价值;价值决定每个压缩块有多大,这反过来又影响了多少行可以装入每个压缩页。

  • 创建压缩表每表表空间文件时,设置KEY_BLOCK_SIZE等于InnoDB页面大小通常不在多,压缩效果。例如,设置KEY_BLOCK_SIZE=16通常不会造成多大的压缩,因为正常InnoDB页面大小为16KB。此设置还可以与许多长表是有用的BLOBVARCHARTEXT列,因为这样的价值观往往做压缩,因此可能需要更少的溢出页描述第15.9.1.5,“如何压缩InnoDB表”。For General Tableaces,aKEY_BLOCK_SIZE价值等于InnoDB页面大小是不允许的。有关更多信息,参见第15.7.10”一般,InnoDB表空间”

  • 一个表的所有指标(包括聚集索引)都使用相同的页面大小压缩,指定的CREATE TABLE修改表声明。表格的属性,如ROW_FORMATkey_block_size是不是部分的CREATE INDEX语法InnoDB表,并且如果他们指定的忽视(虽然,如果指定,它们将出现在输出SHOW CREATE TABLE声明)

  • 性能相关的配置选项,看第15.9.1.3,“调整压缩InnoDB表”

压缩表的限制
  • 压缩表不能存储在InnoDB系统表空间

  • 一般的表空间可以包含多个表,但压缩和非压缩表不能共存于相同的表空间。

  • 压缩应用于整个表和所有相关的指标,而不是个人的行,尽管条款名称ROW_FORMAT

  • InnoDB不支持压缩的临时表。什么时候innodb_strict_mode启用(默认),CREATE TEMPORARY TABLE如果返回错误ROW_FORMAT=COMPRESSEDKEY_BLOCK_SIZE指定。如果innodb_strict_mode是残疾人,发出警告和临时表是使用非压缩行格式创建。同样的限制适用于ALTER TABLE对临时表的操作

15.9.1.3调谐压缩InnoDB表

通常,进行内部优化InnoDB存储和数据压缩保证系统良好运行与数据压缩。然而,由于压缩的效率取决于你的数据的性质,可以使影响压缩性能的决策表:

  • 这是科普新闻

  • 什么压缩页面的大小使用。

  • 是否调整基于运行时的性能特性的缓冲池的大小,如时间系统花费的压缩与解压缩的数据量。工作量是否更像是一个数据仓库(主要是查询)或OLTP系统(组合查询和DML

  • 如果系统在压缩表执行DML操作,和数据的分配方式导致昂贵的压缩失败在运行时,你可能会调整额外的高级配置选项。

使用本节中的指南来帮助那些建筑和配置的选择。当你准备进行长期测试,把压缩表投入生产,看第15.9.1.4,“运行时”InnoDB表压缩监控在实际条件下验证这些选择效果的途径。

当使用压缩

在一般情况下,压缩效果最好的表,包括合理的字符串列的数量和数据读写的比它更经常的。因为没有保证的方法来预测是否一个特定的情况下压缩的好处,与一个特定的时刻考验工作量与数据集的有代表性的配置运行。考虑以下因素在决定压缩表。

数据特性和压缩

在减少数据文件的大小压缩效率的一个关键因素是数据本身的性质。记得,压缩工作确定在一个数据块的重复字符串的字节。完全随机的数据是最坏的情况下。典型的数据经常重复的值,所以压缩有效。字符串通常压缩,是否定义CHARvarcharTEXT斑点专栏另一方面,主要包含二进制数据表(整数或浮点数)或预先压缩的数据(例如JPEGPNG图像)可能不是一般的压缩,显著或根本。

你可以选择是否打开每个InnoDB表压缩。表及其所有指标使用相同的(压缩)页面大小。这可能是因为主键(聚)指数,其中包含的所有列一个表的数据,压缩比二级指标更有效。对于那些有长长的一排,利用压缩可能会导致很长的列值被存储下页,讨论第15.10.3,动态压缩行格式”。那些溢出页面压缩。鉴于这些因素,对于许多应用,一些表压缩比别人更有效,你可能会发现你的工作表现最好的只有一个子表压缩。

要确定是否压缩特定的表,进行实验。你可以得到一个粗略的估计,如何有效的数据可以通过使用一个工具,实现了LZ77压缩压缩(如gzipWinZip)或在一个copy of theIBD文件一个未压缩的表。你可以期望从一个MySQL表的压缩比的压缩工具压缩文件少,因为MySQL的基于块的数据压缩页面大小默认情况下,16kb。除了用户数据,网页格式包括一些内部系统数据不压缩。基于压缩程序可以检查更大的数据块文件,所以可能会在一个巨大的文件中找到更多的重复字符串比MySQL可以在单独的一页找到。

另一种方式来测试一个特定的表压缩是复制一些数据从您的未压缩的表类似,压缩表(具有所有相同的指标)在文件表表空间和看得到的大小.ibd文件。例如:

USE test;SET GLOBAL innodb_file_per_table=1;SET GLOBAL autocommit=0;-- Create an uncompressed table with a million or two rows.CREATE TABLE big_table AS SELECT * FROM information_schema.columns;INSERT INTO big_table SELECT * FROM big_table;INSERT INTO big_table SELECT * FROM big_table;INSERT INTO big_table SELECT * FROM big_table;INSERT INTO big_table SELECT * FROM big_table;INSERT INTO big_table SELECT * FROM big_table;INSERT INTO big_table SELECT * FROM big_table;INSERT INTO big_table SELECT * FROM big_table;INSERT INTO big_table SELECT * FROM big_table;INSERT INTO big_table SELECT * FROM big_table;INSERT INTO big_table SELECT * FROM big_table;COMMIT;ALTER TABLE big_table ADD id int unsigned NOT NULL PRIMARY KEY auto_increment;SHOW CREATE TABLE big_table\Gselect count(id) from big_table;-- Check how much space is needed for the uncompressed table.\! ls -l data/test/big_table.ibdCREATE TABLE key_block_size_4 LIKE big_table;ALTER TABLE key_block_size_4 key_block_size=4 row_format=compressed;INSERT INTO key_block_size_4 SELECT * FROM big_table;commit;-- Check how much space is needed for a compressed table-- with particular compression settings.\! ls -l data/test/key_block_size_4.ibd

这个实验产生了以下数字,这当然可以大大取决于你的表结构和数据变化:

-rw-rw----  1 cirrus  staff  310378496 Jan  9 13:44 data/test/big_table.ibd
-rw-rw----  1 cirrus  staff  83886080 Jan  9 15:10 data/test/key_block_size_4.ibd

是否压缩是有效的为您的特定工作量

应用数据库的压缩与压缩

决定是否在您的应用程序或表中数据压缩;不使用压缩类型相同的数据。当你将应用程序中的数据并将结果存储在一个压缩表,额外的节省空间,是非常不可能的,和双压缩是浪费CPU周期。

在数据库压缩

当启用时,MySQL表压缩是自动适用于所有列和索引值。列仍然可以与运营商如测试LIKE,和排序操作仍然可以使用指标即使指数值进行压缩。因为指标通常是一个数据库的总大小的一个重要部分,压缩可能会导致存储显著节省,I/O或处理器时间。压缩和解压缩操作发生在数据库服务器上,这可能是一个功能强大的系统,以承受预期的负荷。

在应用压缩

如果你压缩数据,如应用程序中的文本,然后插入到数据库中,你可以保存数据,没有压缩的压缩一些列而不是其他开销。这种方法使用的CPU周期用于在客户机上的压缩与解压缩而不是数据库服务器,这可能适合于分布式应用程序的许多客户,或在客户机有空闲的CPU周期。

混合的方法

当然,有可能将这些方法。对于某些应用,可适当使用一些压缩表和一些未压缩的表。这可能是最好的外部压缩一些数据(存储在压缩的表)和允许MySQL压缩(有些)应用程序中的其他表。一如既往的,前面的设计和实际测试的价值达到正确的决定。

负载特性和压缩

除了选择哪些表压缩(和页面大小),工作量是性能的另一个关键因素。如果应用程序主要是通过阅读,而不是更新,更少的页面需要重组和压缩索引页跑出房间每个页面后修改对压缩后的数据维护MySQL。如果更新主要变化非索引列的或含BLOB或大的字符串是存储下页,压缩的开销是可以接受的。如果只改变一个表INSERT的使用单调递增主键,有几次要指标,很少有需要重组和重新索引页。因为MySQL可以删除标记和删除页面行压缩在的地方通过修改原始数据,DELETE在一个表的操作都是比较有效的。

在某些环境中,需要将数据加载时间可以为运行时检索一样重要。尤其是在数据仓库环境中,多个表可以是只读或读为主。在这种情况下,它可能会或可能不会支付在负载增加的时间压缩的价格可接受,除非导致储蓄更少的磁盘读取或存储成本是显著的。

从根本上说,压缩效果最好时,CPU的时间用于压缩和解压数据。因此,如果你的工作量是I/O绑定,而不是CPU绑定的,你可能会发现,压缩可以提高整体性能。当你测试你的应用性能不同的压缩配置,在一个平台上类似于计划配置生产系统的测试。

形态特征和压缩

读写数据库网页并从磁盘系统性能最慢的方面。压缩试图减少I/O利用CPU时间压缩和解压缩数据,并且是最有效的当I/O与处理器周期相对稀缺的资源。

这是尤其如此,当运行在多用户环境下的快速、多核CPU。当一个页面一个压缩内存中表,MySQL通常使用额外的内存,通常16KB的缓冲池对于网页的一个未压缩的副本。自适应LRU算法试图平衡使用内存之间的压缩和非压缩的页面是否考虑到工作量是运行在一个I/O密集型或CPU绑定的方式。然而,一个更大的内存专用的缓冲池会更好时,使用压缩的表比配置内存的高度约束的配置。

选择压缩页面的大小

该压缩页面大小的最佳设置取决于,表及其索引包含的数据的类型和分布。压缩页面的大小应大于最大记录大小,或操作可能会失败,正如在B树的页面压缩

设置压缩页面尺寸太大,浪费空间,但网页没有被压缩为常。如果压缩页面大小设置得太小,插入或更新需要耗费时间的压缩,和B-树节点可以被分裂更加频繁,从而导致更大的数据文件和低效率的索引。

通常,你设置压缩页面的大小为8K或4K字节。鉴于一个InnoDB表的行大小的最大值是8K左右,KEY_BLOCK_SIZE=8他们通常是安全的

15.9.1.4 InnoDB表压缩在运行时监控

应用系统的整体性能,CPU和I/O利用率和磁盘文件的大小是很好的指标如何有效压缩是应用程序。这一部分是建立在性能调优建议第15.9.1.3,“调整压缩InnoDB表”,并展示如何发现可能不会出现在最初的测试问题。

深入挖掘压缩表性能的考虑,你可以监控的压缩性能,在运行时使用信息架构表中所描述的例15.1,“使用压缩信息架构表”。这些表反映内存的内部使用,压缩率采用整体。

这个INNODB_CMP表格报表信息为每个压缩页面的大小压缩活动(key_block_size)使用。这些表中的信息是系统范围:总结压缩统计所有压缩的表在数据库中。你可以使用这些数据来帮助决定是否压缩一个表通过检查这些表时没有其他压缩表被访问。它涉及到服务器上的相对较低的开销,所以你可能会质疑它定期在生产服务器上检查压缩特征的整体效率。

这个INNODB_CMP_PER_INDEX个人的表和索引压缩活动表报告信息。这一信息更具有针对性和评价的压缩效率和诊断性能问题,一次一个表或索引更有用。(因为每个InnoDB表是表示为一个聚簇索引,MySQL不在此上下文中的表和索引之间有很大的区别。)INNODB_CMP_PER_INDEX表需要大量的开销,所以开发服务器是比较适合的,在那里你可以比较不同的影响工作负载,数据,和孤立的压缩设置。防范实施监测开销意外,您必须启用innodb_cmp_per_index_enabled配置选项之前,您可以查询INNODB_CMP_PER_INDEX

考虑的关键统计数据的数量,和花费的时间执行,压缩与解压缩操作。因为MySQL的分裂B-树节点的时候他们太满含压缩数据修改后,数的比较成功的压缩操作数运算等整体。基于信息的INNODB_CMPINNODB_CMP_PER_INDEX表和应用的整体性能和硬件资源的利用率,你可以在你的硬件配置进行更改,调整缓冲池的大小,选择不同的页面大小,或选择压缩设置不同的表。

如果压缩和解压所需要的CPU时间量高,变化快、多核CPU可以使用相同的数据来提高性能,压缩表的应用程序的工作量和集。增加缓冲池的大小也有助于表现,让更多的未压缩的页面可以留在记忆里,减少了需要解压缩,只存在于内存中的页面压缩形式。

大量的压缩操作整体(人数比较INSERT更新DELETE在你的应用程序和数据库的大小操作)可能表明你的一些压缩表被更新太重的有效压缩。如果是这样的话,选择一个较大的页大小,或是更挑剔的表你压缩。

如果数成功的压缩操作(COMPRESS_OPS_OK)是压缩操作的总数的比例高(compress_ops),然后系统会表现良好。如果比率很低,那么MySQL是重组,压缩,和树节点的分裂往往是可取的。在这种情况下,避免压缩一些表,或增加KEY_BLOCK_SIZE对于一些压缩的表。你可能会关闭表,导致一些压缩压缩失败在将超过1%或2%申请总。(这样的失败率可能会暂时性的操作如数据加载过程中是可以接受的)。

15.9.1.5如何压缩工作InnoDB表

本节描述了一些内部的实现细节压缩InnoDB表。这里提供的信息可能在调谐性能是有益的,但没有必要知道压缩的基本使用。

压缩算法

一些操作系统实现压缩在文件系统层。文件通常分为固定大小的块,压缩成可变大小的块,这很容易导致成碎片。每一次有块内被修改,整个街区被压缩之前被写入到磁盘。这些特性使得这种压缩技术不适合于频繁更新的数据库系统。

MySQL实现了与知名的帮助压缩zlib库,它实现了LZ77压缩算法。这种压缩算法是成熟的,强大的,高效的CPU利用和数据大小。该算法无损,所以未压缩的原始数据可以从压缩的形式重建。LZ77压缩的作品,多次在数据被压缩数据序列的发现。在你的数据值的方式确定其压缩,但是压缩的典型用户数据通常由50%个或更多。

笔记

InnoDB支持zlib图书馆的最高版本为刃,这是捆绑MySQL 8版本。

不同的应用程序进行压缩,或者一些其他的数据库管理系统的压缩功能,InnoDB压缩既适用于用户数据和指标。在许多情况下,指标可以构成40-50%以上的总数据库的大小,所以这种差异显著。当压缩的工作以及一个数据集,对InnoDB数据文件的大小(的文件表表空间或一般的表空间.idb文件)是25百分之五十的未压缩的大小或更小的。根据工作量,这个较小的数据库会导致减少I / O,并增加吞吐量,在一个适度的成本在提高CPU利用率方面。你可以调整平衡压缩级别和CPU开销通过修改innodb_compression_level配置选项

InnoDB存储和数据压缩

在InnoDB表中的所有用户数据存储在页包括B-树指数(The聚集索引)。在其它的数据库系统,这种类型的索引被称为索引组织表。在索引节点中的每行包含的值(用户指定或系统生成的)主键和所有其它表的字段

次要指标在InnoDB表也树,含值对:索引键和一个指向的聚集索引中的行。指针在事实表的主键的值,这是用来如果比其他的索引键和主键列的聚集索引需要访问。辅助索引记录必须适合于一个单一的树页。

B树节点的压缩(包括集群和次要指标)是不同的压缩处理溢出页用于存储长VARCHAR斑点,或TEXT列在下面的章节中解释。

B树的页面压缩

因为他们是经常更新的,树页需要特殊治疗。这是减少次B-树的节点数重要的分裂,以及最大限度地减少需要解压缩和再压缩的内容。

一个技术MySQL使用是在未压缩的形式在B树节点维护的一些系统信息,从而有利于在一定地方更新。例如,这使行被删除标记和删除没有任何压缩操作。

此外,MySQL试图避免不必要的解压缩和再压缩索引页的时候都改变了。在每个树的页面,系统保持一个未压缩修改日志记录对页面变化。更新和小记录插入可写入此修改日志不需要整个页面被完全重建。

当修改日志空间耗尽,InnoDB解压页面,应用的变化和再压缩页面。如果再失败(这种情况称为压缩破坏),B树节点的分裂和重复的过程更新或插入直到成功。

为了避免频繁的压缩失败在写密集型工作负载,如OLTP应用MySQL有时保留一些空间(填充)的页面,从而修改日志填满一页被压缩的同时,仍有足够的空间来避免分裂。填充空间的数量在每一页的左随系统跟踪页面的频率分裂。在一个繁忙的服务器做频繁写入压缩表,你可以调整innodb_compression_failure_threshold_pct,和innodb_compression_pad_pct_max配置选择此机制的选项。

一般来说,需要在一个MySQL InnoDB表每个树页可以容纳至少两个记录。压缩表,这个要求已经放松。B树节点页(不管是主键或次要指标)只需要容纳一条记录,但记录必须配合,在未压缩的形式,在每一页修改日志。如果innodb_strict_mode打开(放),MySQL检查行大小的最大值在CREATE TABLECREATE INDEX。如果行不适合,下面发出错误信息:错误hy000:太大的行

如果你创建一个表时innodb_strict_mode是关闭的,和随后的插入UPDATE声明试图创建一个索引条目,不适合在压缩页面的大小,操作失败错误42000:排尺寸太大。(这个错误信息没有名字的指数,记录太大,或提及的索引记录或对特定的索引页。最大记录长度的大小)来解决这一问题,重建表ALTER TABLE选择一个较大的压缩页面的大小(key_block_size),缩短任何列前缀索引,或完全禁用压缩ROW_FORMAT=DYNAMICROW_FORMAT=COMPACT

innodb_strict_mode不适用于一般的表空间,这也支持压缩的表。对于一般的表空间,表空间管理制度严格执行独立innodb_strict_mode。有关更多信息,参见第13.1.19,“创建表的语法”

压缩的blob,VARCHAR和文本列

在InnoDB表,BLOBVARCHAR,和TEXT那不是主键的列可以存储在单独的分配溢出页。我们把这些列为关闭网页栏目。他们的值存储在单链表的溢出页。

为表创建ROW_FORMAT=DYNAMICROW_FORMAT=COMPRESSED,价值观BLOBTEXT,或VARCHAR列可以存储完全关闭页面,根据它们的长度和整行的长度。对于存储页列的聚集索引记录只包含20字节的指针溢出页面,每一个柱。列是否存储页取决于页面大小和行的总大小。如果行太长完全适合在聚集索引页,MySQL选择长柱关闭页面存储到行适合在聚集索引页。如上所述,如果行不适合本身在压缩页面,出现错误。

笔记

为表创建ROW_FORMAT=DYNAMICROW_FORMAT=COMPRESSEDTEXTBLOB列是小于或等于40字节始终存储在。

表使用ROW_FORMAT=REDUNDANTROW_FORMAT=COMPACT商店的前768个字节BLOBVARCHAR,和TEXT随着主键列的聚集索引中的记录。768字节的前缀,后跟一个20字节的指针,包含的列的值,其余的溢出页。

当一个表中COMPRESSED格式,所有数据写入溢出页面压缩如是;即MySQL使用zlib压缩算法对整个数据项。除了数据,压缩溢出页中包含的未压缩头和包括页面校验和链接到下一页溢出的拖车,在其他事情上。因此,非常重要的存储可以得到节省时间BLOB文本,或VARCHAR列,如果数据是高度可压缩的,通常是为文本数据。图像数据,如JPEG,通常是已经压缩,所以不被存储在一个压缩表多效益;双压缩可以浪费CPU周期很少或根本没有节省空间。

溢出页大小相同的其他页面。一行包含十列存储页占十溢出页,即使列的总长度仅为8K字节。在一个未压缩的表,十的未压缩的溢出页占用160k字节。在一个压缩的表和一个8K的页大小,他们只占80K字节。因此,它往往是使用压缩的表格式的长列值表更有效。

文件表表空间,使用一个16K压缩页面的大小可以减少存储和I/O成本BLOBVARCHAR,或TEXT列,因为这样的数据压缩,因此可能需要更少的溢出页,即使B树节点本身采取许多页的压缩形式。一般的表空间不支持一个16K压缩页面的大小(key_block_size)。有关更多信息,参见第15.7.10”一般,InnoDB表空间”

压缩和InnoDB缓冲池

在压缩InnoDB表,每个压缩页面(无论是1K,2K,4K或8K)对应于16K字节未压缩的页面(或一个较小的尺寸,如innodb_page_size是集)。访问一个页面的数据,MySQL从磁盘读取压缩页如果它已经不在缓冲池,然后解压页面以其原始形式。本节介绍了如何InnoDB管理缓冲池相对于压缩表页。

为了减少I/O和减少需要解压缩一个网页,有时缓冲池包含压缩和非压缩形式的数据库页。给其他需要的数据库页的房间,MySQL可以驱逐从缓冲池未压缩的页面,而压缩内存页面。或者,如果一个页面没有被访问过,页面的压缩形式可能被写入磁盘,以自由空间为其他数据。因此,在任何给定的时间,缓冲池可能包含压缩和非压缩形式的页面,或只压缩形式的网页,或不。

MySQL跟踪哪些页面在内存中保留并驱逐使用最近最少使用(LRU)列表,以便(经常访问的)数据往往会留在记忆里。当压缩表的访问,MySQL使用自适应LRU算法实现压缩和未压缩的页面在内存中一个适当的平衡。该算法是系统是否运行在一个敏感的I/O密集型CPU绑定的方式。我们的目标是避免花费太多的处理时间压缩页当CPU繁忙,并避免做过量的I / O时,CPU的空闲周期,可用于解压缩压缩页(可能已经在内存中)。当系统I/O限制,算法倾向于驱逐一页的未压缩的副本而不是副本,以使其他的磁盘页成为常驻内存空间。当系统CPU绑定的,MySQL喜欢驱逐的压缩和非压缩的网页,让更多的内存可用于页面和减少需要解压缩数据在内存中只以压缩形式。

压缩和InnoDB重做日志文件

在一个压缩的页面写入数据文件,MySQL写页面的副本到重做日志(如果它已经被压缩自上次写入数据库)。这是为了确保重做日志是可用的崩溃恢复,即使在不太可能的情况下,zlib图书馆的升级和改变了一个压缩数据的兼容性问题。因此,一些在大小增加日志文件,或需要更频繁检查站,可以预期当使用压缩。在日志文件大小或检查点的频率增加的数量取决于次压缩页面的数目都是需要重组和压缩性。

创建一个压缩文件中的每个表的表空间表,innodb_file_per_table必须启用。上没有依赖innodb_file_per_table设置当创建一个压缩的表中的一个通用表。有关更多信息,参见第15.7.10”一般,InnoDB表空间”

15.9.1.6压缩OLTP工作负载

传统上,这InnoDB压缩特征主要为只读或读大多推荐工作负载,如在数据仓库构型。The Rise ofSSD存储设备,这是快速但比较小,价格昂贵,使得压缩的吸引力也OLTP工作量:交通流量大的网站,可以减少存储需求和I/O操作每秒(IOPS)利用压缩表,频繁的应用INSERTUPDATE,和DELETE运营

这些配置选项可以让你调整压缩为一个特定的MySQL实例的方式,对性能和可伸缩性的强调写密集型操作:

  • innodb_compression_level让你把压力上升或下降的程度。较高的值可以容纳更多的数据到一个存储设备,在更多的CPU开销的费用在压缩。一个较低的值可以减少CPU开销在存储空间并不重要,或者你期望的数据是不可压缩的。

  • innodb_compression_failure_threshold_pct指定一个截止点压缩失败在更新到一个压缩的表。当通过此阈值,MySQL开始在每一个新的压缩页面留下更多的自由空间,动态调整量的自由空间到页面大小指定的百分比innodb_compression_pad_pct_max

  • innodb_compression_pad_pct_max让你调整最大金额的预留空间,在每个网页记录压缩的行,而不需要再压缩整个页面。更高的价值,更可以记录变化没有recompressing页。MySQL使用自由空间变量的金额为每个压缩表内页,只有当指定的比例压缩操作失败在运行时,需要一个昂贵的操作拆分压缩页。

  • innodb_log_compressed_pages让你禁用图片写作再compressed网页重做日志文件。重新压缩时可能发生的变化对压缩后的数据。这个选项是默认启用的预防腐败可能发生的,如果一个不同版本的zlib压缩算法应用在恢复。如果你是肯定的zlib版本将不会改变,禁用innodb_log_compressed_pages为了减少工作量,修改压缩数据重做日志生成。

因为压缩数据的工作有时是保持压缩和未压缩版本的内存页的同时,当使用OLTP方式工作量压缩,准备增加的价值innodb_buffer_pool_size配置选项

压缩15.9.1.7 SQL语法的警告和错误

本节描述语法的警告和错误,你可能会遇到使用表压缩特征时文件表表空间和一般的表空间

文件压缩合成器与误差

什么时候innodb_strict_mode启用(默认),指定ROW_FORMAT=COMPRESSEDKEY_BLOCK_SIZE进入CREATE TABLEALTER TABLE报表产生下面的错误如果innodb_file_per_table被禁用

错误1031(hy000):“T1”不表的存储引擎有这个选项
笔记

桌子不是当前配置不允许使用压缩的表创建。

什么时候innodb_strict_mode是残疾人,指定ROW_FORMAT=COMPRESSEDKEY_BLOCK_SIZE进入CREATE TABLEALTER TABLE报表产生以下警告如果innodb_file_per_table被禁用

MySQL的&#62;SHOW WARNINGS;+---------+------+---------------------------------------------------------------+| Level   | Code | Message                                                       |+---------+------+---------------------------------------------------------------+| Warning | 1478 | InnoDB: KEY_BLOCK_SIZE requires innodb_file_per_table.        || Warning | 1478 | InnoDB: ignoring KEY_BLOCK_SIZE=4.                            || Warning | 1478 | InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_per_table. || Warning | 1478 | InnoDB: assuming ROW_FORMAT=DYNAMIC.                          |+---------+------+---------------------------------------------------------------+
笔记

这些消息只是警告,没有错误,并创建了表无压缩,如果选择不指定。

这个非严格行为让你导入mysqldump文件导入到数据库,不支持压缩表,即使包含源数据库压缩表。在这种情况下,MySQL创建表ROW_FORMAT=DYNAMIC而不是防止操作

到转储文件导入到新的数据库,并创建了他们存在原始数据库中的表,确保服务器的设置正确innodb_file_per_table配置参数

属性KEY_BLOCK_SIZE只允许在row_format被指定为COMPRESSED或是omitted。指定akey_block_size与任何其他ROW_FORMAT生成一个警告,你可以看显示警告。然而,表是非压缩;指定KEY_BLOCK_SIZE被忽略)

水平代码消息
警告一千四百七十八 InnoDB: ignoring KEY_BLOCK_SIZE=n unless ROW_FORMAT=COMPRESSED.

如果你正在运行innodb_strict_mode启用,一个组合key_block_size与任何ROW_FORMAT其他比压缩的产生一个错误,不是一个警告,而不是创建表。

表15.9,“row_format和key_block_size选项”提供了一个概述ROW_FORMATkey_block_size选项,用于CREATE TABLEALTER TABLE

表row_format 15.9%和key_block_size选项

选项使用说明描述
ROW_FORMAT=?REDUNDANT存储格式用于MySQL 5.0.3之前效率较低的比ROW_FORMAT=COMPACT;向后兼容
ROW_FORMAT=?COMPACT默认存储格式自从MySQL 5.0.3商店在聚集索引页的前缀768字节长的列值,用剩余的字节存储在溢出页
ROW_FORMAT=?DYNAMIC将值存储在聚簇索引页是否适合;如果没有,只存储一个20字节的指针指向一个溢出页(没有前缀)
ROW_FORMAT=?COMPRESSED在表和索引使用zlib压缩
KEY_BLOCK_?SIZE=n指定的1、2、4压缩页面的大小、8或16字节;暗示ROW_FORMAT=COMPRESSED。一般的表空间,key_block_size价值等于InnoDB二)允许的页大小的冰槽。

表15.10%,“创建/修改表的警告和错误当InnoDB严格模式”总结了错误发生的条件和配置参数和选项的某些组合CREATE TABLEALTER TABLE报表,以及如何选择出现在输出显示表状态

什么时候innodb_strict_mode关闭创建或更改表,MySQL,但忽略了某些设置如下图所示。你可以看到警告消息在MySQL错误日志。什么时候innodb_strict_mode打开(放),这些指定的组合的选择产生的错误,而不是创建或修改表。看到的错误条件的完整描述、问题SHOW ERRORS语言:实例:

MySQL的&#62;CREATE TABLE x (id INT PRIMARY KEY, c INT)
-&#62;ENGINE=INNODB KEY_BLOCK_SIZE=33333;
错误1005(hy000):无法创建表测试。X”(错误:1478)MySQL &#62;SHOW ERRORS;+-------+------+-------------------------------------------+| Level | Code | Message                                   |+-------+------+-------------------------------------------+| Error | 1478 | InnoDB: invalid KEY_BLOCK_SIZE=33333.     || Error | 1005 | Can't create table 'test.x' (errno: 1478) |+-------+------+-------------------------------------------+

表15.10创建/修改表的警告和错误当InnoDB严格模式关闭

语法警告或错误条件造成ROW_FORMAT,如图所示显示表状态
ROW_FORMAT=REDUNDANTREDUNDANT
ROW_FORMAT=COMPACTCOMPACT
ROW_FORMAT=COMPRESSEDROW_FORMAT=DYNAMICKEY_BLOCK_SIZE指定每个表的表空间文件除非忽略innodb_file_per_table启用。一般表空间支持所有的行格式。看到第15.7.10”一般,InnoDB表空间”the default row format for file-per-table tablespaces; the specified row format for general tablespaces
无效KEY_BLOCK_SIZE指定(不是1,2,4,8或16)KEY_BLOCK_SIZE被忽略指定行的格式,或默认行格式
ROW_FORMAT=COMPRESSED有效的key_block_size指定没有;KEY_BLOCK_SIZE指定使用COMPRESSED
KEY_BLOCK_SIZE是指定冗余COMPACT动态行格式KEY_BLOCK_SIZE被忽略REDUNDANT粉盒DYNAMIC
ROW_FORMAT是不是一个冗余COMPACT动态COMPRESSED如果由MySQL解析器被忽视。否则,就会发出一个错误。默认的行格式或N / A

什么时候innodb_strict_mode打开(放)反对无效,MySQLROW_FORMATkey_block_size参数错误和问题。严格的模式ON默认情况下。什么时候innodb_strict_modeOFFMySQL的问题,而不是忽略警告无效的参数错误。

这是不可能看到的选择KEY_BLOCK_SIZE使用显示表状态。声明SHOW CREATE TABLE显示key_block_size(即使它被忽略在创建表时)。真正的压缩页面大小的表无法显示的MySQL。

SQL压缩语法警告和错误一般表空间
  • 如果FILE_BLOCK_SIZE不是一般的表空间定义在表空间创建表空间不能包含压缩表。如果你想添加一个压缩表,返回一个错误,如下面的示例所示:

    MySQL的&#62;CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB;MySQL的&#62;CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=COMPRESSEDKEY_BLOCK_SIZE=8;错误1478(hy000):InnoDB表空间TS1:` `不能包含一个压缩的表
  • 试图添加一个无效的表KEY_BLOCK_SIZE一个总的表空间返回一个错误,如下面的示例所示:

    MySQL的&#62;CREATE TABLESPACE `ts2` ADD DATAFILE 'ts2.ibd' FILE_BLOCK_SIZE = 8192 Engine=InnoDB;MySQL的&#62;CREATE TABLE t2 (c1 INT PRIMARY KEY) TABLESPACE ts2 ROW_FORMAT=COMPRESSEDKEY_BLOCK_SIZE=4;错误1478(hy000):InnoDB:表空间` TS2 `采用块大小为8192 cannotcontain物理页面大小4096桌

    表空间(tablespace)for general,theKEY_BLOCK_SIZE该表必须是相等的file_block_size该表分为1024。例如,如果FILE_BLOCK_SIZE该表空间的8192,key_block_size该表必须是8

  • 试图添加一个压缩行格式一般表空间用于存储压缩表表返回一个错误,如下面的示例所示:

    mysql> CREATE TABLESPACE `ts3` ADD DATAFILE 'ts3.ibd' FILE_BLOCK_SIZE = 8192 Engine=InnoDB;
    
    mysql> CREATE TABLE t3 (c1 INT PRIMARY KEY) TABLESPACE ts3 ROW_FORMAT=COMPACT;
    ERROR 1478 (HY000): InnoDB: Tablespace `ts3` uses block size 8192 and cannot
    contain a table with physical page size 16384

innodb_strict_mode不适用于一般的表空间。对于一般的表空间,表空间管理制度严格执行独立innodb_strict_mode。有关更多信息,参见第13.1.19,“创建表的语法”

有关使用压缩表与一般的表空间的更多信息,参见第15.7.10”一般,InnoDB表空间”

15.9.2 InnoDB页面压缩

InnoDB支持表驻留在页面级压缩文件表表空间。此功能称为透明页面压缩。网页压缩是启用的指定COMPRESSION属性CREATE TABLEALTER TABLE。支持的压缩算法包括zlibLZ4

支持的平台

网页压缩需要稀疏文件和支持打孔。网页压缩支持Windows NTFS,并且在接下来的MySQL支持Linux平台的内核级提供冲孔支持子集:

  • RHEL 7和来源的分布,使用的内核版本3.10.0-123或更高

  • 有机电致发光(uek2)内核版本5.10或更高2.6.39

  • OEL 6.5(uek3)内核版本3.8.13或更高

  • OEL 7内核版本3.8.13或更高

  • sle11 3.0-x内核版本

  • sle12 3.12-x内核版本

  • 3.0-x oes11内核版本

  • 14.0.4 LTS Ubuntu内核版本3.13或更高版本

  • 12.0.4 LTS Ubuntu内核版本3.2或更高版本

  • Debian 7内核版本3.2或更高版本

笔记

所有可用的文件系统,对于一个给定的Linux发行版本可能不支持打孔。

如何压缩网页作品

当一页写的是,它是使用指定的压缩算法压缩。压缩后的数据写入磁盘,在冲孔机构发布的空块从该页的结束。如果压缩失败,数据被写为。

孔的大小对Linux

在Linux系统中,文件系统的块大小是用于冲孔单元尺寸。因此,网页压缩仅在页面的数据可以被压缩到一个大小是小于或等于InnoDB页面大小减去文件系统的块大小。例如,如果innodb_page_size=16K和文件系统的块大小为4K,页面数据必须压缩到小于或等于12K到使冲孔的可能。

孔的大小在Windows

在Windows系统中,稀疏文件的底层基础设施是基于NTFS压缩。冲孔尺寸是NTFS压缩单元,这是16倍的NTFS的簇大小。簇的大小和压缩单位如下表所示:

表15.11 Windows NTFS的簇大小和压缩机组

簇的大小压缩机组
512字节8 KB
1 KB16 KB的
2 KB32 KB
4 KB64 KB

在Windows系统的网页压缩仅在页面的数据可以被压缩到一个大小是小于或等于InnoDB页面大小减去压缩单元大小。

默认NTFS的簇大小是4K,该压缩单元大小是64K。这意味着页面压缩不利于一个开箱Windows NTFS配置,为最大innodb_page_size也64k

网页压缩工作在Windows文件系统必须与团簇的尺寸小到4K的创建,和innodb_page_size必须压缩单元尺寸的至少两次。例如,页面压缩工作在Windows,你可以建立一个512字节的簇大小的文件系统(其中有一个8KB的压缩单元)和初始化InnoDB一个innodb_page_size16K或更大的价值

使页面压缩

为了使网页压缩,指定COMPRESSION属性在CREATE TABLE声明。例如:

CREATE TABLE t1 (c1 INT) COMPRESSION="zlib";

你也可以使一个页面压缩ALTER TABLE声明。然而,ALTER TABLE ... COMPRESSION只更新表空间的压缩属性。写后发生的表空间设置新的压缩算法,使用新的设置,但应用新的压缩算法,对现有的页面,你必须重建表使用OPTIMIZE TABLE

ALTER TABLE t1 COMPRESSION="zlib";OPTIMIZE TABLE t1;

禁用页面压缩

禁用页面压缩,设置COMPRESSION=None使用ALTER TABLE。写这个表空间设置后出现COMPRESSION=None不再使用网页压缩。解压缩现有页面,你必须重建表使用OPTIMIZE TABLE在设置COMPRESSION=None

ALTER TABLE t1 COMPRESSION="None";
OPTIMIZE TABLE t1;

网页压缩元数据

网页压缩元数据中发现INFORMATION_SCHEMA.INNODB_TABLESPACES表,在下面的列:

  • FS_BLOCK_SIZE文件系统:the block size,which is the unit size used for孔穿孔。

  • FILE_SIZE:文件的大小,它代表了文件的最大大小,压缩。

  • ALLOCATED_SIZE“The actual size of the file,which is the amount of space alloated on disk .”

笔记

在类Unix系统,ls -l tablespace_name.ibd显示明显的文件大小(相当于file_size在字节)。要查看实际量的空间分配磁盘(相当于ALLOCATED_SIZE),使用du --block-size=1tablespace_name.ibd。这个--block-size=1选择打印分配空间字节代替块,以便它可以比较ls -l输出

使用SHOW CREATE TABLE查看当前页面压缩设置(zlibLz4,或)。一个表可以包含混合了不同的压缩设置页面。

在下面的示例中,对于员工表页面压缩元数据提取INFORMATION_SCHEMA.INNODB_TABLESPACES

# Create the employees table with Zlib page compressionCREATE TABLE employees (    emp_no      INT             NOT NULL,    birth_date  DATE            NOT NULL,    first_name  VARCHAR(14)     NOT NULL,    last_name   VARCHAR(16)     NOT NULL,    gender      ENUM ('M','F')  NOT NULL,      hire_date   DATE            NOT NULL,    PRIMARY KEY (emp_no)) COMPRESSION="zlib";# Insert data (not shown)  # Query page compression metadata in INFORMATION_SCHEMA.INNODB_TABLESPACES  mysql>SELECT SPACE, NAME, FS_BLOCK_SIZE, FILE_SIZE, ALLOCATED_SIZE FROMINFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME='employees/employees'\G*************************** 1。行***************************空间:45name:员工/ employeesfs_block_size:4096file_size:23068672allocated_size:19415040

对于员工表页面压缩元数据显示明显的文件大小是23068672字节,文件的实际大小(网页压缩)是19415040字节。文件系统的块大小是4096字节,这是用于冲孔的块大小。

网页压缩的局限性和使用说明

  • 网页压缩被禁用,如果文件系统的块大小(或Windows压缩单元尺寸)* 2 &#62;innodb_page_size

  • 网页压缩不是驻留在共享表空间,表支持,包括系统表空间,临时表空间,和一般的表空间。

  • 网页压缩不撤销表空间支持日志。

  • 网页压缩不支持日志页。

  • R树的页面,这是用于空间索引,不压缩。

  • 属于压缩表页(ROW_FORMAT=COMPRESSED)留下的是

  • 在恢复过程中,更新页面写入非压缩格式。

  • 加载一个页面压缩空间的服务器上不支持压缩算法被用来使I/O错误。

  • 在降级到较早版本的MySQL不支持网页压缩,解压缩,使用页面压缩功能表。解压缩一个表,运行ALTER TABLE ... COMPRESSION=NoneOPTIMIZE TABLE

  • 页面压缩的表空间可以复制Windows和Linux服务器之间如果压缩算法被用来提供服务器。

  • 保存网页压缩时压缩空间移动页面文件从一个主机到另一个需要保留稀疏文件的效用。

  • 更好的网页压缩可实现对Fusion-io的硬件nvmfs比在其他平台上,为nvmfs利用冲孔功能。

  • 使用页面压缩功能与大InnoDB页面大小和相对较小的文件系统块的大小可能会导致写入放大。例如,一个最大的InnoDB有一个4KB的文件系统的块大小64KB页面可以提高压缩也可以增加缓冲池的需求,从而增加了I / O和潜在的写入放大。

15.10 InnoDB行存储和列格式

本节讨论InnoDB特征如表压缩,从长可变长度列值的页面存储,和大的前缀索引的行格式控制InnoDB表还讨论了考虑选择合适的行和列格式,格式之间的兼容性MySQL版本。

15.10.1概述InnoDB的行存储

行与列存储查询和DML操作性能的影响。随着越来越多的排放进一个单一的磁盘网页、查询和索引查找可以工作得更快,更少的内存缓存是InnoDB缓冲池中的需要,和更少的I/O要求写出更新的数字和短字符串列的值。

在每个InnoDB表的数据分网页。构成每个表页面被安排在一个树的数据结构称为平衡树索引。表格数据次要指标使用这种类型的结构。代表整个表B树索引被称为聚集索引,这是根据组织主键专栏索引的数据结构的节点包含该行中的所有列的值(对于聚集索引)或索引列和主键列(二级指标)。

可变长度列是一个例外。列如BLOBvarchar这是太长时间放在树页存储在单独的页面称为分配的磁盘溢出页。我们称这样的列关闭网页栏目。这些列的值存储在单链表溢出页,和每一列都有自己的一个或多个溢出页面列表。在某些情况下,所有或前缀的长列的值是存储在B树中,以避免浪费存储和消除需要读取一个单独的页面。

以下各节描述如何配置行格式InnoDB表控制可变长度列值存储。行格式的配置也决定了可用性表压缩特征和大的索引键前缀支持。

15.10.2指定行的格式表

默认的行格式定义innodb_default_row_format,其中有一个默认值动态. 错误的思路格式是在发生的时候使用的。ROW_FORMAT表选项没有明确定义或当ROW_FORMAT=DEFAULT指定

一个表的行格式可以定义显式使用ROW_FORMAT表中的选项CREATE TABLEALTER TABLE声明。例如:

CREATE TABLE t1 (c1 INT) ROW_FORMAT=DYNAMIC;

一个明确的定义ROW_FORMAT设置重写默认。指定ROW_FORMAT=DEFAULT相当于使用隐式的默认。

这个innodb_default_row_format选项可以设置动态:

MySQL的&#62;SET GLOBAL innodb_default_row_format=DYNAMIC;

有效innodb_default_row_format选项包括动态COMPACT,和冗余。这个COMPRESSED行格式,这是在不使用SYSTEM表空间的支持,不能定义为默认。它只能在一个显式指定CREATE TABLEALTER TABLE声明。试图设置innodb_default_row_format压缩的返回一个错误:

mysql> SET GLOBAL innodb_default_row_format=COMPRESSED;
ERROR 1231 (42000): Variable 'innodb_default_row_format'
can't be set to the value of 'COMPRESSED'

新创建的表用来定义行格式innodb_default_row_format当一个row_format选项不明确指定或当ROW_FORMAT=DEFAULT使用。例如,下面的CREATE TABLE语句中使用定义的行格式innodb_default_row_format

创建表T1(C1型);
CREATE TABLE t2 (c1 INT) ROW_FORMAT=DEFAULT;

当一个ROW_FORMAT选项不明确指定或当ROW_FORMAT=DEFAULT使用任何操作,重建表也默默地改变表格的行格式定义的格式innodb_default_row_format

表的操作,包括重建ALTER TABLE操作使用ALGORITHM=COPYALTER TABLE操作使用ALGORITHM=INPLACE在表的重构是必要的。看到第15.12.1,“在线DDL操作”对于DDL操作的在线状态的概述。OPTIMIZE TABLE又是一个表重建术

下面的示例演示表重建术,默默地改变一个表创建的没有一个明确的定义行格式的行格式。

mysql> SELECT @@innodb_default_row_format;
+-----------------------------+
| @@innodb_default_row_format |
+-----------------------------+
| dynamic                     |
+-----------------------------+

mysql> CREATE TABLE t1 (c1 INT);

mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME LIKE 'test/t1' \G
*************************** 1. row ***************************
     TABLE_ID: 54
         NAME: test/t1
         FLAG: 33
       N_COLS: 4
        SPACE: 35
   ROW_FORMAT: Dynamic
ZIP_PAGE_SIZE: 0
   SPACE_TYPE: Single

mysql> SET GLOBAL innodb_default_row_format=COMPACT;

mysql> ALTER TABLE t1 ADD COLUMN (c2 INT);

mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME LIKE 'test/t1' \G
*************************** 1. row ***************************
     TABLE_ID: 55
         NAME: test/t1
         FLAG: 1
       N_COLS: 5
        SPACE: 36
   ROW_FORMAT: Compact
ZIP_PAGE_SIZE: 0
   SPACE_TYPE: Single

改变现有表的行格式从之前考虑以下潜在的问题REDUNDANT粉盒DYNAMIC

查看表的行的格式问题SHOW TABLE STATUS表或查询INFORMATION_SCHEMA.TABLES

SELECT * FROM information_schema.innodb_tables,名字像“试验/T1的G

一行的格式InnoDB表确定其物理排结构。看到第15.8.1.2,“物理行结构的InnoDB表”更多信息

15.10.3动态压缩行格式

当一个表的创建ROW_FORMAT=DYNAMICROW_FORMAT=COMPRESSEDInnoDB可以存储可变长度列的值(对于长VARCHARVARBINARY,和BLOBTEXT类型)完全关闭页面,与聚集索引记录包含只有20字节指针的溢出页。InnoDB编码固定长度字段大于或等于768字节长度的可变长度字段。例如,一个CHAR(255)柱可以超过768字节如果字符集的最大字节长度大于3,因为它是utf8mb4

列是否存储页取决于页面大小和行的总大小。如果行太长,InnoDB选择最长的柱下的页面存储到聚集索引记录安装在B-树网页TEXTBLOB列是小于或等于40字节始终存储在。

这个DYNAMIC行格式保持在索引节点中存储整行的效率是否适合(不粉盒REDUNDANT格式),but the动态行格式,避免了大量的长列的数据字节填充树节点的问题。这个DYNAMIC格式是基于这样的理念:如果一个长的数据值的一部分存储关闭网页,它通常是最有效的储存所有的价值掉页。与动态格式、短柱可能仍在B-树的节点,减少溢出页的任何给定的行数的。

这个COMPRESSED行格式使用类似的内部细节,关闭页面存储为动态行格式,额外的存储和性能从表和索引的数据被压缩并使用较小的页大小的考虑。与COMPRESSED行格式的key_block_size选项控制多少列的数据存储在聚簇索引,有多少是放在溢出页。有关详情COMPRESSED行格式,见15.9节,“InnoDB表和页面压缩”

DYNAMIC压缩的行格式支持前缀索引最多3072个字节。

表使用COMPRESSED行格式可以创建文件表表空间或禁忌将军。SYSTEM表空间不支持COMPRESSED行格式。两个大的A压缩的文件中的每个表的表空间表,innodb_file_per_table必须启用。这个innodb_file_per_table配置选项不适用于一般的表空间。一般表空间支持所有的行格式与警告,压缩和非压缩表不能因不同的物理页面大小相同的表空间并存。对于一般的表空间的更多信息,参见第15.7.10”一般,InnoDB表空间”

DYNAMIC表可以存储在每个表的表空间,文件一般表空间和系统表空间。存储动态在SYSTEM表空间的表,您可以禁用innodb_file_per_table与使用常规创建表ALTER TABLE语句,或者你可以使用TABLESPACE [=] innodb_system表选项CREATE TABLE修改表无需改变你innodb_file_per_table设置这个innodb_file_per_table配置选项不适用于一般的表空间,也适用于使用TABLESPACE [=] innodb_system表选项来存储DYNAMIC在系统中的表的表空间。

InnoDB不支持压缩的临时表。什么时候innodb_strict_mode启用(默认),CREATE TEMPORARY TABLE返回一个错误如果ROW_FORMAT=COMPRESSEDKEY_BLOCK_SIZE指定。如果innodb_strict_mode是残疾人,发出警告和临时表是使用非压缩行格式创建。

DYNAMIC压缩的行格式的变化COMPACT行格式,因此处理CHAR以同样的方式存储为粉盒行格式。有关更多信息,参见第15.8.1.2,“物理行结构的InnoDB表”

15.10.4紧凑和多余的行格式

InnoDB表使用粉盒REDUNDANT行格式存储到可变长度列的前768个字节(VARCHARVARBINARY,和BLOBTEXT类型)在索引记录在B-树节点,其余存储在溢出页。InnoDB编码固定长度字段大于或等于768字节长度的变长字段,它可以存储页。例如,一个char(255)柱可以超过768字节如果字符集的最大字节长度大于3,因为它是utf8mb4

COMPACT冗余行格式,如果一列的值是768字节或更少,没有溢出页是必要的,和一些节省I/O可能导致的结果,因为价值是在B树节点。这适用于相对较短BLOB的,但可能会引起B树节点填充数据而不是关键值,降低效率。表多斑点列可能导致B树节点变得太充分的数据,并包含过几排,使整个指数比如果行较短或如果列值存储页面的效率低。

默认的行格式DYNAMIC,所定义的innodb_default_row_format配置选项。见第15.10.3,动态压缩行格式”更多信息

关于表使用的物理行结构信息REDUNDANT粉盒行格式,见第15.8.1.2,“物理行结构的InnoDB表”

15.11 InnoDB的磁盘I/O和文件空间管理

作为一个DBA,你必须管理磁盘I/O保持I/O子系统变得饱和,并管理磁盘空间来避免填充存储设备。这个设计模式需要一定数量的I / O,似乎是多余的,但有助于保证数据的可靠性。在这些限制,InnoDB试图优化数据库和磁盘文件来减少磁盘I/O。有时组织,I / O是推迟到数据库不忙,直到一切都需要被带到一致状态,如在后重新启动数据库快速关机

该部分论述了I/O和磁盘空间和MySQL表的默认类的主要因素(也被称为InnoDB表格):

  • 背景控制的金额所使用的I / O,以改善查询性能。

  • 启用或禁用功能,提供额外的耐用性,以增加我的费用/ O.

  • 组织表成许多小文件,几个大的文件,或两者的组合。

  • 平衡大小的重做日志文件,对I/O活动发生时,日志文件变满。

  • 如何识别一个最优的查询性能表。

15.11.1 InnoDB的磁盘I / O

InnoDB使用异步I/O在可能的情况下,通过创建多个线程来处理I/O操作,同时允许其他数据库操作进行I / O仍在进行。在Linux和Windows平台,InnoDB使用现有的操作系统和库函数来执行本地的异步I / O.在其他平台,InnoDB仍然使用I/O线程,但线程在等待I/O请求完成;这种技术被称为模拟异步I / O.

读前

如果InnoDB可以确定有一个高概率的数据可能需要很快,它执行预读操作带来的数据到缓冲池,这样就可以在内存中。做几个大的读取请求对于连续数据可比几个小的效率更高,传播的要求。有两预读算法InnoDB

  • 在顺序读吧,如果InnoDB注意,顺序在表空间段的访问模式,它提前上岗一批读取数据库页的I/O系统。

  • 在随机读吧,如果InnoDB注意到在一个表空间的一些地区似乎被完全读入缓冲池的过程中,揭示了剩余的读取I/O系统。

有关配置预读的启发式信息,看第15.6.3.5”配置,InnoDB缓冲池预取(预读)”

doublewrite缓冲

InnoDB使用了一种新的文件冲洗技术涉及结构称为doublewrite缓冲在大多数情况下,这是默认启用(innodb_doublewrite=ON)。它增加了安全恢复后死机或停电,并通过减少需要提高对UNIX大部分品种表现fsync()运营

在写作前页的数据文件,InnoDB他们先对连续的表面积为doublewrite写缓冲。只有在写的doublewrite缓冲刷新已完成并InnoDB在写数据文件到适当的位置的页面。如果有一个操作系统,存储子系统,或mysqld在一页写的中间过程(导致崩溃撕页条件),InnoDB以后可以找到网页的一个很好的副本从doublewrite缓冲恢复期。

如果系统表空间文件(ibdata文件)位于融合IO设备支持原子写道,doublewrite缓冲自动禁用,Fusion-io原子将用于所有数据文件。因为doublewrite缓冲的设置是全局的,doublewrite缓冲也是数据文件驻留在非融合IO硬件禁用。此功能仅在Fusion-io的硬件支持,仅仅在Fusion-io nvmfs Linux。要充分利用这一特点,innodb_flush_method设置直接_ O推荐

15.11.2文件空间管理

数据文件可以定义在配置文件中使用innodb_data_file_path配置选项InnoDB系统表空间。该文件是在逻辑上连接起来以形成系统表空间。在使用中不带。你不能定义在SYSTEM表空间分配表。在一个新创建的系统表空间,InnoDBallocates太空启动从第一数据文件。

为了避免来自所有表和索引的存储在SYSTEM表空间的问题,可以使innodb_file_per_table配置选项(默认),它存储每个新创建的表中的一个单独的表空间文件(扩展名鸡传染性法氏囊病)。为表的存储方式,有较少的碎片在磁盘文件中,当表格被截断,空间返回给操作系统而不是依然被保留在InnoDB在SYSTEM表空间。有关更多信息,参见第15.7.4“InnoDB文件,每个表的表空间”

你还可以存储表禁忌将军。一般表空间是共享表空间的创建使用CREATE TABLESPACE语法。他们可以创建MySQL数据目录之外,能够容纳多个表,和所有的行格式的支持表。有关更多信息,参见第15.7.10”一般,InnoDB表空间”

页,extents,段,和tablespaces

每个表空间由数据库网页。在MySQL实例的每个表空间具有相同的页面大小。默认情况下,所有的表空间有一个16kb的页面大小;可以减少页面大小8kb即4KB通过指定innodb_page_size选择当您创建MySQL实例。你也可以增加页面大小为32KB或64Kb。有关更多信息,请参阅innodb_page_size文档

页面分为程度页到16KB大小1MB(连续64 16kb页或128页或256 8kb,4KB页)。对于一个32KB的页面大小,大小为2MB。为64KB页面,大小为4MB。这个文件在一个表空间被称为部分进入InnoDB。(这段是不同的回滚段,这实际上包含了许多表空间段。)

当一个段内的生长空间,InnoDB分配第一32页它一次。之后,InnoDB开始分配到段的整个范围。InnoDB可以总计达4程度的一次大段以确保良好的串行数据。

两段分配给每个指数InnoDB。一是对非叶节点B-树,其他的是叶节点。留叶节点相邻的磁盘可以更好的顺序I/O操作,因为这些叶节点包含实际的表中的数据。

在表空间的一些页面包含其它页面的位图,因此在一些程度InnoDB表空间不能被分配给段作为一个整体,但只是作为单独的页面。

当你问在表空间的可用空间通过发行SHOW TABLE STATUS声明,InnoDB报道说,肯定是在表空间的自由程度。InnoDB总是储备清理和其他内部目的一定程度;这些保留区不包括在自由空间。

当你删除数据从一个表,InnoDB合同对应的B树索引。是否释放的空间就成为可供其他用户取决于模式删除释放的个人页面或不同的表空间。删除表的所有行或删除从保证释放空间给其他用户,但请记住,删除的行仅由物理删除净化这是自动操作,之后他们不再是事务回滚或一致的需要一些时间看书。(见15.3节,“InnoDB的多版本”。)

如何页表行

最大的行长度略小于半个数据库页为4KB,8KB,16KB、32KBinnodb_page_size设置例如,最大的行长度略小于8KB为默认16kbInnoDB页面大小。对于64kb页,最大行长度略小于16kb。

如果行不超过最大的行长度,都是本地存储页面内的。如果一行超过最大行长度,可变长度列选择外部关闭页面存储到行适合在最大的行长度限制。外部关闭页面存储可变长度列和行的格式:

  • 紧凑和多余的行格式

    当可变长度列为对外关闭的页面存储,InnoDB商店的前768个字节的局部在列,其余的外部为溢出页。每一列都有自己的页表溢出。768字节的前缀是伴随着一个20字节的值存储的真正的列长度和点到溢出的列表,其余的储存的价值。看到第15.10.4,紧凑和多余的行格式”

  • 动态压缩行格式

    当可变长度列为对外关闭的页面存储,InnoDB存储一个20字节指针在排,其余的外部为溢出页。看到第15.10.3,动态压缩行格式”

LONGBLOBLONGTEXT列必须小于4GB,和总的行长度,包括BLOBTEXT列,必须小于4GB

15.11.3 InnoDB检查站

让你的日志文件非常大的可能减少磁盘I/O中检查点。它往往使感设置日志文件的总大小一样大,甚至更大的缓冲池。

如何检查处理工作

InnoDB实现了一个检查点机构称为模糊检验点InnoDB刷新修改数据库页从缓冲池小批量。无需刷新缓冲区池一批,会破坏用户的SQL语句的处理过程中的检查点。

崩溃恢复InnoDB找一个检查站写入日志文件。它知道所有的修改到数据库之前,标签在数据库的磁盘映像。然后InnoDB扫描日志文件的检查点,将记录修改数据库。

15.11.4整理表

随机插入或删除从次要指标可以使指数变得支离破碎。破碎意味着索引页在磁盘上的物理排序不接近指数的页上记录的顺序,或有在64页的块被分配给许多未使用的页的索引。

破碎的症状之一是一台以比它更大的空间应该带。那究竟是多少,很难确定。全部InnoDB数据和索引存储在B树,和他们的填充因子可能会有所不同从50~100 %。碎片化的另一个症状是表扫描如这需要更多的时间比它应该带:

SELECT COUNT(*) FROM t WHERE non_indexed_column <> 12345;

前面的查询需要MySQL进行全表扫描,对于大表查询速度最慢的一种类型。

加快索引扫描,你可以定期执行无效的ALTER TABLE重建手术,这导致一个MySQL表:

修改表tbl_nameENGINE=INNODB

你也可以使用ALTER TABLE tbl_name FORCE执行无效的操作rebuilds坛,真的结束了。

ALTER TABLE tbl_name ENGINE=INNODBALTER TABLE tbl_name FORCE使用在线DDL。有关更多信息,参见第15.12.1,“在线DDL操作”

另一种方式来执行碎片整理操作使用mysqldump转储表到一个文本文件,删除表,请从转储文件。

如果插入一个指数总是上升和记录只能从最终删除的InnoDB文件空间管理算法保证在索引碎片不发生。

15.11.5回收磁盘空间表

让操作系统磁盘空间时截断一个InnoDB表,该表必须保存在自己的鸡传染性法氏囊病文件一个表可以存储在其自己的鸡传染性法氏囊病文件,innodb_file_per_table在创建表时,必须启用。此外,不能有一个外键桌子被截断和其他表之间的约束,否则TRUNCATE TABLE操作失败。外键约束两列在同一个表中,然而,是允许的。

当一个表被截断,这是下跌并重新创建一个新的.ibd文件,和释放的空间返回到操作系统。这与截断InnoDB表内所储存的InnoDB系统表空间(表时创建的innodb_file_per_table=OFF)和表存储在共享禁忌将军,只有InnoDB可以使用自由空间表后被截断。

截断表和返回的磁盘空间的操作系统的能力也意味着物理备份可以更小。截断表存储在SYSTEM表空间(表时创建的innodb_file_per_table=OFF)或在一个普通的表空间的表空间留下的未使用空间块。

比InnoDB和在线DDL

在线DDL功能提供支持即时到位表的改变和并行DML。这个功能的好处包括:

  • 在繁忙的生产环境,提高响应速度和可用性,在做一张桌子不可数分钟或数小时是不实际的。

  • 就地操作,能够调节性能和并发性之间的平衡在DDL操作使用LOCK条款.看到锁定条款

  • 更少的磁盘空间的使用和I/O开销比表复制方法。

笔记

ALGORITHM=INSTANT可支持添加列在MySQL 8.0.12等操作。

通常情况下,你不需要做任何特殊使在线DDL。默认情况下,MySQL执行操作立即或在的地方,是允许的,与小锁的可能。

你可以控制方面的DDL操作使用ALGORITHM锁具条款的ALTER TABLE声明。这些条款都放在语句结束,用逗号分隔的表和列的规格分。例如:

修改表tbl_name添加主键(column), ALGORITHM=INPLACE, LOCK=NONE;

这个LOCK条款可操作,执行到位,用于微调的并发访问表的操作过程中的程度。只有LOCK=DEFAULT是,立即执行操作的支持。这个ALGORITHM条款主要用于性能比较,如果你遇到任何问题的旧的表复制行为的退路。例如:

  • 为了避免不小心使表无法读取,写入,或两者,在一个地方ALTER TABLE操作时,指定的条款ALTER TABLE声明如LOCK=NONE(允许读取和写入)或LOCK=SHARED(允许读取)。运行停止立即如果并发请求的水平是不可用的。

  • 比较性能之间的算法,运行一个语句ALGORITHM=INSTANTALGORITHM=INPLACEALGORITHM=COPY。你也可以运行的声明old_alter_table配置选项允许使用武力ALGORITHM=COPY

  • 为了避免服务器与ALTER TABLE复制表的操作,包括ALGORITHM=INSTANTALGORITHM=INPLACE。声明停止立即如果它不能使用指定的算法。

15.12.1 DDL操作在线

在线支持细节,语法的例子,和DDL操作使用说明在本节内容规定。

索引操作

下表提供了索引操作的在线DDL支持概述。星号表示更多的信息,一个异常,或依赖。详情见语法和用法说明

表15.12在线DDL支持索引操作

运营即时在的地方重建表允许并行DML只有修改的数据
创建或添加辅助索引
删除索引
重命名索引
添加一个FULLTEXT指数是*不*
添加一个SPATIAL指数
改变指数型

语法和用法说明
  • 创建或添加辅助索引

    CREATE INDEX name ON table (col_list);
    
    修改表tbl_name添加索引namecol_list);

    桌子上仍然可以阅读并在创建索引时,写操作。这个CREATE INDEX声明结束后,所有的交易都访问表的完成,使索引的初始状态反映表最新内容。

    加二级指标在线DDL支持意味着你可以创建和加载速度表和相关的索引创建的表没有二级指标的全过程,然后将二级指标后加载数据。

    新创建的辅助索引只包含下表中的数据时CREATE INDEXALTER TABLE语句执行完毕。它不包含任何未提交的值,值的老版本,或值标记为删除,但尚未从旧的索引中删除。

    一些因素影响性能,空间的使用,以及该操作语义。详情见第15.12.6,“在线DDL的局限性”

  • 删除索引

    DROP INDEX name ON table;
    
    修改表tbl_name删除索引name

    桌子上仍然可以读取,而指数正在下降的写操作。这个DROP INDEX声明结束后,所有的交易都访问表的完成,使索引的初始状态反映表最新内容。

  • 重命名索引

    ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name, ALGORITHM=INPLACE, LOCK=NONE;      
    
  • 添加一个FULLTEXT指数

    【解释】:Create FullText Indexname在表(column);

    添加第一FULLTEXT索引重建表如果没有定义_ FTS _ doc ID专栏额外的FULLTEXT所述的反应可能不复存在。

  • 添加一个SPATIAL指数

    CREATE TABLE geom (g GEOMETRY NOT NULL);ALTER TABLE geom ADD SPATIAL INDEX(g), ALGORITHM=INPLACE, LOCK=SHARED;

    添加第一FULLTEXT索引重建表如果没有定义_ FTS _ doc ID专栏额外的FULLTEXT所述的反应可能不复存在。

  • 不断变化的指数型(USING {BTREE | HASH}

    修改表tbl_name索引I1,添加索引I1(key_part,...) USING BTREE, ALGORITHM=INSTANT;

主键操作

下表提供了主要关键业务在线DDL支持概述。星号表示更多的信息,一个异常,或依赖。看到语法和用法说明

表15.13在线DDL支持关键业务

运营即时在的地方重建表允许并行DML只有修改的数据
添加主键是*是*
在落水primary key
删除主键和添加另一个

语法和用法说明
  • 添加主键

    ALTER TABLE tbl_name ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;
    

    重建表的地方。数据重组的基本上,使它成为一个昂贵的操作。ALGORITHM=INPLACE不允许在一定条件下,如果列必须转换成不为空

    重组聚集索引总是需要表的数据复制。因此,它是最好的定义primary key当你创建一个表,而不是发行ALTER TABLE ... ADD PRIMARY KEY后来

    当你创建一个UNIQUE主键索引,MySQL必须做一些额外的工作。为UNIQUE索引,MySQL检查表不包含重复的值的关键。对于一个主键索引,MySQL也检查没有的PRIMARY KEY列包含一个无效的

    当你添加一个主键使用ALGORITHM=COPY子句,MySQL转换无效的在相关的列值为默认值:0数字、字符的列和斑点空字符串,并为0000-00-00 00:00:00DATETIME。这是一种不规范的行为,Oracle建议你不依赖。添加一个主键使用ALGORITHM=INPLACE只允许当SQL_MODE设置包括strict_trans_tablesstrict_all_tablesWhen the标志;sql_mode设置严格的,ALGORITHM=INPLACE是允许的,但声明仍然可以如果要求主键列包含失败无效的价值观。这个ALGORITHM=INPLACE行为更加符合标准

    如果你创建一个表没有主键,InnoDB选择一个你可以第一独特关键定义NOT NULL列,或一个系统生成的密钥。为了避免不确定性和一个额外的隐藏列的潜在空间要求,指定主键条款的一部分CREATE TABLE声明

    MySQL通过现有的数据从原表复制到一个临时表,需要创建一个新的聚集索引的索引结构。一旦数据完全复制到临时表,原表被不同的临时表的名字。临时表的聚集索引包含新更名为与原表的名称,和原来的表从数据库中删除了。

    网络性能增强,适用于操作的二级指标不适用于主键索引。InnoDB表的行存储在聚集索引组织基于主键,形成了一些数据库系统调用索引组织表。因为表结构是紧密联系在一起的主键,重新定义主键仍然需要复制的数据。

    当对主键的操作使用ALGORITHM=INPLACE,尽管数据仍然是复制,它比使用更高效ALGORITHM=COPY因为:

    • 没有撤消或重做日志记录相关要求ALGORITHM=INPLACE。这些操作DDL语句,使用添加开销ALGORITHM=COPY

    • 二次索引项进行预排序,因此可以加载顺序。

    • 改变缓冲区是没有用的,因为没有随机访问插入辅助索引。

  • 在落水primary key

    ALTER TABLE tbl_name DROP PRIMARY KEY, ALGORITHM=COPY;
    

    只有ALGORITHM=COPY支持删除主键不需要增加一个新的一样修改表声明

  • 删除主键和添加另一个

    ALTER TABLE tbl_name DROP PRIMARY KEY, ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;
    

    数据重组的基本上,使它成为一个昂贵的操作。

列操作

下表提供了对列操作在线DDL支持概述。星号表示更多的信息,一个异常,或依赖。详情见语法和用法说明

表15.14在线DDL支持列操作

运营即时在的地方重建表允许并行DML只有修改的数据
添加列是*是*
删除列
重命名一个列是*
重排列
设置列的默认值
更改列的数据类型
延伸VARCHAR柱尺寸
把列的默认值
改变自动增量值不*
制作一个柱NULL是*
制作一个柱NOT NULL是*是*
修改一个定义ENUM配置专栏

语法和用法说明
  • 添加列

    ALTER TABLE tbl_name ADD COLUMN column_name column_definition, ALGORITHM=INSTANT;
    

    当将不允许并行DML自增量专栏数据重组的基本上,使它成为一个昂贵的操作。在最低限度,ALGORITHM=INPLACE, LOCK=SHARED是必需的

    以下限制适用于当INSTANT算法是用来添加列:

    • 添加一个列不能组合在同一语句与其他ALTER TABLE行动不支持ALGORITHM=INSTANT

    • 一列只能添加作为表格的最后一列。添加列的任何其他位置的其他列不支持。

    • 不能将列添加到表的使用ROW_FORMAT=COMPRESSED

    • 不能将列添加到表中,包括FULLTEXT指数

    • 不能将列添加到临时表。临时表仅支持ALGORITHM=COPY

    • 不能将列添加到驻留在数据字典表空间表。

    • 行大小限制是不添加列时评价。然而,行大小限制进行DML操作,插入和更新表中的行。

    多个列可以在相同的加ALTER TABLE声明。例如:

    ALTER TABLE t1 ADD COLUMN c2 INT, ADD COLUMN c3 INT, ALGORITHM=INSTANT;

    INFORMATION_SCHEMA.INNODB_TABLESINFORMATION_SCHEMA.INNODB_COLUMNS即时添加列提供元数据。information_schema.innodb_tables.instant_cols显示表中的列数增加的第一瞬间列前。INFORMATION_SCHEMA.INNODB_COLUMNS.HAS_DEFAULTdefault_value提供即时添加列元数据的默认值。

  • 删除列

    ALTER TABLE tbl_name DROP COLUMN column_name, ALGORITHM=INPLACE, LOCK=NONE;
    

    数据重组的基本上,使它成为一个昂贵的操作。

  • 重命名一个列

    ALTER TABLE tbl CHANGE old_col_name new_col_name data_type, ALGORITHM=INPLACE, LOCK=NONE;
    

    允许并行DML,保持相同的数据类型,只改变列的名称。

    当你把相同的数据类型和[NOT] NULL属性,只改变列的名字,都可以进行网上操作。

    你也可以重命名为外键约束部分列。外键定义自动更新为使用新的列名称。重命名一个列参与外键只能与ALGORITHM=INPLACE。如果你使用ALGORITHM=COPY条款,或其他一些条件,使命令的使用ALGORITHM=COPY幕后的修改表语句失败

    ALGORITHM=INPLACE不能重命名的支持生成的列

  • 重排列

    对列重新排序,使用FIRST进入CHANGE修改运营

    ALTER TABLE tbl_name MODIFY COLUMN col_name column_definition FIRST, ALGORITHM=INPLACE, LOCK=NONE;
    

    数据重组的基本上,使它成为一个昂贵的操作。

  • 更改列的数据类型

    ALTER TABLE tbl_name CHANGE c1 c1 BIGINT, ALGORITHM=COPY;  
    

    更改列的数据类型只支持ALGORITHM=COPY

  • 延伸VARCHAR柱尺寸

    修改表tbl_nameCHANGE COLUMN c1 c1 VARCHAR(255), ALGORITHM=INPLACE, LOCK=NONE;

    所需要的长度字节数VARCHAR列必须是相同的。为VARCHAR0到255字节大小的列,一个长度字节编码所需的价值。为VARCHAR在尺寸或超过256字节的列,两个长度字节是必需的。因此,在的地方ALTER TABLE只支持增加VARCHAR柱的大小从0到255字节,256字节或更大尺寸的。在的地方ALTER TABLE不支持增加一个尺寸VARCHAR柱从小于256字节的大小等于或大于256字节。在这种情况下,从1到2的所需长度字节数的改变,这是由一个表复制仅支持(ALGORITHM=COPY)。例如,试图改变VARCHAR对于单字节字符集从VARCHAR列大小(255)到(256)使用varchar到位ALTER TABLE返回此错误:

    修改表tbl_nameALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(256);ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot changecolumn type INPLACE. Try ALGORITHM=COPY.
    笔记

    一个字节的长度VARCHAR柱是基于字符的字节长度设置依赖。

    降低VARCHAR大小用到位ALTER TABLE不支持。降低VARCHAR尺寸要求表复制(ALGORITHM=COPY

  • 设置列的默认值

    ALTER TABLE tbl_name ALTER COLUMN col SET DEFAULT literal, ALGORITHM=INSTANT;
    

    只修改表元数据。列默认值存储在数据词典

  • 删除列的默认值

    ALTER TABLE tbl ALTER COLUMN col DROP DEFAULT, ALGORITHM=INSTANT;
    
  • 改变自动增量值

    ALTER TABLE table AUTO_INCREMENT=next_value, ALGORITHM=INPLACE, LOCK=NONE;
    

    修改一个值存储在内存中,而不是数据文件。

    在分布式系统中使用复制或分片,有时你会重置为一个表一个特定的值自动递增计数器。下一行插入表中使用的自动递增列指定值。你也可以使用在您定期清空所有表的数据仓库环境技术和加载它们,并重新启动自动递增序列从1。

  • 制作一个柱NULL

    修改表tbl_name修改列column_namedata_typeNULL, ALGORITHM=INPLACE, LOCK=NONE;

    重建表的地方。数据重组的基本上,使它成为一个昂贵的操作。

  • 制作一个柱NOT NULL

    修改表tbl_name修改列column_namedata_typeNOT NULL, ALGORITHM=INPLACE, LOCK=NONE;

    《rebuilds表在的地方。STRICT_ALL_TABLESstrict_trans_tablesSQL_MODE是成功的操作要求。如果该列包含空值的操作失败。服务器禁止更改外键列,就必须使参照完整性的潜在损失。看到第13.1.8,“ALTER TABLE语法”。数据重组的基本上,使它成为一个昂贵的操作。

  • 修改一个定义ENUM配置专栏

    CREATE TABLE t1 (c1 ENUM('a', 'b', 'c'));
    ALTER TABLE t1 MODIFY COLUMN c1 ENUM('a', 'b', 'c', 'd'), ALGORITHM=INSTANT;
    

    修改一个定义ENUMSET通过添加新的枚举或组成员列结束对有效的成员值的列表可能立即发生或进行的,只要该数据类型的存储大小没有变化。例如,添加一个成员了SET列有8名成员的变化所需的存储每值从1字节到2字节;这需要一个表复制。在列表中添加成员造成重编现有成员,这就需要一个表复制。

生成的列的操作

下表提供了生成的列操作在线DDL支持概述。详情见语法和用法说明

表15.15在线DDL支持生成的列的操作

运营即时在的地方重建表允许并行DML只有修改的数据
添加一个STORED专栏
修改STORED列顺序
落下STORED专栏
添加一个VIRTUAL专栏
修改VIRTUAL列顺序
落下VIRTUAL专栏

语法和用法说明
  • 添加一个STORED专栏

    ALTER TABLE t1 ADD COLUMN (c2 INT GENERATED ALWAYS AS (c1 + 1) STORED), ALGORITHM=COPY;

    ADD COLUMN是不是到位操作存储列(没有使用临时表)因为表达必须由服务器计算。

  • 修改STORED列顺序

    ALTER TABLE t1 MODIFY COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) STORED FIRST, ALGORITHM=COPY;

    《rebuilds表在的地方。

  • 落下STORED专栏

    ALTER TABLE t1 DROP COLUMN c2, ALGORITHM=INPLACE, LOCK=NONE;

    《rebuilds表在的地方。

  • 添加一个VIRTUAL专栏

    ALTER TABLE t1 ADD COLUMN (c2 INT GENERATED ALWAYS AS (c1 + 1) VIRTUAL), ALGORITHM=INSTANT;

    添加一个虚拟柱可以进行即时或在非分区表。

    添加一个VIRTUAL是不是到位操作分区表。

  • 修改VIRTUAL列顺序

    ALTER TABLE t1 MODIFY COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) VIRTUAL FIRST, ALGORITHM=COPY;
  • 落下VIRTUAL专栏

    ALTER TABLE t1 DROP COLUMN c2, ALGORITHM=INSTANT;

    落下VIRTUAL柱可以进行即时或在非分区表。

外键操作

下表提供了外键操作在线DDL支持概述。星号表示更多的信息,一个异常,或依赖。详情见语法和用法说明

表15.16在线DDL支持外键操作

运营即时在的地方重建表允许并行DML只有修改的数据
添加外键约束是*
删除外键约束

语法和用法说明
  • 添加外键约束

    这个INPLACE算法支持foreign_key_checks被禁用。否则,只有复制算法支持

    ALTER TABLE tbl1 ADD CONSTRAINT fk_name FOREIGN KEY index (col1) 
      REFERENCES tbl2(col2) referential_actions;
    
  • 删除外键约束

    ALTER TABLE tbl DROP FOREIGN KEY fk_name;
    

    删除外键可以进行在线的foreign_key_checks选择启用或禁用

    如果你不知道在一个特定的表的外键约束的名字,发出以下声明中找到约束名称CONSTRAINT每个外键子句:

    显示创建表tableG

    或者,查询INFORMATION_SCHEMA.TABLE_CONSTRAINTS表和使用约束_ nameCONSTRAINT_TYPE列外键名称识别

    你也可以减少一个外键及其相关指标在一个语句中:

    ALTER TABLE table DROP FOREIGN KEY constraint, DROP INDEX index;
    
笔记

如果外键已经在桌子上被改变现状(即,它是一个子表FOREIGN KEY ... REFERENCE条款),额外的限制适用于在线DDL操作,即使是那些不直接涉及到外键列:

  • 一个ALTER TABLE在子表可以等待另一个事务提交,如果更改父表原因子表中相关的变化通过在更新ON DELETE从句的使用级联SET NULL参数.

  • 以同样的方式,如果表是父表在外键关系,即使它不包含任何FOREIGN KEY条款,它可以等待ALTER TABLE完成如果INSERTUPDATE,或DELETE表原因在更新ON DELETE子表中的作用

表操作

下表提供了对表格操作的在线DDL支持概述。星号表示更多的信息,一个异常,或依赖。详情见语法和用法说明

表15.17在线DDL支持表格操作

运营即时在的地方重建表允许并行DML只有修改的数据
改变ROW_FORMAT
改变KEY_BLOCK_SIZE
建立持续的统计表
指定字符集是*
转换字符集是*
优化表是*
启用或禁用表加密
重建与FORCE选项是*
执行一个空的重建是*
重命名一个表

语法和用法说明
  • 改变ROW_FORMAT

    修改表tbl_nameROW_FORMAT =row_format, ALGORITHM=INPLACE, LOCK=NONE;

    数据重组的基本上,使它成为一个昂贵的操作。

    有关更多信息ROW_FORMAT选项,看表选项

  • 改变KEY_BLOCK_SIZE

    修改表tbl_nameKEY_BLOCK_SIZE =value, ALGORITHM=INPLACE, LOCK=NONE;

    数据重组的基本上,使它成为一个昂贵的操作。

    有关更多信息KEY_BLOCK_SIZE选项,看表选项

  • 持续的统计表选项设置

    ALTER TABLE tbl_name STATS_PERSISTENT=0, STATS_SAMPLE_PAGES=20, STATS_AUTO_RECALC=1, ALGORITHM=INPLACE, LOCK=NONE;  
    

    only修饰元数据表。

    持续的统计数据包括STATS_PERSISTENTstats_auto_recalc,和STATS_SAMPLE_PAGES。有关更多信息,参见第15.6.11.1”配置,持续优化统计参数

  • 指定字符集

    ALTER TABLE tbl_name CHARACTER SET = charset_name, ALGORITHM=INPLACE, LOCK=NONE;  
    

    重建表如果新的字符编码是不同的。

  • 转换字符集

    ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name, ALGORITHM=COPY;  
    

    重建表如果新的字符编码是不同的。

  • 优化表

    OPTIMIZE TABLE tbl_name;  
    

    在地方操作不表支持FULLTEXT反应。手术刀到位算法,但ALGORITHM锁具语法是不允许的

  • 启用或禁用表加密

    ALTER TABLE tbl_name ENCRYPTION='Y', ALGORITHM=COPY;
    

    在地方操作不表支持FULLTEXT指标。手术采用适当的算法,但算法LOCK语法是不允许的

  • 在重建一个表FORCE选项

    修改表tbl_nameFORCE, ALGORITHM=INPLACE, LOCK=NONE;

    使用ALGORITHM=INPLACE在MySQL 5.6.17ALGORITHM=INPLACE是不是为表支持全文指标

  • “空”福音表演

    ALTER TABLE tbl_name ENGINE=InnoDB, ALGORITHM=INPLACE, LOCK=NONE;
    

    使用ALGORITHM=INPLACE在MySQL 5.6.17。ALGORITHM=INPLACE是不是为表支持FULLTEXT指标

  • 重命名一个表

    ALTER TABLE old_tbl_name RENAME TO new_tbl_name, ALGORITHM=INSTANT;
    

    重命名一个表可以在瞬间或表现。MySQL将对应于表文件tbl_name没有复制。(你也可以使用RENAME TABLE语句重命名表。看到第13.1.33,“重命名表语法”权限。)专门为table没有迁移到新的名字。他们必须手动更改。

分配操作

有一些例外ALTER TABLE分配条款,在线DDL操作分区InnoDB表遵循同样的规则也适用于常规InnoDB

一些ALTER TABLE划分的条款不经过相同的内部在线DDL API作为普通非分区InnoDB表因此,在线支持ALTER TABLE分配条款的变化

下表显示了每个在线状态ALTER TABLE分区表。无论在线DDL的API,使用MySQL试图减少数据复制和锁定在可能的地方。

ALTER TABLE分区选择使用ALGORITHM=COPY或者只允许ALGORITHM=DEFAULT, LOCK=DEFAULT分区表,使用复制算法.换句话说,一个新的分区表和分区方案创建新的。新创建的表中包含的任何变化的应用ALTER TABLE表,和表中的数据复制到新表结构。

表15.18在线DDL支持分区操作

分区子句即时在的地方允许DML笔记
PARTITION BY许可证ALGORITHM=COPYLOCK={DEFAULT|SHARED|EXCLUSIVE}
ADD PARTITION是*是*ALGORITHM=INPLACE, LOCK={DEFAULT|NONE|SHARED|EXCLUSISVE}支持范围LIST分区,ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSISVE}HASH钥匙分区,并ALGORITHM=COPY, LOCK={SHARED|EXCLUSIVE}所有的分区类型。不复制表分区的现有数据范围LIST。并行查询的允许ALGORITHM=COPYfor表partitioned byHASH列表MySQL复制,同时持有共享锁的数据。
DROP PARTITION是*是*

ALGORITHM=INPLACE, LOCK={DEFAULT|NONE|SHARED|EXCLUSIVE}支持。不表分区的数据复制范围LIST

DROP PARTITIONALGORITHM=INPLACE删除存储在分区的分区数据,滴。然而,DROP PARTITIONALGORITHM=COPYold_alter_table=ON重建分区表和试图将数据从下降到另一个分区的分区与兼容分区…价值观定义不能移动到另一个分区的数据将被删除。

DISCARD PARTITION只允许ALGORITHM=DEFAULTLOCK=DEFAULT
IMPORT PARTITION只允许ALGORITHM=DEFAULTLOCK=DEFAULT
TRUNCATE PARTITION不会复制现有的数据。它只是删除行;它不改变表的定义本身,或其任何分区。
COALESCE PARTITION是*ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSIVE}支持
REORGANIZE PARTITION是*ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSIVE}支持
EXCHANGE PARTITION
ANALYZE PARTITION
CHECK PARTITION
OPTIMIZE PARTITIONALGORITHM锁具条款是Ignored。rebuilds the entire表。See第22.3.4,“维护分区”
REBUILD PARTITION是*ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSIVE}支持
REPAIR PARTITION
REMOVE PARTITIONING许可证ALGORITHM=COPYLOCK={DEFAULT|SHARED|EXCLUSIVE}

非分配在线ALTER TABLE分区表的操作都遵循同样的规则也适用于常规表。然而,ALTER TABLE在每一个分区表进行在线操作,这会增加对系统资源的要求由于在多个分区进行操作。

有关更多信息ALTER TABLE分配条款,看期权的分解,和第13.1.8.1,“修改表分区操作”。关于分区的一般信息,看22章,分区

15.12.2在线DDL性能和并发性

提高在线DDL操作MySQL的几个方面:

  • 访问表的应用更加敏感,因为在表查询和DML操作可以继续进行,而DDL操作正在进行中。减少锁等待MySQL服务器资源带来更大的可扩展性,即使是不涉及DDL操作。

  • 即时操作只修改元数据在数据字典。没有元数据锁在表和表数据不受影响,使操作瞬时。并行DML不受影响。

  • 在线操作,避免磁盘I/O和CPU周期与表相关的复制方法,最大限度地减少对数据库的整体负荷。最小负荷有助于维持在DDL操作的高性能和高吞吐量。

  • 在线操作读取数据到缓冲池不比表复制操作,从而降低了频繁访问的数据从内存中清除。频繁访问的数据清除的DDL操作后造成暂时的性能下降。

锁定条款

默认情况下,MySQL的使用尽可能小的锁在DDL操作。这个LOCK子句可以指定在操作和复制操作执行更严格的锁定,如果需要。如果锁具子句指定了一个较少限制级锁比是一个特定的DDL操作允许的,该语句将失败与错误。LOCK条款如下,在最最严格的秩序:

  • LOCK=NONE

    允许的并发查询和DML。

    例如,使用此条款涉及客户注册或购买表,避免冗长的DDL操作时不可用的表。

  • LOCK=SHARED

    允许同时查询,但块DML。

    例如,使用此条款对数据仓库表,在那里你可以延迟数据加载操作直到DDL操作完成,但查询不能长时间延迟。

  • LOCK=DEFAULT

    允许尽可能多的并发(并发查询,DML,或两者都有)。省略LOCK条款是作为指定相同的LOCK=DEFAULT

    使用这个条款,当你知道默认的锁定级别的DDL语句不会导致可用性问题的表。

  • LOCK=EXCLUSIVE

    块并行查询和DML

    如果主要关心的是在最短的时间内完成DDL操作使用这一条款,和并行查询和DML访问是没有必要的。你也可能如果服务器是闲置的使用这一条款,以避免意外的表的访问。

在线DDL和元数据锁

在线DDL操作可以被看作具有三相:

  • 1阶段:初始化

    在初始化阶段,服务器确定多少并发术中允许的,考虑到存储引擎的功能,在声明中指定的操作,和用户指定的ALGORITHM锁具选项在这个阶段,一个共享锁升级元数据以保护电流表的定义。

  • 2阶段:执行

    在这一阶段,准备和执行语句。无论是元数据锁升级为独家取决于因素在初始化阶段评估。如果一个专属元数据锁是必需的,它只是被简单地在表的编制。

  • 3阶段:提交表定义

    在提交表格定义阶段,元数据锁升级为独家驱逐旧表定义并提交新的一。一旦获准,独家的元数据锁的持续时间是短暂的。

由于独家元数据锁要求上面,一个在线DDL操作可能要等待并发事务持有的元数据锁表提交或回滚。交易开始前或DDL操作期间可以在表被修改元数据锁住。在长时间运行或交易不活跃的情况下,一个在线DDL操作的时间等待一个专属元数据锁。此外,一个悬而未决的专用元数据锁由一个在线DDL操作请求的块的后续交易桌上。

下面的示例演示了一个在线DDL操作等独家元数据锁,以及如何在元数据锁块后续交易的桌子上。

会话1:

mysql> CREATE TABLE t1 (c1 INT) ENGINE=InnoDB;
mysql> START TRANSACTION;
mysql> SELECT * FROM t1;

1届会议SELECT声明需要共享元数据锁定表T1。

第二:

mysql> ALTER TABLE t1 ADD COLUMN x INT, ALGORITHM=INPLACE, LOCK=NONE;

在会话2在线DDL操作,这就需要在表T1专用元数据锁犯表定义的变化,必须等待1次事务提交或回滚。

会话3:

mysql> SELECT * FROM t1; 

这个SELECT在会话3中声明受阻等专用元数据锁请求的ALTER TABLE在会话2中运行是理所当然的。

你可以使用SHOW FULL PROCESSLIST确定交易正在等待一个元数据锁。

MySQL的&#62;SHOW FULL PROCESSLIST\G...*************************** 2. row ***************************     Id: 5   User: root   Host: localhost     db: testCommand: Query   Time: 44  State: Waiting for table metadata lock   Info: ALTER TABLE t1 ADD COLUMN x INT, ALGORITHM=INPLACE, LOCK=NONE...*************************** 4. row ***************************     Id: 7   User: root   Host: localhost     db: testCommand: Query   Time: 5  State: Waiting for table metadata lock   Info: SELECT * FROM t14 rows in set (0.00 sec)

元数据锁信息也通过绩效模式暴露metadata_locks表,提供元数据锁依赖之间会话的信息,元数据锁的会话和会话等,目前持有锁的元数据。有关更多信息,参见第25.11.12.3,“metadata_locks表”

在线DDL性能

一个DDL操作的性能很大程度上取决于操作是否立即执行,到位,是否重建表。

评价一个DDL操作的相对性能,您可以比较的结果ALGORITHM=INSTANTALGORITHM=INPLACE,和ALGORITHM=COPY。声明也可以运行old_alter_table能够使用武力ALGORITHM=COPY

对于DDL操作修改表中的数据,你可以决定是否一个DDL操作执行地点的变化或在执行一个表的副本受影响的行命令完成后显示值。例如:

  • 更改列的默认值(快速、不影响表中的数据):

    Query OK, 0 rows affected (0.07 sec)
    
  • 添加索引(需要时间,但0 rows affected显示表不复制):

    查询行,0行受影响(21.42秒)
  • 更改列的数据类型(需要大量的时间,需要重建表中的所有行):

    Query OK, 1671168 rows affected (1 min 35.54 sec)
    

在一个大的表运行DDL操作前,检查是否运行的速度是快还是慢,如下:

  1. 系表结构

  2. 用少量的数据填充克隆表。

  3. 在克隆表运行DDL操作。

  4. 检查是否受影响的行值为零或不。一个非零值意味着操作复制表中的数据,这可能需要特殊的规划。例如,你可能会一段时间预计在做DDL操作,或在每个复制从服务器在同一时间。

笔记

一个更大的认识与DDL操作相关的MySQL处理、绩效考核模式INFORMATION_SCHEMA表相关InnoDB之前和之后的DDL操作看物理读取数,写,内存分配等。

性能模式阶段事件可以用来监测ALTER TABLE进步。看到第15.15.1,“监测表进步InnoDB表的使用性能模式”

因为有一些处理工作涉及记录并发DML操作所做的更改,然后将这些改变最后一个在线DDL操作可能需要更长的时间总比表复制机制,块表访问其他会话。在原性能的降低与使用表的应用更好的响应性平衡。当评估更改表结构的技术,考虑用户的感知性能,基于这样的作为Web页面的加载时间的因素。

15.12.3在线DDL的空间要求

空间要求的地方在线DDL操作如下。空间要求不适用于进行即时操作。

  • 临时日志文件空间

    一个临时日志文件记录并发DML当在线DDL操作创建一个索引或改变表。临时日志文件扩展的价值要求innodb_sort_buffer_size到一个指定的最大的innodb_online_alter_log_max_size。如果一个临时日志文件超过大小限制,在线DDL操作失败,并提交并行DML操作的回滚。一个大的innodb_online_alter_log_max_size设置允许在线DDL DML操作过程中,但它也延伸一段时间在DDL操作结束时,表锁定申请登录DML。

    如果操作需要很长的时间和并行DML修改表这么多的临时日志文件的大小超过此值innodb_online_alter_log_max_size,在线DDL操作失败与db_online_log_too_big误差

  • 临时文件排序空间

    在线DDL操作重建表写入临时文件排序的MySQL临时目录($TMPDIR在UNIX,%temp%在Windows中,或者指定的目录--tmpdir)在创建索引。临时排序文件不包含原始表的目录中创建。每个临时排序文件足以容纳所有次级索引列的聚集索引和主键列。临时排序文件被删除等内容合并到最终的表或索引。临时排序文件可能需要空间等于表中加上索引的数据量。一个在线DDL操作,重建表报告错误如果它使用所有可用的磁盘空间在数据目录所在的文件系统。

    如果MySQL临时目录不足以容纳排序文件,设置tmpdir到不同的目录。另外,定义一个单独的临时目录使用在线DDL操作innodb_tmpdir。这个选项是为了帮助避免临时目录溢出可能发生大的临时文件排序。

  • 为一个中间表文件空间

    一些在线DDL操作重建表创建相同目录中的临时文件作为原始表中间表。中间表文件可能需要空间等于原表的大小。中间表文件名的开始#sql-ib前缀只出现在在线DDL操作简单。

    这个innodb_tmpdir选项不适用于中间表文件。

15.12.4简化在线DDL DDL语句

之前介绍的在线DDL,常见的做法是将众多的DDL操作到一个单一的ALTER TABLE声明。因为每个ALTER TABLE声明涉及复制和重建的表,这是更有效地做出一些调整到同一个表的一次,因为这些变化都可以在一个单一的重建操作表。缺点是,SQL代码涉及DDL操作是难以维护和重用在不同的脚本。如果特定的变化,每一次的不同,你可能会建立一个新的复杂的ALTER TABLE每一个稍微不同的场景。

对于DDL操作可以在网上做,你可以把它们分开成单独的ALTER TABLE轻松脚本和维护报表,在不牺牲效率。例如,你可能需要一个复杂的语句,如:

修改表T1添加索引I1(C1),添加唯一索引I2(C2),改变c4_old_name c4_new_name整数的符号;

并将其分解为简单的部分,可以进行独立进行,如:

ALTER TABLE t1 ADD INDEX i1(c1);
ALTER TABLE t1 ADD UNIQUE INDEX i2(c2);
ALTER TABLE t1 CHANGE c4_old_name c4_new_name INTEGER UNSIGNED NOT NULL;

你仍然可以使用多部分ALTER TABLE报表:

  • 操作必须在一个特定的顺序进行,如创建一个索引,其次是外键约束,利用指数。

  • 操作使用相同的特异性LOCK条款,你想成功或失败作为一组。

  • 无法进行网上操作,即,仍然使用表复制方法。

  • 操作中指定ALGORITHM=COPYold_alter_table=1,力表复制行为如果在专业场景需要精确的向后兼容性。

在线15.12.5 DDL失效条件

一个在线DDL操作的失败通常是由于下列条件之一:

  • 一个ALGORITHM子句指定一个算法,不兼容的特定类型的DDL操作或存储引擎。

  • LOCK子句指定了一个低程度的锁定(共享NONE),是不是跟DDL操作特定类型兼容。

  • 在等待一个发生超时独占锁在桌子上,这可能的初始和最终的DDL操作阶段中需要简单。

  • 这个tmpdirinnodb_tmpdir文件系统的磁盘空间耗尽,而MySQL写入临时文件排序在磁盘中创建索引。有关更多信息,参见第15.12.3,“在线DDL空间要求”

  • 该操作需要很长的时间和并发DML修改表这么多,临时在线日志的大小超过了价值innodb_online_alter_log_max_size配置选项。这一条件的原因db_online_log_too_big误差

  • 并行DML修改,允许与原表的表定义,但不符合新的。操作失败,在最后,当MySQL试图运用并行DML语句的所有变化。例如,您可以插入重复的值为柱而唯一索引被创建,或者您可以插入NULL值为柱而创造一种主键在列的索引。通过并行DML更改的优先,和ALTER TABLE手术是有效的回滚

15.12.6在线DDL的局限性

以下限制适用于在线DDL操作:

  • 表复制时创建一个索引上TEMPORARY TABLE

  • 这个ALTER TABLE条款LOCK=NONE是不是如果有允许ON...CASCADE在...set零constraints on the table。

  • 在一个地方在线DDL操作就能完成的,它必须等待交易持有的元数据锁表提交或回滚。一个在线DDL操作可能会短暂的在执行阶段需要在表专用元数据锁,总是需要一个在最后阶段的操作更新表定义时。因此,交易保持元数据锁表会导致在线DDL操作块。把元数据锁桌上的交易可能已经开始前或在线DDL操作期间。长时间运行或不活跃的交易将桌上的元数据锁会导致在线DDL操作超时。

  • 当运行在在线DDL操作,线程的运行ALTER TABLE声明应用,同时运行在同一台从其他连接螺纹DML操作的在线日志。当DML操作的应用,可能会遇到重复的键输入错误(错误1062(23000):重复的条目),即使重复的条目仅仅是暂时的,会被在网上登录后进入。这是类似于一个外键约束检查的想法InnoDB在交易过程中的约束,必须持有。

  • OPTIMIZE TABLE对于一个InnoDB表映射到ALTER TABLE手术重建表和聚集索引更新索引统计和未使用的空间。次要指标不产生有效因为钥匙还插在他们出现在主键。OPTIMIZE TABLE支持与重建正则在线DDL支持添加和分区InnoDB

  • 创建表之前,MySQL 5.6,包括时间列(DATEDATETIMETIMESTAMP)并没有被重建使用ALGORITHM=COPY不支持ALGORITHM=INPLACE。在这种情况下,一个ALTER TABLE ... ALGORITHM=INPLACE操作返回以下错误:

    ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported.Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
  • 以下的限制,一般适用于在线DDL操作大表涉及重建表:

    • 没有暂停在线DDL操作或节流的I / O或CPU使用一个在线DDL操作机制。

    • 一个在线DDL操作回滚可以是昂贵的手术应不。

    • 长时间运行的在线DDL操作会导致复制滞后。一个在线DDL操作必须完成在主运行在运行前的奴隶。另外,DML是在掌握并行处理是处理奴隶在奴隶的DDL操作完成。

    对大型表运行在线DDL操作相关的更多信息,参见第15.12.2,“在线DDL性能和并发性”

15.13 InnoDB启动选项和系统变量

表15.19 InnoDB选项和变量引用

姓名命令行选项文件系统无功状态变量变量范围动态
daemon_memcached_enable_binlog全球
daemon_memcached_engine_lib_name全球
daemon_memcached_engine_lib_path全球
daemon_memcached_option全球
daemon_memcached_r_batch_size全球
daemon_memcached_w_batch_size全球
foreign_key_checks
忽略内置InnoDB全球
变量ignore_builtin_innodb全球
InnoDB
innodb_adaptive_flushing全球
innodb_adaptive_flushing_lwm全球
innodb_adaptive_hash_index全球
innodb_adaptive_hash_index_parts全球
innodb_adaptive_max_sleep_delay全球
innodb_api_bk_commit_interval全球
innodb_api_disable_rowlock全球
innodb_api_enable_binlog全球
innodb_api_enable_mdl全球
innodb_api_trx_level全球
innodb_autoextend_increment全球
innodb_autoinc_lock_mode全球
innodb_available_undo_logs全球
innodb_background_drop_list_empty全球
_ _ InnoDB缓冲池_ _字节数据全球
innodb_buffer_pool_bytes_dirty全球
innodb_buffer_pool_chunk_size全球
innodb_buffer_pool_debug全球
innodb_buffer_pool_dump_at_shutdown全球
innodb_buffer_pool_dump_now全球
innodb_buffer_pool_dump_pct全球
innodb_buffer_pool_dump_status全球
innodb_buffer_pool_filename全球
innodb_buffer_pool_instances全球
innodb_buffer_pool_load_abort全球
innodb_buffer_pool_load_at_startup全球
innodb_buffer_pool_load_now全球
innodb_buffer_pool_load_status全球
innodb_buffer_pool_pages_data全球
innodb_buffer_pool_pages_dirty全球
innodb_buffer_pool_pages_flushed全球
innodb_buffer_pool_pages_free全球
innodb_buffer_pool_pages_latched全球
innodb_buffer_pool_pages_misc全球
innodb_buffer_pool_pages_total全球
innodb_buffer_pool_read_ahead全球
innodb_buffer_pool_read_ahead_evicted全球
innodb_buffer_pool_read_ahead_rnd全球
innodb_buffer_pool_read_requests全球
innodb_buffer_pool_reads全球
innodb_buffer_pool_resize_status全球
innodb_buffer_pool_size全球
innodb_buffer_pool_wait_free全球
innodb_buffer_pool_write_requests全球
innodb_change_buffer_max_size全球
innodb_change_buffering全球
innodb_change_buffering_debug全球
InnoDB _检查站_ disabled全球
innodb_checksum_algorithm全球
innodb_cmp_per_index_enabled全球
innodb_commit_concurrency全球
压缩_ InnoDB _调试全球
innodb_compression_failure_threshold_pct全球
innodb_compression_level全球
_ InnoDB _压垫_ PCT _马克斯全球
innodb_concurrency_tickets全球
innodb_data_file_path全球
_ InnoDB数据_ fsyncs全球
InnoDB数据_ _ _家目录全球
innodb_data_pending_fsyncs全球
innodb_data_pending_reads全球
innodb_data_pending_writes全球
_ _ InnoDB数据读全球
innodb_data_reads全球
innodb_data_writes全球
innodb_data_written全球
innodb_dblwr_pages_written全球
innodb_dblwr_writes全球
innodb_ddl_log_crash_reset_debug全球
InnoDB _探明_死锁全球
innodb_dedicated_server全球
innodb_default_row_format全球
innodb_directories全球
InnoDB _ disable _ sort _ _缓存文件全球
innodb_doublewrite全球
innodb_fast_shutdown全球
让_ InnoDB _费尔_ _调试_脏页全球
innodb_file_per_table全球
innodb_fill_factor全球
innodb_flush_log_at_timeout全球
innodb_flush_log_at_trx_commit全球
innodb_flush_method全球
innodb_flush_neighbors全球
InnoDB _冲_ sync全球
innodb_flushing_avg_loops全球
innodb_force_load_corrupted全球
innodb_force_recovery全球
innodb_ft_aux_table全球
innodb_ft_cache_size全球
innodb_ft_enable_diag_print全球
innodb_ft_enable_stopword全球
innodb_ft_max_token_size全球
【中文解释】:东京、东京、东京、东京全球
innodb_ft_num_word_optimize全球
innodb_ft_result_cache_limit全球
innodb_ft_server_stopword_table全球
innodb_ft_sort_pll_degree全球
innodb_ft_total_cache_size全球
innodb_ft_user_stopword_table
innodb_have_atomic_builtins全球
innodb_io_capacity全球
innodb_io_capacity_max全球
innodb_limit_optimistic_insert_debug全球
innodb_lock_wait_timeout
innodb_log_buffer_size全球变化
_ _ InnoDB日志校验全球
_ _ pages _ InnoDB日志压缩全球
innodb_log_file_size全球
innodb_log_files_in_group全球
_ _ InnoDB日志组_家_目录全球
_ InnoDB日志_自旋_ CPU _ ABS _ LWM全球
_ InnoDB日志_自旋_ CPU _ PCT _ HWM全球
innodb_log_wait_for_flush_spin_hwm全球
innodb_log_waits全球
innodb_log_write_ahead_size全球
innodb_log_write_requests全球
innodb_log_writes全球
innodb_lru_scan_depth全球
最大_ InnoDB _肮脏的_ pages _ CTP全球
最大_ InnoDB _肮脏的_ pages _ PCT _ LWM全球
_ InnoDB _最大电磁_滞后全球
innodb_max_purge_lag_delay全球
innodb_max_undo_log_size全球
innodb_merge_threshold_set_all_debug全球
innodb_monitor_disable全球
innodb_monitor_enable全球
innodb_monitor_reset全球
innodb_monitor_reset_all全球
innodb_num_open_files全球
innodb_numa_interleave全球
innodb_old_blocks_pct全球
innodb_old_blocks_time全球
innodb_online_alter_log_max_size全球
innodb_open_files全球
innodb_optimize_fulltext_only全球
_ OS _ _ fsyncs InnoDB日志全球
innodb_os_log_pending_fsyncs全球
innodb_os_log_pending_writes全球
innodb_os_log_written全球
innodb_page_cleaners全球
innodb_page_size全球
innodb_page_size全球
innodb_pages_created全球
innodb_pages_read全球
innodb_pages_written全球
innodb_print_all_deadlocks全球
_打印DDL _ _ InnoDB日志全球
innodb_purge_batch_size全球
innodb_purge_rseg_truncate_frequency全球
innodb_purge_threads全球
innodb_random_read_ahead全球
innodb_read_ahead_threshold全球
innodb_read_io_threads全球
innodb_read_only全球
innodb_redo_log_encrypt全球
无误的复制品全球
_ _ innodb在线_超时回滚全球
innodb_rollback_segments全球
innodb_row_lock_current_waits全球
innodb_row_lock_time全球
innodb_row_lock_time_avg全球
innodb_row_lock_time_max全球
innodb_row_lock_waits全球
innodb_rows_deleted全球
innodb_rows_inserted全球
innodb_rows_read全球
innodb_rows_updated全球
innodb_saved_page_number_debug全球
innodb_scan_directories全球
innodb_sort_buffer_size全球
innodb_spin_wait_delay全球
innodb_stats_auto_recalc全球
innodb_stats_include_delete_marked全球
innodb_stats_method全球
_ _ innodb在线_元数据属性全球
_ _ InnoDB数据持久性全球
_ InnoDB数据_坚持_ _ pages样品全球
innodb_stats_transient_sample_pages全球
InnoDB状态文件
innodb_status_output全球
innodb_status_output_locks全球
innodb_strict_mode
innodb_sync_array_size全球
innodb_sync_debug全球
_自旋_ InnoDB _同步环全球
innodb_table_locks
日期时间_ InnoDB _ _ _文件路径全球
(Innodb)全球
innodb_thread_concurrency全球
innodb_thread_sleep_delay全球
_ tmpdir InnoDB
innodb_truncated_status_writes全球
innodb_trx_purge_view_update_only_debug全球
innodb_trx_rseg_n_slots_debug全球
innodb_undo_directory全球
innodb_undo_log_encrypt全球
innodb_undo_log_truncate全球
innodb_undo_logs全球
innodb_undo_tablespaces全球变化
innodb_use_native_aio全球
InnoDB _ version全球
innodb_write_io_threads全球
unique_checks

InnoDB的命令选项

  • --ignore-builtin-innodb

    财产价值
    命令行格式--ignore-builtin-innodb
    过时的是的(除去8.0.3)
    系统变量ignore_builtin_innodb
    范围全球
    动态
    set_var提示应用
    类型布尔

    在MySQL 5.1中,这个选项会造成服务器的行为如果内置InnoDB不存在,使InnoDB Plugin可用于代替。在MySQL 5.0,InnoDB是默认的存储引擎InnoDB插件不使用。此选项是为删除MySQL。

  • --innodb[=value]

    财产价值
    命令行格式--innodb[=value]
    过时的
    类型枚举
    默认值ON
    有效值

    OFF

    ON

    FORCE

    控制加载的InnoDB存储引擎,如果服务器编译InnoDB支持这个选项有一个三态格式,可能的值OFF打开(放),或FORCE。看到第5.6.1,“安装和卸载插件”

    禁用InnoDB,使用--innodb=OFF--skip-innodb。在这种情况下,因为默认的存储引擎InnoDB服务器无法启动,除非你同时使用--default-storage-engine--default-tmp-storage-engine设置默认的一些其他引擎的永久和临时

    这个InnoDB存储引擎可以不再被禁用,和--innodb=OFF--skip-innodb选项是过时的、没有效果。在警告他们的使用效果。这些选项将在未来的MySQL版本中删除。

  • --innodb-status-file

    财产价值
    命令行格式--innodb-status-file
    类型布尔
    默认值OFF

    控制是否InnoDB创建一个文件名为_ InnoDB的地位。pid在MySQL数据目录。如果启用,InnoDB定期写输出SHOW ENGINE INNODB STATUS这个文件

    默认情况下,则不创建文件。去创造它,开始mysqld--innodb-status-file=1选项该文件是在正常关机删除。

  • --skip-innodb

    禁用InnoDB存储引擎。看到的描述--innodb

InnoDB系统变量

  • daemon_memcached_enable_binlog

    财产价值
    命令行格式--daemon-memcached-enable-binlog=#
    系统变量daemon_memcached_enable_binlog
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值false

    启用这个选项主服务器使用InnoDBmemcached(插件daemon_memcached)与MySQL二进制日志。此选项只能设置在服务器启动。你还必须使MySQL二进制日志在主服务器上使用--log-bin选项

    有关更多信息,参见第15.19.7,“InnoDB Memcached插件和复制”

  • daemon_memcached_engine_lib_name

    财产价值
    命令行格式--daemon-memcached-engine-lib-name=library
    系统变量daemon_memcached_engine_lib_name
    范围全球
    动态
    set_var提示应用
    类型文件名
    默认值innodb_engine.so

    指定的共享库的实现InnoDBmemcached插件

    有关更多信息,参见第15.19.3,设置innodb memcached插件”

  • daemon_memcached_engine_lib_path

    财产价值
    命令行格式--daemon-memcached-engine-lib-path=directory
    系统变量daemon_memcached_engine_lib_path
    范围全球
    动态
    set_var提示应用
    类型目录名称
    默认值NULL

    路径的目录包含共享库的实现InnoDBmemcached插件默认值为空,表示MySQL插件目录。你不需要修改这个参数,除非指定memcached对于不同的存储引擎,位于MySQL插件目录以外的插件。

    有关更多信息,参见第15.19.3,设置innodb memcached插件”

  • daemon_memcached_option

    财产价值
    命令行格式--daemon-memcached-option=options
    系统变量daemon_memcached_option
    范围全球
    动态
    set_var提示应用
    类型字符串
    默认值

    用于传递空间分离的缓存选项标memcached内存对象缓存守护进程启动。例如,你可能会改变端口memcached听,减少同时连接的最大数目,换一个键/值对的最大内存大小,或启用调试的错误日志消息。

    看到第15.19.3,设置innodb memcached插件”使用细节。有关memcached选项,请参阅memcached个人网页

  • daemon_memcached_r_batch_size

    财产价值
    命令行格式--daemon-memcached-r-batch-size=#
    系统变量daemon_memcached_r_batch_size
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值1

    指定多少memcached读操作(get操作)执行之前做的COMMIT开始一个新的交易。副本daemon_memcached_w_batch_size

    这个值是默认设置,使表格通过SQL语句的任何改变都是立即可见的memcached运营你可能会增加减少频繁的开销有一个系统,基础表才被通过memcached接口如果设置的值太大,大量撤消或重做数据可以施加一定的存储开销,对于任何长期的交易。

    有关更多信息,参见第15.19.3,设置innodb memcached插件”

  • daemon_memcached_w_batch_size

    财产价值
    命令行格式--daemon-memcached-w-batch-size=#
    系统变量daemon_memcached_w_batch_size
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值1

    指定多少memcached写操作,如add配置,和incr执行前,做一个COMMIT开始一个新的交易。副本daemon_memcached_r_batch_size

    这个值是默认设置为1,在假设数据存储是在断电时保存重要的应立即提交。当存储非关键数据,你可能会增加这个值减少频繁的开销犯;但最后一N1未提交的写操作可以在发生崩溃时丢失。

    有关更多信息,参见第15.19.3,设置innodb memcached插件”

  • ignore_builtin_innodb

    财产价值
    命令行格式--ignore-builtin-innodb
    过时的是的(除去8.0.3)
    系统变量ignore_builtin_innodb
    范围全球
    动态
    set_var提示应用
    类型布尔

    看到的描述--ignore-builtin-innodb在下面InnoDB的命令选项在本节前面。这个变量是在MySQL 8中移除。

  • innodb_adaptive_flushing

    财产价值
    命令行格式--innodb-adaptive-flushing=#
    系统变量innodb_adaptive_flushing
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值ON

    指定是否动态调整冲洗速度脏页InnoDB缓冲池基于工作量。刷新率动态调整的目的是为了避免爆发的I/O活动。默认启用。看到第15.6.3.6,“配置InnoDB缓冲池冲洗”更多信息。通用I/O调优建议,看第8.5.8,“优化InnoDB的磁盘I / O”

  • innodb_adaptive_flushing_lwm

    财产价值
    命令行格式--innodb-adaptive-flushing-lwm=#
    系统变量innodb_adaptive_flushing_lwm
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值10
    最小值0
    最大值70

    定义了低水位代表比例重做日志文件的能力,自适应刷新启用。有关更多信息,参见第15.6.3.7,“微调InnoDB缓冲池冲洗”

  • innodb_adaptive_hash_index

    财产价值
    命令行格式--innodb-adaptive-hash-index=#
    系统变量innodb_adaptive_hash_index
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值ON

    是否InnoDB自适应哈希索引启用或禁用。它可能是可取的,这取决于你的工作量,动态地启用或禁用自适应哈希索引为了提高查询性能。由于自适应哈希索引不可能为所有的工作负载是有用的,它都启用和禁用进行基准测试,使用真实的工作负载。看到第15.4.3,“自适应哈希索引”详情

    默认启用。你可以修改这个参数的使用SET GLOBAL声明中,无需重新启动服务器。改变设置要求SYSTEM_VARIABLES_ADMIN超级的特权。你也可以使用--skip-innodb_adaptive_hash_index在服务器启动时禁用它。

    禁用自适应哈希索引的哈希表立即清空。正常操作可以在哈希表是空的继续,和执行查询,使用哈希表而不是直接访问索引B树。当自适应哈希索引被重新启用,哈希表是稠密的再次正常运行时。

  • innodb_adaptive_hash_index_parts

    财产价值
    命令行格式--innodb-adaptive-hash-index-parts=#
    系统变量innodb_adaptive_hash_index_parts
    范围全球
    动态
    set_var提示应用
    类型数字
    默认值8
    最小值1
    最大值512

    将自适应哈希索引检索系统。每个指标是绑定到特定的分区,每个分区由一个单独的闩锁保护。

    自适应哈希索引搜索系统默认分为8个部分。最大值设置为512。

    相关的信息,看第15.4.3,“自适应哈希索引”

  • innodb_adaptive_max_sleep_delay

    财产价值
    命令行格式--innodb-adaptive-max-sleep-delay=#
    系统变量innodb_adaptive_max_sleep_delay
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值150000
    最小值0
    最大值1000000

    许可证InnoDB自动调整值innodb_thread_sleep_delay向上或向下,根据目前的工作量。任何非零的值可以自动的动态调整innodb_thread_sleep_delay值,达到指定的最大值innodb_adaptive_max_sleep_delay选项此值表示的微秒数。这个选项可以在繁忙的系统是有用的,大于16InnoDB螺纹。(在实践中,有成百上千的同时连接MySQL数据库系统,它是最有价值的)

    有关更多信息,参见第15.6.5,“配置InnoDB线程并发

  • innodb_api_bk_commit_interval

    财产价值
    命令行格式--innodb-api-bk-commit-interval=#
    系统变量innodb_api_bk_commit_interval
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值5
    最小值1
    最大值1073741824

    多久自动提交空闲连接使用InnoDBmemcached接口,在秒。有关更多信息,参见第15.19.6.4,“控制InnoDB Memcached插件”的交易行为

  • innodb_api_disable_rowlock

    财产价值
    命令行格式--innodb-api-disable-rowlock=#
    系统变量innodb_api_disable_rowlock
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    使用此选项来禁用行锁时InnoDBmemcached执行DML操作。默认情况下,innodb_api_disable_rowlock是残疾人,这意味着memcached请求行锁get配置运营什么时候innodb_api_disable_rowlock启用,memcached请求而不是行锁表锁

    innodb_api_disable_rowlock不动。它必须被指定在mysqld在MySQL的配置文件或命令行输入。配置生效的插件安装,发生时,MySQL服务器启动。

    有关更多信息,参见第15.19.6.4,“控制InnoDB Memcached插件”的交易行为

  • innodb_api_enable_binlog

    财产价值
    命令行格式--innodb-api-enable-binlog=#
    系统变量innodb_api_enable_binlog
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    让您使用InnoDBmemcached与MySQL的插件二进制日志。有关更多信息,参见使InnoDB Memcached二进制日志

  • innodb_api_enable_mdl

    财产价值
    命令行格式--innodb-api-enable-mdl=#
    系统变量innodb_api_enable_mdl
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    锁表使用的InnoDBmemcached插件,因此无法删除或改变DDL通过SQL接口。有关更多信息,参见第15.19.6.4,“控制InnoDB Memcached插件”的交易行为

  • innodb_api_trx_level

    财产价值
    命令行格式--innodb-api-trx-level=#
    系统变量innodb_api_trx_level
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值0

    控制事务隔离级别我们是在一起的memcached接口。相应的常量的名称是:家庭

    有关更多信息,参见第15.19.6.4,“控制InnoDB Memcached插件”的交易行为

  • innodb_autoextend_increment

    财产价值
    命令行格式--innodb-autoextend-increment=#
    系统变量innodb_autoextend_increment
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值64
    最小值1
    最大值1000

    增量的大小(以兆字节)的大小自动扩展延伸InnoDB系统片文件当它变得完整。默认值是64。相关的信息,看系统表空间的数据文件的配置,和第15.7.1,“调整InnoDB系统表空间”

    这个innodb_autoextend_increment设置不影响文件表表空间文件或烟草公司文件这些文件是自动延伸的innodb_autoextend_increment设置最初的扩展是由少量,之后扩展发生在增量4MB。

  • innodb_autoinc_lock_mode

    财产价值
    命令行格式--innodb-autoinc-lock-mode=#
    系统变量innodb_autoinc_lock_mode
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值(>= 8.0.3)2
    默认值(<= 8.0.2)1
    有效值

    0

    1

    2

    这个锁模式用于生成自增量价值观。允许的值为0, 1,或2,为传统的,连续的,或交错,分别。

    默认设置为2(交错)在MySQL 8和1(连续)之前。变化交错锁模式为默认设置反映了从表为基础的基于行的复制作为默认的复制型的转变,在MySQL 5.7发生。基于语句的复制需要连续自动增量的锁模式确保自动增量值在可预测和可重复的顺序分配给SQL语句序列,而基于行的复制不到SQL语句的执行顺序的敏感。

    对于每个锁模式的特点,看InnoDB auto_increment锁模式

  • innodb_background_drop_list_empty

    财产价值
    命令行格式--innodb-background-drop-list-empty=#
    系统变量innodb_background_drop_list_empty
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    使innodb_background_drop_list_empty调试选项有助于延缓表创建到背景下拉列表是空的避免测试用例失败。例如,如果测试用例的一个地方台T1背景上的下拉列表,测试用例B等在创建表的背景下拉列表是空的t1

  • innodb_buffer_pool_chunk_size

    财产价值
    命令行格式--innodb-buffer-pool-chunk-size
    系统变量innodb_buffer_pool_chunk_size
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值134217728
    最小值1048576
    最大值innodb_buffer_pool_size / innodb_buffer_pool_instances

    innodb_buffer_pool_chunk_size定义块的大小InnoDB缓冲池大小调整操作。这个innodb_buffer_pool_size参数是动态的,它允许您调整缓冲池,无需重新启动服务器。

    为了避免复制所有缓冲池页面在调整操作,操作完成。默认情况下,innodb_buffer_pool_chunk_size为128MB(134217728字节)。包含在一个块的页面数量取决于价值innodb_page_sizeinnodb_buffer_pool_chunk_size可以增加或减少单位1MB(1048576字节)。

    下列条件时改变innodb_buffer_pool_chunk_size价值:

    重要

    护理时应更换innodb_buffer_pool_chunk_size,为改变这个值可以自动增加缓冲池的大小。在改变innodb_buffer_pool_chunk_size,计算它会对影响innodb_buffer_pool_size为确保缓冲池的大小是可以接受的。

    为了避免潜在的性能问题,块的数量(innodb_buffer_pool_size/innodb_buffer_pool_chunk_size)应不超过1000

    看到第15.6.3.2,“配置InnoDB缓冲池大小”更多信息

  • innodb_buffer_pool_debug

    财产价值
    命令行格式--innodb-buffer-pool-debug=#
    系统变量innodb_buffer_pool_debug
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    启用此选项允许多个缓冲池的情况下,缓冲池小于1GB,忽略1GB的最小缓冲池大小限制innodb_buffer_pool_instances。这个innodb_buffer_pool_debug选项仅可如果调试支持编译使用WITH_DEBUGCMake选项

  • innodb_buffer_pool_dump_at_shutdown

    财产价值
    命令行格式--innodb-buffer-pool-dump-at-shutdown=#
    系统变量innodb_buffer_pool_dump_at_shutdown
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值ON

    指定是否记录页面缓存在InnoDB缓冲池当MySQL服务器关闭,缩短热身在下一个过程的启动。通常结合使用innodb_buffer_pool_load_at_startup。这个innodb_buffer_pool_dump_pct选项定义最近使用的缓冲池页面转储的百分比。

    innodb_buffer_pool_dump_at_shutdowninnodb_buffer_pool_load_at_startup默认情况下启用

    有关更多信息,参见第15.6.3.8,“保存和恢复缓冲池的状态”

  • innodb_buffer_pool_dump_now

    财产价值
    命令行格式--innodb-buffer-pool-dump-now=#
    系统变量innodb_buffer_pool_dump_now
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    立即记录页面缓存在InnoDB缓冲池。通常结合使用innodb_buffer_pool_load_now

    有关更多信息,参见第15.6.3.8,“保存和恢复缓冲池的状态”

  • innodb_buffer_pool_dump_pct

    财产价值
    命令行格式--innodb-buffer-pool-dump-pct=#
    系统变量innodb_buffer_pool_dump_pct
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值25
    最小值1
    最大值100

    指定最近使用的每个缓冲池的读出并转储页的百分比。范围是1到100。默认值是25。例如,如果有4个缓冲池的100页,和innodb_buffer_pool_dump_pct设置为25,25最近使用的每个缓冲池页面被甩了。

  • innodb_buffer_pool_filename

    财产价值
    命令行格式--innodb-buffer-pool-filename=file
    系统变量innodb_buffer_pool_filename
    范围全球
    动态
    set_var提示应用
    类型文件名
    默认值ib_buffer_pool

    指定保存表空间ID和网页ID的列表中的文件的名称innodb_buffer_pool_dump_at_shutdowninnodb_buffer_pool_dump_now。表空间ID和网页ID保存在以下格式:空间,page_id。默认情况下,文件名为ib_buffer_pool位于InnoDB数据目录。必须指定非默认位置相对于数据目录。

    文件名可以在运行时指定使用SET声明:

    SET GLOBAL innodb_buffer_pool_filename='file_name'

    你也可以在启动时指定一个文件名,在启动字符串或MySQL的配置文件。当指定一个文件名在启动时,该文件必须存在或InnoDB将返回一个启动错误说明没有这样的文件或目录。

    有关更多信息,参见第15.6.3.8,“保存和恢复缓冲池的状态”

  • innodb_buffer_pool_instances

    财产价值
    命令行格式--innodb-buffer-pool-instances=#
    系统变量innodb_buffer_pool_instances
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值(其他)8 (or 1 if innodb_buffer_pool_size < 1GB
    默认值(Windows 32位平台)(autosized)
    最小值1
    最大值64

    在一些地区,InnoDB缓冲池分为。在多字节范围的缓冲池系统,将缓冲池为单独的实例可以提高并发性,减少争用不同的线程读写缓存页。每一页都存储在缓冲池中读取或被分配到一个缓冲池的情况下,随机,使用哈希函数。每个缓冲池管理自己的自由列表,刷新列表LRU,和所有其他数据结构连接缓冲池,并由它自己的缓冲池的保护互斥

    此选项仅当设置生效innodb_buffer_pool_size1GB以上。总的缓冲池大小的缓冲池中分。最佳的效率,指定一个组合innodb_buffer_pool_instancesinnodb_buffer_pool_size所以,每个缓冲池实例至少1GB。

    在32位Windows系统的默认值取决于值innodb_buffer_pool_size下面,我described:

    在所有其他平台,默认值是8的时候innodb_buffer_pool_size大于或等于1GB。否则,默认是1。

    相关的信息,看第15.6.3.2,“配置InnoDB缓冲池大小”

  • innodb_buffer_pool_load_abort

    财产价值
    命令行格式--innodb-buffer-pool-load-abort=#
    系统变量innodb_buffer_pool_load_abort
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    中断恢复过程InnoDB缓冲池触发器innodb_buffer_pool_load_at_startupinnodb_buffer_pool_load_now

    有关更多信息,参见第15.6.3.8,“保存和恢复缓冲池的状态”

  • innodb_buffer_pool_load_at_startup

    财产价值
    命令行格式--innodb-buffer-pool-load-at-startup=#
    系统变量innodb_buffer_pool_load_at_startup
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值ON

    指定MySQL服务器启动时,的,InnoDB缓冲池自动热身通过加载它在早些时候同一页。通常结合使用innodb_buffer_pool_dump_at_shutdown

    innodb_buffer_pool_dump_at_shutdowninnodb_buffer_pool_load_at_startup默认情况下启用

    有关更多信息,参见第15.6.3.8,“保存和恢复缓冲池的状态”

  • innodb_buffer_pool_load_now

    财产价值
    命令行格式--innodb-buffer-pool-load-now=#
    系统变量innodb_buffer_pool_load_now
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    立即热身这个InnoDB缓冲池通过加载的数据页,无需等待服务器重启。可以将缓存返回到已知状态在标杆有用,或准备好的MySQL服务器运行报告或维护查询后恢复其正常的工作量。

    有关更多信息,参见第15.6.3.8,“保存和恢复缓冲池的状态”

  • innodb_buffer_pool_size

    财产价值
    命令行格式--innodb-buffer-pool-size=#
    系统变量innodb_buffer_pool_size
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值134217728
    最小值5242880
    最大值(64位平台)2**64-1
    最大值(32位平台)2**32-1

    在字节的大小缓冲池记忆的地方,InnoDB缓存表和索引数据。默认值是134217728字节(128MB)。最大值取决于CPU的体系结构;最大值为4294967295(2三十二-1)在32位系统和18446744073709551615(2六十四1)64位系统。在32位系统,CPU架构和操作系统可以处以较低的实际最大尺寸比规定的最大值。当缓冲池的大小大于1GB,设置innodb_buffer_pool_instances一个大于1的值可以提高在一个繁忙的服务器的可扩展性。

    一个更大的缓冲池需要更少的磁盘I/O访问同一个表中的数据超过一次。在一个专用的数据库服务器,你可以设置缓冲池大小的百分之八十的机器的物理内存的大小。请注意以下潜在的问题,当配置缓冲池的大小,并准备缩减缓冲池的大小如果有必要。

    • 物理内存的竞争会导致操作系统分页。

    • InnoDB储备额外的内存缓冲区和控制结构,使总分配空间是比指定的缓冲池大小约10%.。

    • 地址缓冲池空间必须是连续的,它可以是一个问题,在Windows系统的DLL特定地址的负载。

    • 时间初始化缓冲池的大小成正比。对大缓冲池的情况下,初始化的时间可能是重要的。减少初始化期间,你可以保存在缓冲池的状态服务器的关闭和恢复它在服务器启动。看到第15.6.3.8,“保存和恢复缓冲池的状态”

    当你增加或减少缓冲池的大小,执行运算块。块的大小是确定的innodb_buffer_pool_chunk_size配置选项,其中有一个默认的128 MB。

    缓冲池的大小必须等于或多innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances。如果你更改缓冲池的尺寸值不等于或多innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances缓冲池的大小,自动调整到一个值等于或多innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances

    innodb_buffer_pool_size可动态设置,可让您调整缓冲池,无需重新启动服务器。这个Innodb_buffer_pool_resize_status状态变量的报告在线缓冲池大小操作的状态。看到第15.6.3.2,“配置InnoDB缓冲池大小”更多信息

    如果innodb_dedicated_server启用的innodb_buffer_pool_size值是自动配置如果它没有明确的定义。有关更多信息,参见第15.6.13,“启用自动配置一个专用的MySQL服务器”

  • innodb_change_buffer_max_size

    财产价值
    命令行格式--innodb-change-buffer-max-size=#
    系统变量innodb_change_buffer_max_size
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值25
    最小值0
    最大值50

    为最大尺寸InnoDB变化的缓冲,作为总的大小的百分比缓冲池。你可以增加这个值为重的插入、更新和删除MySQL服务器,活动,或减少这一不变的MySQL服务器用于报告数据。有关更多信息,参见第15.4.2,“Change Buffer”,和第15.6.4配置变化,InnoDB缓冲”。通用I/O调优建议,看第8.5.8,“优化InnoDB的磁盘I / O”

  • innodb_change_buffering

    财产价值
    命令行格式--innodb-change-buffering=#
    系统变量innodb_change_buffering
    范围全球
    动态
    set_var提示应用
    类型枚举
    默认值all
    有效值

    none

    inserts

    deletes

    changes

    purges

    all

    是否InnoDB执行变化的缓冲,优化延迟写操作的次要指标,使I/O操作可以按顺序执行。允许值如下表描述。值也可以指定数值。

    表15.20的允许值innodb_change_buffering

    价值数字值描述
    none0没有缓冲区的任何操作。
    inserts1缓冲器插入操作
    deletes2缓冲区删除标记操作;严格地说,写,标记索引记录后删除清洗操作过程。
    changes3缓冲器插入和删除标记操作。
    purges4缓冲区的物理删除操作发生在后台。
    all5默认的。缓冲区插入,删除标记操作和清洗。

    有关更多信息,参见第15.4.2,“Change Buffer”,和第15.6.4配置变化,InnoDB缓冲”。通用I/O调优建议,看第8.5.8,“优化InnoDB的磁盘I / O”

  • innodb_change_buffering_debug

    财产价值
    命令行格式--innodb-change-buffering-debug=#
    系统变量innodb_change_buffering_debug
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值0
    最大值2

    设置一个调试标志InnoDB变化的缓冲。1值的力量改变缓冲区的所有变化。2值导致崩溃在合并。默认值0表示变化的缓冲调试标志没有设置。此选项仅当调试支持编译使用WITH_DEBUGCMake选项

  • innodb_checkpoint_disabled

    财产价值
    命令行格式--innodb-checkpoint-disabled=#
    介绍8.0.2
    系统变量innodb_checkpoint_disabled
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    这是一个调试选项只用于专家调试使用。它禁用检查站,故意服务器出口一直倡导InnoDB恢复它应该只是一个短的间隔功能,通常在运行DML操作写入重做日志条目,需要恢复服务器退出。此选项仅可如果调试支持编译使用WITH_DEBUGCMake选项

  • innodb_checksum_algorithm

    财产价值
    命令行格式--innodb-checksum-algorithm=#
    系统变量innodb_checksum_algorithm
    范围全球
    动态
    set_var提示应用
    类型枚举
    默认值crc32
    有效值

    innodb

    crc32

    none

    strict_innodb

    strict_crc32

    strict_none

    指定如何生成和验证校验和存储在磁盘块InnoDB表空间。默认值为innodb_checksum_algorithmCRC32

    版本MySQL企业备份到3.8.0不支持备份表空间使用crc32校验。MySQL企业备份在3.8.1添加CRC32校验的支持,具有一定的局限性。指的是MySQL企业备份3.8.1改变历史的更多信息。

    的价值innodb向后兼容早期版本的MySQL。的价值CRC32使用一个更快的计算每一个修改过的块的校验算法,并检查校验和为每个磁盘的读。它扫描块32位一次,这是速度比innodb校验算法,扫描块在8位的时间。的价值写一个定值的校验和字段而不是计算值基于数据块。在一个表空间的块可以混合使用旧的,新的,没有校验值,作为数据被修改,逐步更新;一旦在一个表空间的块被修改为使用crc32算法,相关的表不能由早期版本的MySQL读。

    一个校验和算法的严格形式报告错误,如果遇到一个有效的而非一个表空间中的校验和值匹配。建议你在一个新的实例只能使用严格的设置,设置为第一次的表空间。严格的设置是稍快,因为他们不需要计算校验值在所有磁盘读取。

    下表显示之间的差异noneInnoDB,和crc32选项的值,和他们的严格的同行。innodb,和CRC32写入指定的类型为每个数据块的校验值,但兼容性接受其他校验值验证时一块读操作期间。严格的设置也接受有效的校验值但打印错误消息时,一个有效的非匹配校验值时。使用严格的形式能使验证更快如果所有InnoDB在一个实例的数据文件在相同的创建innodb_checksum_algorithm价值

    表15.21允许innodb_checksum_algorithm值

    价值生成的校验(写作时)允许校验(读书的时候)
    一个常数生成的任何校验和noneInnoDB,或crc32
    InnoDB校验和的计算软件,使用原来的算法InnoDB生成的任何校验和noneInnoDB,或crc32
    CRC32校验和计算crc32算法,可能做一个硬件辅助。生成的任何校验和noneInnoDB,或crc32
    strict_none一个常数生成的任何校验和noneInnoDB,或crc32InnoDB打印一个错误信息如果有效但不匹配的校验和时。
    strict_innodb校验和的计算软件,使用原来的算法InnoDB生成的任何校验和noneInnoDB,或crc32InnoDB打印一个错误信息如果有效但不匹配的校验和时。
    strict_crc32校验和计算crc32算法,可能做一个硬件辅助。生成的任何校验和noneInnoDB,或crc32InnoDB打印一个错误信息如果有效但不匹配的校验和时。

  • innodb_cmp_per_index_enabled

    财产价值
    命令行格式--innodb-cmp-per-index-enabled=#
    系统变量innodb_cmp_per_index_enabled
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF
    有效值

    OFF

    ON

    使每个索引中的相关统计数据压缩INFORMATION_SCHEMA.INNODB_CMP_PER_INDEX表因为这些数据可以是昂贵的收集,只有启用此选项在开发,测试,或从实例中的性能调优相关InnoDB压缩的

    有关更多信息,参见第24.35.7,“information_schema innodb_cmp_per_index和innodb_cmp_per_index_reset表”,和第15.9.1.4,“运行时”InnoDB表压缩监控

  • innodb_commit_concurrency

    财产价值
    命令行格式--innodb-commit-concurrency=#
    系统变量innodb_commit_concurrency
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值0
    最小值0
    最大值1000

    螺纹可以犯罪在同一时间。值0(默认值)允许任意数量的交易同时承诺

    价值innodb_commit_concurrency不能在运行时改变从零到零或反之亦然。该值可以从一个非零的值更改为另一个。

  • innodb_compress_debug

    财产价值
    命令行格式--innodb-compress-debug=#
    系统变量innodb_compress_debug
    范围全球
    动态
    set_var提示应用
    类型枚举
    默认值none
    有效值

    none

    zlib

    lz4

    lz4hc

    把所有的表没有定义一个使用指定的压缩算法COMPRESSION每个表的属性。此选项仅可如果调试支持编译使用WITH_DEBUGCMake选项

    相关的信息,看第15.9.2,“InnoDB页面压缩”

  • innodb_compression_failure_threshold_pct

    财产价值
    命令行格式--innodb-compression-failure-threshold-pct=#
    系统变量innodb_compression_failure_threshold_pct
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值5
    最小值0
    最大值100

    定义一个表的压缩失效率的门槛,作为一个百分比,此时开始添加填充在MySQL压缩的网页避免昂贵的压缩失败。当通过此阈值,MySQL开始在每一个新的压缩页面留下更多的自由空间,动态调整量的自由空间到页面大小指定的百分比innodb_compression_pad_pct_max。零值禁用机制监视压缩效率和动态调整填充量。

    有关更多信息,参见第15.9.1.6,“压缩的OLTP工作负载”

  • innodb_compression_level

    财产价值
    命令行格式--innodb-compression-level=#
    系统变量innodb_compression_level
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值6
    最小值0
    最大值9

    指定使用zlib压缩水平InnoDB压缩的表和索引。较高的值可以容纳更多的数据到一个存储设备,在更多的CPU开销的费用在压缩。一个较低的值可以减少CPU开销在存储空间并不重要,或者你期望的数据是不可压缩的。

    有关更多信息,参见第15.9.1.6,“压缩的OLTP工作负载”

  • innodb_compression_pad_pct_max

    财产价值
    命令行格式--innodb-compression-pad-pct-max=#
    系统变量innodb_compression_pad_pct_max
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值50
    最小值0
    最大值75

    指定可以保留在每个压缩自由空间的最大百分比网页,让房间整理数据和修改日志内页时压缩的表或索引的更新和数据可能被压缩。只适用于当innodb_compression_failure_threshold_pct设置为非零值,并率压缩失败通过临界点

    有关更多信息,参见第15.9.1.6,“压缩的OLTP工作负载”

  • innodb_concurrency_tickets

    财产价值
    命令行格式--innodb-concurrency-tickets=#
    系统变量innodb_concurrency_tickets
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值5000
    最小值1
    最大值4294967295

    determines the number of螺纹能进入InnoDB同时。一个线程被放置在一个队列时,它试图进入InnoDB如果线程数已经达到并发上限。当一个线程被允许进入InnoDB,它是一个特定的数相等的价值innodb_concurrency_tickets,和线程可以进入和离开InnoDB在使用之前都可以自由的门票。在这一点上,线程再次被并发检查约束(和可能的排队)下一次试图进入InnoDB。默认值是5000

    用一个小的innodb_concurrency_tickets值,只需要几行过程公平竞争与较大的交易过程中的许多行小交易。一个小的缺点innodb_concurrency_tickets价值是大的交易必须通过循环队列多次才可以完成,扩展需要完成任务的时间。

    有一个大的innodb_concurrency_tickets大的交易价值,花更少的时间等待排在最后一位(控制innodb_thread_concurrency)和更多的时间检索行。大的交易也需要更少的旅行通过队列来完成他们的任务。一个大的缺点innodb_concurrency_tickets价值是,太多的交易在同一时间运行能使较小的交易让他们等待更长的时间才执行。

    一个非零innodb_thread_concurrency值,你可能需要调整innodb_concurrency_tickets价值上升或下降到较大和较小的交易之间的最佳平衡。这个SHOW ENGINE INNODB STATUS报告显示,其余为执行交易的电流通过排队购票数量。这个数据也可以得到trx_concurrency_tickets列的INFORMATION_SCHEMA.INNODB_TRX

    有关更多信息,参见第15.6.5,“配置InnoDB线程并发

  • innodb_data_file_path

    财产价值
    命令行格式--innodb-data-file-path=name
    系统变量innodb_data_file_path
    范围全球
    动态
    set_var提示应用
    类型字符串
    默认值ibdata1:12M:autoextend

    定义名称,大小,和属性InnoDB系统片数据文件。如果你不指定一个值innodb_data_file_path,默认行为是创建一个单一的自动扩展数据文件,略大于12MB的,命名为ibdata1

    一个数据文件规范完整的语法包括文件名,文件大小,和autoextend最大值属性:

    file_name:file_size[:autoextend[:max:max_file_size]]
    

    文件大小指定KB、MB或GB(即1024MB)通过添加KMG的大小值。如果指定字节的数据文件大小(KB),倍数的1024这样做。否则,KB值舍入到最近的兆字节(MB)的边界。对文件的大小的总和至少要稍大于12mb。

    最小的文件大小是强制的第一SYSTEM表空间的数据文件,以确保有足够的空间doublewrite缓冲页:

    单个文件的大小限制是由操作系统决定的。你可以设置文件的大小超过4GB,支持大文件的操作系统。你也可以使用原始磁盘分区的数据文件

    这个autoextend最大值属性可以只用于指定数据文件中的最后一个innodb_data_file_path设置。例如:

    [mysqld]innodb_data_file_path=ibdata1:50M;ibdata2:12M:autoextend:max:500MB

    如果您指定的autoextend选项,InnoDB扩展数据文件,如果它运行的自由空间。这个autoextend增量64mb默认。修改增加,改变innodb_autoextend_increment系统变量

    系统表空间的数据文件的完整目录路径是通过连接定义的路径的形成innodb_data_home_dirinnodb_data_file_path

    有关配置系统表空间的数据文件的更多信息,参见第15.6.1,“InnoDB启动配置”

  • innodb_data_home_dir

    财产价值
    命令行格式--innodb-data-home-dir=dir_name
    系统变量innodb_data_home_dir
    范围全球
    动态
    set_var提示应用
    类型目录名称

    对于目录路径的共同部分InnoDB系统片数据文件。此设置不影响定位文件表表空间时innodb_file_per_table启用。默认值是MySQL数据目录如果你指定的值为空字符串,你可以指定一个绝对文件路径innodb_data_file_path

    一个斜线,需要指定一个值时innodb_data_home_dir。。。。。。。例如:

    [mysqld]innodb_data_home_dir = /path/to/myibdata/

    相关的信息,看第15.6.1,“InnoDB启动配置”

  • innodb_ddl_log_crash_reset_debug

    财产价值
    命令行格式--innodb-ddl-log-crash-reset-debug=#
    介绍8.0.3
    系统变量innodb_ddl_log_crash_reset_debug
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值False

    启用调试选项重置DDL日志碰撞喷油柜1。此选项仅当调试支持编译使用WITH_DEBUGCMake选项

  • innodb_deadlock_detect

    财产价值
    命令行格式--innodb-deadlock-detect
    系统变量innodb_deadlock_detect
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值ON

    使用此选项来禁用死锁检测。在高并发系统中,死锁检测可以造成经济放缓时多线程等待同一个锁。有时,它可能是更有效地禁用死锁检测和依靠innodb_lock_wait_timeout设置事务回滚时,死锁发生。

    相关的信息,看第15.5.5.2,“死锁检测和回滚”

  • innodb_dedicated_server

    财产价值
    命令行格式--innodb-dedicated-server=#
    介绍8.0.3
    系统变量innodb_dedicated_server
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    什么时候innodb_dedicated_server启用,InnoDB自动配置选项,根据服务器上检测到的内存量:

    只考虑启用这个选项如果你的MySQL实例运行在一个专用的服务器,MySQL服务器能够消耗所有可用的系统资源。启用此选项不如果你的MySQL实例共享系统资源和其他应用的建议。

    有关更多信息,参见第15.6.13,“启用自动配置一个专用的MySQL服务器”

  • innodb_default_row_format

    财产价值
    命令行格式--innodb-default-row-format=#
    系统变量innodb_default_row_format
    范围全球
    动态
    set_var提示应用
    类型枚举
    默认值DYNAMIC
    有效值

    DYNAMIC

    COMPACT

    REDUNDANT

    这个innodb_default_row_format选项定义默认行格式InnoDB表和用户创建的临时表。默认设置是DYNAMIC。其他的允许值粉盒REDUNDANT。这个压缩的行格式,这是不使用的支持系统片,不能定义为默认

    新创建的表用来定义行格式innodb_default_row_format当一个row_format选项不明确指定或当ROW_FORMAT=DEFAULT使用

    当一个ROW_FORMAT选项不明确指定或当ROW_FORMAT=DEFAULT使用任何操作,重建表也默默地改变表格的行格式定义的格式innodb_default_row_format。有关更多信息,参见第15.10.2,“指定行格式为表”

    内部InnoDB临时表创建由服务器处理查询的使用动态行格式,不管的innodb_default_row_format设置

  • innodb_directories

    财产价值
    命令行格式--innodb-directories=#
    介绍8.0.4
    系统变量innodb_directories
    范围全球
    动态
    set_var提示应用
    类型字符串

    定义目录扫描表空间文件启动。使用此选项,当移动或恢复表空间文件到一个新的位置,当服务器脱机。它还用于指定使用绝对路径创建表空间文件目录或驻留的数据目录之外。

    目录定义innodb_data_home_dirinnodb_undo_directory,和datadir自动添加到innodb_directories论点价值,毫不留情地innodb_directories选项指定明确的

    innodb_directories可以指定在启动命令或在MySQL选项文件选项。行情是在参数值用否则分号(;)是由一些命令解释器解释为一个特殊的字符。(UNIX shell作为命令终止符,例如。)

    启动命令:

    mysqld --innodb-directories="directory_path_1;directory_path_2"
    

    MySQL选项文件:

    [mysqld]
    innodb_directories="directory_path_1;directory_path_2"
    

    通配符表达式不能用于指定目录。

    这个innodb_directories扫描指定的目录的子目录也穿越。复制目录和子目录被丢弃从目录列表进行扫描。

    有关更多信息,参见第15.7.7,“移动表空间文件,当服务器脱机”

  • innodb_disable_sort_file_cache

    财产价值
    命令行格式--innodb-disable-sort-file-cache=#
    系统变量innodb_disable_sort_file_cache
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    禁用操作系统的文件系统缓存归并排序的临时文件。效果与相当于打开这个文件O_DIRECT

  • innodb_doublewrite

    财产价值
    命令行格式--innodb-doublewrite
    系统变量innodb_doublewrite
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值ON

    When enabed(The default),InnoDB存储所有数据两次,先doublewrite缓冲而现在数据文件。这个变量可以关闭--skip-innodb_doublewrite为基准或案件时,最高性能的需要而不是关注数据完整性或可能出现的故障。

    如果系统表空间的数据文件(ibdata*文件)位于融合IO设备支持原子写道,doublewrite缓冲自动禁用,Fusion-io原子将用于所有数据文件。因为doublewrite缓冲的设置是全局的,doublewrite缓冲也是数据文件驻留在非融合IO硬件禁用。此功能仅对Fusion-io硬件只启用了Fusion-io nvmfs Linux支持。要充分利用这一特点,innodb_flush_method设置直接_ O推荐

    相关的信息,看第15.4.6,“Doublewrite Buffer”

  • innodb_fast_shutdown

    财产价值
    命令行格式--innodb-fast-shutdown[=#]
    系统变量innodb_fast_shutdown
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值1
    有效值

    0

    1

    2

    这个InnoDB关机模式。如果值为0,InnoDB做一个缓慢关闭,全净化和改变缓冲区合并前关闭。如果该值为-1(默认),InnoDB跳过这些操作在关闭时,这个过程称为快速关机。如果该值为2,InnoDB将其日志和关闭冷,如果MySQL撞;没有提交的事务都失去了,但崩溃恢复操作使得下一次启动需要更长的时间。

    慢关机可能需要几分钟,甚至几小时在极端情况下,大量的数据仍然是缓冲。MySQL的主要版本之间升级或降级使用前慢关断技术,使所有的数据文件都在升级更新文件格式的充分准备。

    使用innodb_fast_shutdown=2在急救或故障的情况下,如果数据损坏风险获取最快关机。

  • innodb_fil_make_page_dirty_debug

    财产价值
    命令行格式--innodb-fil-make-page-dirty-debug=#
    系统变量innodb_fil_make_page_dirty_debug
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值0
    最大值2**32-1

    默认情况下,设置innodb_fil_make_page_dirty_debug在一个表空间ID立即垢表空间的第一页。如果innodb_saved_page_number_debug设置为非默认值,设置让_ InnoDB _费尔_ _调试_脏页垢指定页。这个innodb_fil_make_page_dirty_debug选项仅可如果调试支持编译使用WITH_DEBUGCMake选项

  • innodb_file_per_table

    财产价值
    命令行格式--innodb-file-per-table
    系统变量innodb_file_per_table
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值ON

    什么时候innodb_file_per_tableThe default .InnoDB存储数据和索引的每个新创建的表在一个单独的.ibd文件而不是SYSTEM表空间。这些表的存储回收当表删除或截断。此设置启用InnoDB如表特征压缩。看到第15.7.4“InnoDB文件,每个表的表空间”更多信息

    有可能innodb_file_per_table也意味着一个ALTER TABLE操作动作InnoDB从系统表空间到一个单独的表.ibd文件的情况下ALTER TABLErebuilds(the tableALGORITHM=COPY)。这个规则的一个例外是放置在系统表空间表的使用TABLESPACE=innodb_system选项CREATE TABLEALTER TABLE。这些表是不受影响的innodb_file_per_table设置只能移动到文件的每个表的表空间使用ALTER TABLE ... TABLESPACE=innodb_file_per_table

    什么时候innodb_file_per_table被禁用,InnoDB存储在表和索引数据ibdata文件构成系统片。这个设置可以减少操作如文件系统操作的性能开销DROP TABLETRUNCATE TABLE。这是最合适的服务器环境,整个存储设备致力于MySQL数据。因为SYSTEM表空间没有缩小,并共享所有数据库中实例,避免加载大量在空间受限的系统临时数据时innodb_file_per_table被禁用。在这种情况下,建立一个单独的实例,这样就可以降低整个实例的回收空间。

    innodb_file_per_table默认情况下启用。考虑禁用如果mysql 5.5或更早的向后兼容性是一个问题。这将防止ALTER TABLE从运动InnoDB表空间到个人from the system鸡传染性法氏囊病文件

    innodb_file_per_table是动态的,可以设置打开(放)OFF使用设置全局。你也可以在MySQL设置这个选项配置文件my.cnfmy.ini)但这需要关闭和重新启动服务器。

    动态变化的价值要求SYSTEM_VARIABLES_ADMIN超级的特权和立即影响所有连接的操作。

    这个innodb_file_per-table设置不影响创作InnoDB临时表。在InnoDB临时表在共享临时表空间中创建。

  • innodb_fill_factor

    财产价值
    命令行格式--innodb-fill-factor=#
    系统变量innodb_fill_factor
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值100
    最小值10
    最大值100

    InnoDB执行大容量加载创建或重新生成索引时。这个索引创建的方法称为排序的索引构建

    innodb_fill_factor定义空间的百分比在每个树页填充排序索引建立的过程,用剩余的空间留给未来的指数增长。例如,设置innodb_fill_factor80储量的空间为未来的指数增长各树20%页。实际的比例可能会有所不同。这个innodb_fill_factor设置被解释为暗示而不是硬限制。

    一个innodb_fill_factor100叶簇自由未来的指数增长的索引页1/16的空间设置。

    innodb_fill_factor适用于B树的叶与非叶级页。它不适用于用于外部页TEXTBLOB条目.

    有关更多信息,参见第15.8.2.3,“分类指标”

  • innodb_flush_log_at_timeout

    财产价值
    系统变量innodb_flush_log_at_timeout
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值1
    最小值1
    最大值2700

    写日志都冲洗Ninnodb_flush_log_at_timeout允许在冲超时时间要增加以减少冲洗和避免二进制日志组影响性能的承诺。设置为默认innodb_flush_log_at_timeout是每秒一次

  • innodb_flush_log_at_trx_commit

    财产价值
    命令行格式--innodb-flush-log-at-trx-commit[=#]
    系统变量innodb_flush_log_at_trx_commit
    范围全球
    动态
    set_var提示应用
    类型枚举
    默认值1
    有效值

    0

    1

    2

    严格控制之间的平衡依从性犯罪操作和更高的性能,可能当提交相关的I/O操作的重组和分批进行。你可以实现更好的性能,通过改变默认值,但你可能会失去多达二在交易的崩溃。

    • 需要完全符合ACID 1默认值。这种价值的内容,InnoDB日志缓冲区写出来的日志文件在每个事务提交和日志文件冲洗磁盘

    • 一个值为0的内容,InnoDB日志缓冲区写入到日志文件约每秒一次日志文件刷新到磁盘。没有写日志缓冲区的日志文件进行事务提交。每秒一次冲洗不100%保证发生的每一秒,由于进程调度问题。因为磁盘操作只发生约每秒一次的刷新,你可以失去了一次交易的任何mysqld进程崩溃

    • 一个值为2的内容,InnoDB日志缓冲区写入到日志文件的每个事务的提交和日志文件刷新到磁盘后约每秒一次。每秒一次冲洗是不能保证每天都会发生二由于进程调度问题。因为磁盘操作只发生约每秒一次的刷新,你可以失去了一次在操作系统崩溃的交易或停电。

    • InnoDB日志冲洗频率控制innodb_flush_log_at_timeout,它允许你设置日志冲洗频率N秒(其中N1…二千七百,用默认值1)。然而,任何mysqld进程崩溃可以抹去了N第二交易

    • DDL更改和其他内部InnoDB活动冲洗InnoDBindependently的日志innodb_flush_log_at_trx_commit设置DDL日志总是冲在提交事务。

    • InnoDB崩溃恢复作品无论在innodb_flush_log_at_trx_commit设置交易都是采用完全或完全删除。

    在复制设置,使用耐久性和一致性InnoDB与交易:

    • 如果启用了二进制日志,设置sync_binlog=1

    • 总是设置innodb_flush_log_at_trx_commit=1

    注意安全

    许多操作系统和磁盘硬件傻瓜刷新到磁盘操作。他们可能会告诉mysqld,冲洗已经发生,即使它没有。在这种情况下,交易的耐久性是不是推荐的设置保证,在最坏的情况下,停电可以腐败InnoDB数据在SCSI磁盘控制器或磁盘本身加快文件刷新使用电池备份磁盘高速缓存,使操作更安全。你也可以尝试禁用缓存写入磁盘的硬件高速缓存。

  • innodb_flush_method

    财产价值
    命令行格式--innodb-flush-method=name
    系统变量innodb_flush_method
    范围全球
    动态
    set_var提示应用
    类型字符串
    默认值(Windows)unbuffered
    默认值(UNIX)fsync
    有效值(Windows)

    unbuffered

    normal

    有效值(UNIX)

    fsync

    O_DSYNC

    littlesync

    nosync

    O_DIRECT

    O_DIRECT_NO_FSYNC

    用来定义的方法脸红数据InnoDB数据文件日志文件,从而影响I/O吞吐量。

    在类Unix系统,默认值是fsync。在Windows中,默认值是无缓冲

    笔记

    在MySQL 5.0,innodb_flush_method选项可以指定数值

    这个innodb_flush_method类UNIX系统的选项包括:

    • fsyncInnoDB使用fsync()系统调用同花顺的数据文件和日志文件。fsync是默认设置

    • O_DSYNCInnoDB使用法语语法语法打开并刷新日志文件,和fsync()将数据文件InnoDB不使用O_DSYNC正因为有问题在许多的Unix变种。

    • littlesync:此选项用于内部性能测试,目前不支持。使用您自己的风险。

    • nosync:此选项用于内部性能测试,目前不支持。使用您自己的风险。

    • O_DIRECTInnoDB使用直接_ O(或directio()在Solaris)打开数据文件,并使用fsync()刷新的数据和日志文件。这个选项是FreeBSD,一些GNU / Linux和Solaris版本,可用。

    • O_DIRECT_NO_FSYNCInnoDB使用直接_ O在冲洗的I / O,但跳过fsync()系统调用之后。此设置适用于某些类型的文件系统,而不是其他。例如,它不适用于XFS。如果你不确定你是否使用文件系统需要一个fsync(),例如保存所有文件的元数据,使用O_DIRECT相反

    这个innodb_flush_methodWindows系统选项包括:

    • unbufferedInnoDB利用模拟异步I/O和非缓冲的I / O.

    • normalInnoDB利用模拟异步I/O和缓冲我/ O.

    每个设置如何影响性能取决于硬件配置和工作量。基准您的特定配置来决定设置使用,或是否保留默认设置。检查Innodb_data_fsyncs状态变量看整体数量fsync()为每个呼叫。混读和写操作会影响你的工作表现如何设置。例如,在一个硬件RAID控制器和电池备份系统的写缓存,O_DIRECT可以帮助避免双缓冲间InnoDB缓冲池和操作系统的文件系统缓存。在一些系统中InnoDB数据和日志文件位于三、默认值或o_dsync可能是快读的工作量多SELECT声明.一直以硬件和工作量,反映您的生产环境试验参数。通用I/O调优建议,看第8.5.8,“优化InnoDB的磁盘I / O”

    如果innodb_dedicated_server启用的innodb_flush_method值是自动配置如果它没有明确的定义。有关更多信息,参见第15.6.13,“启用自动配置一个专用的MySQL服务器”

  • innodb_flush_neighbors

    财产价值
    命令行格式--innodb-flush-neighbors
    系统变量innodb_flush_neighbors
    范围全球
    动态
    set_var提示应用
    类型枚举
    默认值(>= 8.0.3)0
    默认值(<= 8.0.2)1
    有效值

    0

    1

    2

    指定是否冲洗从一个页面InnoDB缓冲池所以其他的冲脏页在相同的程度

    • 在弯曲的背景innodb_flush_neighbors从没有其他脏页从缓冲池冲洗。

    • 设置1冲连续在同一程度的脏页从缓冲池。

    • 从缓冲池在同一程度上设置2冲脏页。

    表中的数据时,存储在一个传统的硬盘存储装置、冲洗等邻居页在一个操作中减少I/O开销(主要用于磁盘寻道操作)相比,在不同时代的个人页面冲洗。存储在表中的数据SSD,寻找时间不是一个重要的因素,你可以设置这个选项为0展开写操作。相关的信息,看第15.6.3.7,“微调InnoDB缓冲池冲洗”

  • innodb_flush_sync

    财产价值
    命令行格式--innodb-flush-sync=#
    系统变量innodb_flush_sync
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值ON

    这个innodb_flush_sync参数,默认情况下是启用的,原因innodb_io_capacity设置被忽略阵阵I/O活动发生在检查站。坚持限制InnoDB通过定义背景的I/O活动innodb_io_capacity设置,禁用InnoDB _冲_ sync

    相关的信息,看第15.6.8,“配置InnoDB主线程I/O率”

  • innodb_flushing_avg_loops

    财产价值
    命令行格式--innodb-flushing-avg-loops=#
    系统变量innodb_flushing_avg_loops
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值30
    最小值1
    最大值1000

    迭代的次数InnoDB保持先前计算的快照冲洗状态,控制如何快速自适应刷新响应变化工作负载。增加值率脸红业务工作量变化平稳,逐步改变。降低值进行自适应冲洗迅速适应工作负载的变化,从而导致尖峰冲洗活动如果工作量的增加和减少突然。

    相关的信息,看第15.6.3.7,“微调InnoDB缓冲池冲洗”

  • innodb_force_load_corrupted

    财产价值
    命令行格式--innodb-force-load-corrupted
    系统变量innodb_force_load_corrupted
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    许可证InnoDB在启动时被标记为损坏的负荷表。使用只有在排除故障,恢复,否则无法访问数据。当故障排除是完整的,禁用此设置并重新启动服务器。

  • innodb_force_recovery

    财产价值
    命令行格式--innodb-force-recovery=#
    系统变量innodb_force_recovery
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值0
    最小值0
    最大值6

    这个崩溃恢复模式,通常只发生在严重故障情况。可能的值是从0到6。这些值的意义和重要的信息innodb_force_recovery,看到第15.20.2,迫使InnoDB恢复”

    警告

    只有这个变量设置为一个值大于0在急救情况,以便你能开始InnoDB和转储你的表。作为一种安全措施,InnoDB防止INSERTUPDATE,或DELETE操作时innodb_force_recovery大于0。一个innodb_force_recovery4或更高的地方设置InnoDB为只读模式

    这些限制可能会导致复制管理命令失败与错误,复制存储的奴隶身份登录InnoDB

  • innodb_ft_aux_table

    财产价值
    命令行格式--innodb-ft-aux-table=#
    系统变量innodb_ft_aux_table
    范围全球
    动态
    set_var提示应用
    类型字符串

    指定一个名称InnoDB表包含一个全文指数这个变量是用于诊断目的。

    当你设置这个变量名称的格式db_name/table_name,的information_schemaINNODB_FT_INDEX_TABLEINNODB_FT_INDEX_CACHEINNODB_FT_CONFIGINNODB_FT_DELETED,和INNODB_FT_BEING_DELETED关于搜索索引信息为指定的表。

    有关更多信息,参见第15.14.4,“InnoDB information_schema全文索引表”

  • innodb_ft_cache_size

    财产价值
    命令行格式--innodb-ft-cache-size=#
    系统变量innodb_ft_cache_size
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值8000000
    最小值1600000
    最大值80000000

    内存分配,以字节为单位,为InnoDB全文搜索索引缓存,具有解析内存中的文档创建InnoDB全文指数索引的插入和更新只提交到磁盘时innodb_ft_cache_size达到大小限制innodb_ft_cache_size定义缓存大小对每个表的基础。设置所有表全球极限,看innodb_ft_total_cache_size

    有关更多信息,参见InnoDB全文索引缓存

  • innodb_ft_enable_diag_print

    财产价值
    命令行格式--innodb-ft-enable-diag-print=#
    系统变量innodb_ft_enable_diag_print
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    是否启用额外的全文搜索(FTS)诊断输出。该选项主要用于先进的FTS调试并不会对大多数用户。打印输出到错误日志信息包括:

    • FTS指数同步的进步(当FTS缓存达到极限)。例如:

      FTS SYNC for table test, deleted count: 100 size: 10000 bytes
      SYNC words: 100
      
    • FTS的优化进程。例如:

      FTS start optimize test
      FTS_OPTIMIZE: optimize "mysql"
      FTS_OPTIMIZE: processed "mysql"
      
    • CTS建立进度指标。例如:

      Number of doc processed: 1000
      
    • FTS的查询,查询的语法分析树,字的重量,查询处理时间和内存的使用,印刷。例如:

      FTS Search Processing time: 1 secs: 100 millisec: row(s) 10000
      Full Search Memory: 245666 (bytes),  Row: 10000
      
  • innodb_ft_enable_stopword

    财产价值
    命令行格式--innodb-ft-enable-stopword=#
    系统变量innodb_ft_enable_stopword
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值ON

    指定一组停用词与一InnoDB全文当时创建索引。如果innodb_ft_user_stopword_table选项设置、停用词是从那张桌子。否则,如果innodb_ft_server_stopword_table选项设置、停用词是从那张桌子。否则,一个内置的设置应用默认的构建。

    有关更多信息,参见第12.9.4,“全文构建”

  • innodb_ft_max_token_size

    财产价值
    命令行格式--innodb-ft-max-token-size=#
    系统变量innodb_ft_max_token_size
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值84
    最小值10
    最大值84

    的话,都存储在一个最大字符长度InnoDB全文指数设置在这个价值限度减少索引的大小,从而加快查询,省去长关键词或字母的任意集合,不真实的话,是不可能的搜索词。

    有关更多信息,参见第12.9.6,“微调MySQL全文搜索”

  • innodb_ft_min_token_size

    财产价值
    命令行格式--innodb-ft-min-token-size=#
    系统变量innodb_ft_min_token_size
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值3
    最小值0
    最大值16

    的话,都存储在一个最小长度InnoDB全文指数增加这个值减少索引的大小,从而加快查询,通过省略常用字,不太可能在搜索方面是重要的,如英语单词。使用CJK(中国、日本、韩国的内容)的字符集,指定值1。

    有关更多信息,参见第12.9.6,“微调MySQL全文搜索”

  • innodb_ft_num_word_optimize

    财产价值
    命令行格式--innodb-ft-num-word-optimize=#
    系统变量innodb_ft_num_word_optimize
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值2000

    在每个单词的进程数OPTIMIZE TABLE操作上InnoDBFULLTEXT指数因为批量插入或更新操作的表包含全文搜索索引可能需要大量的索引维护纳入所有的改变,你可能会做一系列的OPTIMIZE TABLE报表,每次拿起最后离开了。

    有关更多信息,参见第12.9.6,“微调MySQL全文搜索”

  • innodb_ft_result_cache_limit

    财产价值
    命令行格式--innodb-ft-result-cache-limit=#
    系统变量innodb_ft_result_cache_limit
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值2000000000
    最小值1000000
    最大值2**32-1

    这个InnoDB全文搜索查询结果缓存限制(定义字节)/全文搜索查询或每线程。中间和最后InnoDB全文搜索查询结果处理在内存中。使用innodb_ft_result_cache_limit地方上的全文搜索查询结果缓存大小限制以避免在非常大的情况下过度消费的记忆InnoDB全文搜索查询结果(例如百万行,百万或数百个)。分配内存时的全文搜索的查询处理。如果结果缓存大小限制时,将返回一个错误提示查询超过了允许的最大内存。

    最大值innodb_ft_result_cache_limit所有平台的类型和位大小是2×32-1。

  • innodb_ft_server_stopword_table

    财产价值
    命令行格式--innodb-ft-server-stopword-table=db_name/table_name
    系统变量innodb_ft_server_stopword_table
    范围全球
    动态
    set_var提示应用
    类型字符串
    默认值NULL

    此选项用于指定您自己的InnoDB全文索引字列表InnoDB表配置你自己的停用词表为特定InnoDB表,使用innodb_ft_user_stopword_table

    配置innodb_ft_server_stopword_table包含列表的停用词的表的名称,在格式db_name/table_name

    停用词表必须在配置存在innodb_ft_server_stopword_tableinnodb_ft_enable_stopword必须启用innodb_ft_server_stopword_table选择之前必须配置你的创造全文指数

    停用词表必须InnoDB表,包含一个varchar命名列value

    有关更多信息,参见第12.9.4,“全文构建”

  • innodb_ft_sort_pll_degree

    财产价值
    命令行格式--innodb-ft-sort-pll-degree=#
    系统变量innodb_ft_sort_pll_degree
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值2
    最小值1
    最大值32

    在一个并行索引和标记文本使用的线程数InnoDB全文当建立一个索引搜索指数

    相关的信息,看第15.8.2.4,“InnoDB全文索引”,和innodb_sort_buffer_size

  • innodb_ft_total_cache_size

    财产价值
    命令行格式--innodb-ft-total-cache-size=#
    系统变量innodb_ft_total_cache_size
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值640000000
    最小值32000000
    最大值1600000000

    总内存分配,以字节为单位的InnoDB所有表的全文检索索引缓存。创造了无数的表格,每一个全文搜索索引,可以使用可用内存的重要部分。innodb_ft_total_cache_size对所有全文检索索引可以避免过度的内存消耗全球内存限制。如果全球的极限是由索引操作达到强制同步触发。

    有关更多信息,参见InnoDB全文索引缓存

  • innodb_ft_user_stopword_table

    财产价值
    命令行格式--innodb-ft-user-stopword-table=db_name/table_name
    系统变量innodb_ft_user_stopword_table
    范围全球会议
    动态
    set_var提示应用
    类型字符串
    默认值NULL

    此选项用于指定您自己的InnoDB全文在一个特定的表的索引词列表。配置你自己的停用词列表的所有InnoDB表格的使用innodb_ft_server_stopword_table

    配置innodb_ft_user_stopword_table包含列表的停用词的表的名称,在格式db_name/table_name

    停用词表必须在配置存在innodb_ft_user_stopword_tableinnodb_ft_enable_stopword必须启用innodb_ft_user_stopword_table必须配置在你创造的全文指数

    停用词表必须InnoDB表,包含一个varchar命名列value

    有关更多信息,参见第12.9.4,“全文构建”

  • innodb_io_capacity

    财产价值
    命令行格式--innodb-io-capacity=#
    系统变量innodb_io_capacity
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值200
    最小值100
    最大值(64位平台)2**64-1
    最大值(32位平台)2**32-1

    这个innodb_io_capacity参数设置一个上限的I/O操作次数,每秒钟完成的InnoDB后台任务,例如冲洗的页面缓冲池合并数据从变化的缓冲

    这个innodb_io_capacity极限是所有缓冲池的情况下,总的限制。当脏页刷新,极限分缓冲池实例之间。

    innodb_io_capacity应设置为I/O操作次数,系统每秒可以执行。理想情况下,保持设定的低的现实,但不能太低,背景活动落后。如果该值太高,数据从缓冲池和插入缓冲太快缓存提供显着的好处。

    默认值是200。对于忙碌的能力较高的I/O速率的系统中,你可以设置一个更高的价值,帮助服务器处理高行的变化率相关的后台维护工作。

    在一般情况下,你可以增加价值的驱动器用于数函数InnoDBI/O。例如,你可以增加系统使用多个磁盘或固态硬盘(SSD)的价值。

    默认设置200一般是足够的下端SSD。一个更高的目标,总线连接的SSD,考虑如1000更高的设置,例如。对于个别5400转或7200转硬盘系统,你可能会降低价值100据估计,这代表比例的I/O操作每秒(IOPS)提供给老一代的磁盘驱动器,可以执行约100 IOPS。

    虽然你可以指定一个很高的值如一百万,实践上这种大的价值已经几乎没有任何好处。一般而言,20000或更高的值是不推荐,除非你已经证明你的工作量不足的较低值。

    考虑写负载时调整innodb_io_capacity。大系统的写入工作负载可能会从一个更高的环境效益。较低的设置可能是足够的一个小的写入负载系统。

    你可以设置innodb_io_capacity任意数的100或最大的大innodb_io_capacity_maxinnodb_io_capacity可以设置在MySQL选项文件(my.cnfmy.ini)或动态改变使用SET GLOBAL声明,这就要求SYSTEM_VARIABLES_ADMIN超级的特权

    这个innodb_flush_sync配置选择原因innodb_io_capacity设置要爆发的I/O活动发生在关卡中忽略。innodb_flush_sync默认情况下启用

    看到第15.6.8,“配置InnoDB主线程I/O率”更多信息。关于一般信息InnoDBI/O性能,看第8.5.8,“优化InnoDB的磁盘I / O”

  • innodb_io_capacity_max

    财产价值
    命令行格式--innodb-io-capacity-max=#
    系统变量innodb_io_capacity_max
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值see description
    最小值100
    最大值(Windows 64位平台)2**32-1
    最大值(UNIX,64-bit平台)2**64-1
    最大值(32位平台)2**32-1

    如果冲洗活动落后,InnoDB能冲洗比施加的限制更积极innodb_io_capacityinnodb_io_capacity_max定义一个上限数量的I/O操作以每秒InnoDB在这种情况下,后台任务。

    这个innodb_io_capacity_max设置所有缓冲池的情况下,总的限制。

    如果你指定一个innodb_io_capacity设置在启动但不指定值innodb_io_capacity_maxinnodb_io_capacity_max默认的值的两倍innodb_io_capacity,与一个最小值2000。

    当配置innodb_io_capacity_max,twice theinnodb_io_capacity往往是一个很好的起点。默认值2000是用于工作负载,使用固态硬盘(SSD)或多个磁盘驱动器。设定2000是工作量不使用SSD或多个磁盘驱动器可能太高,可以让太多的冲洗。一个常规的磁盘驱动器,200和400之间的设置建议。一个高端、总线连接的SSD,考虑如2500更高的设置。与innodb_io_capacity设置,使设置低的现实,但不能太低,InnoDB无法超越的innodb_io_capacity的限制,如果有必要的话。

    考虑写负载时调整innodb_io_capacity_max。大系统的写入工作负载可以从一个更高的环境效益。较低的设置可能是足够的一个小的写入负载系统。

    innodb_io_capacity_max不能设置为一个值低于innodb_io_capacity价值

    设置innodb_io_capacity_max默认使用SET声明(SET GLOBAL innodb_io_capacity_max=DEFAULT集)innodb_io_capacity_max两个最大的价值

    相关的信息,看第15.6.3.7,“微调InnoDB缓冲池冲洗”

  • innodb_limit_optimistic_insert_debug

    财产价值
    命令行格式--innodb-limit-optimistic-insert-debug=#
    系统变量innodb_limit_optimistic_insert_debug
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值0
    最小值0
    最大值2**32-1

    限制记录数目B-树网页0意味着没有强加限制的默认值。此选项仅可如果调试支持编译使用WITH_DEBUGCMake选项

  • innodb_lock_wait_timeout

    财产价值
    命令行格式--innodb-lock-wait-timeout=#
    系统变量innodb_lock_wait_timeout
    范围全球会议
    动态
    set_var提示应用
    类型整数
    默认值50
    最小值1
    最大值1073741824

    长时间在秒InnoDB交易等待行锁在放弃之前。默认值是50秒。一个事务试图访问一行,被另一个InnoDB在大多数事务等待这许多秒之前发出下面的写访问错误的行:

    错误1205(hy000):锁等待超时超标;尝试重新启动交易

    当锁等待超时,当前语句回滚(不是整个交易)。有整个事务回滚,以启动服务器--innodb_rollback_on_timeout选项参见第15.20.4,“InnoDB错误处理”

    你可能会降低这个值为高度交互的应用程序或OLTP系统,快速显示用户的反馈或将更新为队列处理后。你可以增加这个值对于长期运行的后台操作,如变换步骤在数据仓库等其他大的插入或更新操作完成。

    innodb_lock_wait_timeout适用于InnoDB行锁。MySQL表锁不发生在InnoDB这个暂停不适用于等待表锁。

    锁等待超时值不适用于死锁什么时候innodb_deadlock_detect启用(默认)因为InnoDB检测到死锁立即回滚一个僵持不下的交易。什么时候innodb_deadlock_detect被禁用,InnoDB依靠innodb_lock_wait_timeout当事务回滚死锁发生。看到第15.5.5.2,“死锁检测和回滚”

    innodb_lock_wait_timeout可以在运行时设置的设置全局SET SESSION声明。改变全球设置要求SYSTEM_VARIABLES_ADMIN超级的特权和影响所有的客户,随后连接操作。任何客户端都可以改变SESSION设置innodb_lock_wait_timeout,这只影响客户端

  • innodb_log_buffer_size

    财产价值
    命令行格式--innodb-log-buffer-size=#
    系统变量(>= 8.0.11)innodb_log_buffer_size
    系统变量(<= 8.0.4)innodb_log_buffer_size
    范围(>= 8.0.11)全球
    范围(<= 8.0.4)全球
    动态(>= 8.0.11)
    动态(<= 8.0.4)
    set_var提示应用(>= 8.0.11)
    set_var提示应用(<= 8.0.4)
    类型整数
    默认值16777216
    最小值1048576
    最大值4294967295

    大小的缓冲区字节InnoDB用写的日志文件在磁盘。默认为16MB。一个大的日志缓冲区使大交易运行而不需要在事务日志写入磁盘犯罪。因此,如果你有交易,更新、插入或删除行,很多,使得日志缓冲区更大的节省了磁盘I/O相关的信息,看InnoDB内存配置,和8.5.4节,“优化InnoDB重做日志”。通用I/O调优建议,看第8.5.8,“优化InnoDB的磁盘I / O”

  • innodb_log_checksums

    财产价值
    命令行格式--innodb-log-checksums=#
    系统变量innodb_log_checksums
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值ON

    启用或禁用和重做日志页。

    innodb_log_checksums=ON使crc-32c校验算法重做日志页。什么时候innodb_log_checksums是残疾人,重做日志的页面校验和字段的内容被忽略。

    在重做日志标题页和重做日志检查点页面没有禁用校验。

  • innodb_log_compressed_pages

    财产价值
    命令行格式--innodb-log-compressed-pages=#
    系统变量innodb_log_compressed_pages
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值ON

    特异影像再compressed网页写入重做日志文件。重新压缩时可能发生的变化对压缩后的数据。

    innodb_log_compressed_pages默认情况下启用防止腐败可能发生的,如果一个不同版本的zlib压缩算法应用在恢复。如果你是肯定的zlib版本将不会改变,你可以禁用_ _ pages _ InnoDB日志压缩为了减少工作量,修改压缩数据重做日志生成。

    测量启用或禁用的影响innodb_log_compressed_pages重做日志,比较代都设置同样的工作量下。选择测量重做日志生成包括观察日志序列号(lsn)在LOGSHOW ENGINE INNODB STATUS输出,或监测Innodb_os_log_written对于写入重做日志文件的字节数状态。

    相关的信息,看第15.9.1.6,“压缩的OLTP工作负载”

  • innodb_log_file_size

    财产价值
    命令行格式--innodb-log-file-size=#
    系统变量innodb_log_file_size
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值50331648
    最小值4194304
    最大值512GB / innodb_log_files_in_group

    在每个字节的大小日志文件在一个日志组。日志文件的大小(innodb_log_file_size*innodb_log_files_in_group)不能超过一个,略小于最大值512gb。例如一对255 GB的日志文件,方法的限制,但不超过。默认值是48mb。

    一般来说,对日志文件的大小应足够大,使服务器能够顺利的高峰和低谷负荷的活动,这通常意味着有足够的日志空间来处理一个多小时写作业。这个值越大,越检查点刷新活动在缓冲池的要求,节省磁盘I / O的日志文件也会更大崩溃恢复慢,虽然在MySQL 5.5和更高的回收性能使日志文件大小不一的考虑改进。

    最小innodb_log_file_size为4MB

    相关的信息,看InnoDB日志文件配置。通用I/O调优建议,看第8.5.8,“优化InnoDB的磁盘I / O”

    如果innodb_dedicated_server启用的innodb_log_file_size值是自动配置如果它没有明确的定义。有关更多信息,参见第15.6.13,“启用自动配置一个专用的MySQL服务器”

  • innodb_log_files_in_group

    财产价值
    命令行格式--innodb-log-files-in-group=#
    系统变量innodb_log_files_in_group
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值2
    最小值2
    最大值100

    日志文件日志组InnoDB写在一个圆形的方式的文件。默认值是2(推荐)。该文件的位置指定innodb_log_group_home_dir。日志文件的大小(innodb_log_file_size*innodb_log_files_in_group)可高达512GB

    相关的信息,看InnoDB日志文件配置

  • innodb_log_group_home_dir

    财产价值
    命令行格式--innodb-log-group-home-dir=dir_name
    系统变量innodb_log_group_home_dir
    范围全球
    动态
    set_var提示应用
    类型目录名称

    的目录路径InnoDB重做日志文件文件,其数量是指定的innodb_log_files_in_group。如果你不指定任何InnoDB日志的变量,默认是创建两个文件命名ib_logfile0ib_logfile1在MySQL数据目录。日志文件的大小是由innodb_log_file_size系统变量

    相关的信息,看InnoDB日志文件配置

  • innodb_log_spin_cpu_abs_lwm

    财产价值
    命令行格式--innodb-log-spin-cpu-abs-lwm=#
    介绍8.0.11
    系统变量innodb_log_spin_cpu_abs_lwm
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值80
    最小值0
    最大值4294967295

    定义了最小的CPU使用率低于该用户线程不再自旋等待刷新重做。该值表示为和CPU核心的使用。例如,80的默认值是80%的单CPU核心。在一个多核处理器系统,值为150表示一个CPU核心加上第二CPU核心50 % 100 %用途使用。

    相关的信息,看8.5.4节,“优化InnoDB重做日志”

  • innodb_log_spin_cpu_pct_hwm

    财产价值
    命令行格式--innodb-log-spin-cpu-pct-hwm=#
    介绍8.0.11
    系统变量innodb_log_spin_cpu_pct_hwm
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值50
    最小值0
    最大值100

    定义了最大数量的CPU使用率,用户线程不再自旋等待刷新重做。该值表示为所有CPU核心处理能力的百分比总和。默认值是50%。例如,100%使用两个CPU核是50%的组合的CPU处理能力的服务器上有四个CPU核心。

    这个innodb_log_spin_cpu_pct_hwm配置选项方面处理器亲和。例如,如果一个服务器有48个内核,但mysqld过程是在只有四个CPU核心,其他44个CPU核心被忽略。

    相关的信息,看8.5.4节,“优化InnoDB重做日志”

  • innodb_log_wait_for_flush_spin_hwm

    财产价值
    命令行格式--innodb-log-wait-for-flush-spin-hwm=#
    介绍8.0.11
    系统变量innodb_log_wait_for_flush_spin_hwm
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值400
    最小值0
    最大值(64位平台)2**64-1
    最大值(32位平台)2**32-1

    定义最大平均日志刷新时间超过该用户线程不再自旋等待刷新重做。默认值为400微秒。

    相关的信息,看8.5.4节,“优化InnoDB重做日志”

  • innodb_log_write_ahead_size

    财产价值
    命令行格式--innodb-log-write-ahead-size=#
    系统变量innodb_log_write_ahead_size
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值8192
    最小值512 (log file block size)
    最大值Equal to innodb_page_size

    定义先写块大小的重做日志,在字节。为了避免读写,集innodb_log_write_ahead_size匹配的操作系统或文件系统缓存块大小。默认设置是8192个字节。读写时,重做日志块不完全缓存的操作系统或文件系统由于不匹配之间提前写块大小为重做日志和操作系统或文件系统缓存块大小。

    有效值为innodb_log_write_ahead_size是的倍数InnoDB日志文件的块大小(2N)。最小值是InnoDB日志文件的块大小(512)。向前写时不会出现最小值是指定的。最大值是相等的innodb_page_size价值。如果你指定一个值innodb_log_write_ahead_size是大于innodb_page_size的价值,innodb_log_write_ahead_size设置截断的innodb_page_size价值

    设置innodb_log_write_ahead_size太低的值与操作系统或文件系统的高速缓存块大小的结果读写。设置的值太高,可能会有轻微的影响fsync对日志文件的写入性能由于被写在一块。

    相关的信息,看8.5.4节,“优化InnoDB重做日志”

  • innodb_lru_scan_depth

    财产价值
    命令行格式--innodb-lru-scan-depth=#
    系统变量innodb_lru_scan_depth
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值1024
    最小值100
    最大值(64位平台)2**64-1
    最大值(32位平台)2**32-1

    影响算法和启发式算法的参数脸红操作的InnoDB缓冲池。主要感兴趣的I/O密集型工作负载的性能专家整定。它规定,每个缓冲池的实例,多远了缓冲池的LRU页面列表页面清洁螺纹扫描寻找脏页冲洗。这是一个进行一次后台操作。

    设置小于默认的通常是最适合的工作。的值是比需要更高性能的可能影响。只考虑增加价值,如果你有多余的I/O能力的典型工作负荷下。相反,如果一个写密集型工作量饱和你的I/O能力,减少的价值,特别是在一个大的缓冲池的情况。

    当调整innodb_lru_scan_depth,从一个低值和配置设置上很少看到的零页的目标。同时,考虑调整innodb_lru_scan_depth改变缓冲池的实例的数量时,自innodb_lru_scan_depth*innodb_buffer_pool_instances定义由页面清洁螺纹每秒钟执行的工作量。

    相关的信息,看第15.6.3.7,“微调InnoDB缓冲池冲洗”。通用I/O调优建议,看第8.5.8,“优化InnoDB的磁盘I / O”

  • innodb_max_dirty_pages_pct

    财产价值
    命令行格式--innodb-max-dirty-pages-pct=#
    系统变量innodb_max_dirty_pages_pct
    范围全球
    动态
    set_var提示应用
    类型数字
    默认值(>= 8.0.3)90
    默认值(<= 8.0.2)75
    最小值0
    最大值99.99

    InnoDB试图脸红数据从缓冲池这样的比例脏页不超过这个值

    这个innodb_max_dirty_pages_pct设置了冲洗活动目标。它不影响刷新率。有关管理冲洗率信息,看第15.6.3.6,“配置InnoDB缓冲池冲洗”

    相关的信息,看第15.6.3.7,“微调InnoDB缓冲池冲洗”。通用I/O调优建议,看第8.5.8,“优化InnoDB的磁盘I / O”

  • innodb_max_dirty_pages_pct_lwm

    财产价值
    命令行格式--innodb-max-dirty-pages-pct-lwm=#
    系统变量innodb_max_dirty_pages_pct_lwm
    范围全球
    动态
    set_var提示应用
    类型数字
    默认值(>= 8.0.3)10
    默认值(<= 8.0.2)0
    最小值0
    最大值99.99

    定义一个代表比例的低水位脏页在这preflushing能够控制脏页率。值0禁用预冲洗行为完全。有关更多信息,参见第15.6.3.7,“微调InnoDB缓冲池冲洗”

  • innodb_max_purge_lag

    财产价值
    命令行格式--innodb-max-purge-lag=#
    系统变量innodb_max_purge_lag
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值0
    最小值0
    最大值4294967295

    定义清除队列的最大长度。默认值为0表示没有限制(无延迟)。

    使用此选项将延迟INSERTUPDATE,和DELETE操作时净化操作滞后(见15.3节,“InnoDB的多版本”

    这个InnoDB交易系统维护一个列表,有删除标记的记录交易指数UPDATEDELETE业务。the length of the list represents thepurge_lag价值。什么时候purge_lag超过innodb_max_purge_lagINSERTUPDATE,和DELETE操作被延迟

    为了防止过多的延迟,在极端的情况下,purge_lag庞大,您可以限制延迟设置innodb_max_purge_lag_delay配置选项。延迟计算在清洗批开始。

    一个典型的设置问题的工作量可能是100万,假设交易是小,大小只有100个字节,它允许有100MB的unpurgedInnoDB表中的行

    滞后值显示在历史记录列表的长度TRANSACTIONSInnoDB监视器输出。This is the example滞后值输出:20

    ------------
    TRANSACTIONS
    ------------
    Trx id counter 0 290328385
    Purge done for trx's n:o < 0 290315608 undo n:o < 0 17
    History list length 20
    

    通用I/O调优建议,看第8.5.8,“优化InnoDB的磁盘I / O”

  • innodb_max_purge_lag_delay

    财产价值
    命令行格式--innodb-max-purge-lag-delay=#
    系统变量innodb_max_purge_lag_delay
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值0
    最小值0

    指定由延时微秒的最大延迟innodb_max_purge_lag配置选项。一个非零的值表示从基于价值的公式计算延迟时间的上限innodb_max_purge_lag。零意味着默认是没有上限的延迟间隔施加。

    通用I/O调优建议,看第8.5.8,“优化InnoDB的磁盘I / O”

  • innodb_max_undo_log_size

    财产价值
    命令行格式--innodb-max-undo-log-size=#
    系统变量innodb_max_undo_log_size
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值1073741824
    最小值10485760
    最大值2**64-1

    定义一个阈值大小的撤销表空间。如果一个undo表空间超过阈值,它可以被标记为截断时innodb_undo_log_truncate启用。默认值是1073741824字节(1024 MIB)。

    有关更多信息,参见第15.7.9,“Truncating Undo Tablespaces”

  • innodb_merge_threshold_set_all_debug

    财产价值
    命令行格式--innodb-merge-threshold-set-all-debug=#
    系统变量innodb_merge_threshold_set_all_debug
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值50
    最小值1
    最大值50

    定义一个页面百分点值覆盖当前索引页MERGE_THRESHOLD所有的指标,目前在数据字典缓存设置。此选项仅可如果调试支持编译使用WITH_DEBUGCMake选择。Related information,see第15.6.12,“配置合并阈值的索引页”

  • innodb_monitor_disable

    财产价值
    命令行格式--innodb-monitor-disable=[counter|module|pattern|all]
    系统变量innodb_monitor_disable
    范围全球
    动态
    set_var提示应用
    类型字符串

    禁用InnoDB度量计数器。计数器数据可查询使用INFORMATION_SCHEMA.INNODB_METRICS表使用的信息,参见第15.14.6,“InnoDB information_schema度量表”

    innodb_monitor_disable='latch'禁用数据收集SHOW ENGINE INNODB MUTEX。有关更多信息,参见第13.7.6.15,“显示引擎语法”

  • innodb_monitor_enable

    财产价值
    命令行格式--innodb-monitor-enable=[counter|module|pattern|all]
    系统变量innodb_monitor_enable
    范围全球
    动态
    set_var提示应用
    类型字符串

    使能够InnoDB度量计数器。计数器数据可查询使用INFORMATION_SCHEMA.INNODB_METRICS表使用的信息,参见第15.14.6,“InnoDB information_schema度量表”

    innodb_monitor_enable='latch'启用统计信息收集SHOW ENGINE INNODB MUTEX。有关更多信息,参见第13.7.6.15,“显示引擎语法”

  • innodb_monitor_reset

    财产价值
    命令行格式--innodb-monitor-reset=[counter|module|pattern|all]
    系统变量innodb_monitor_reset
    范围全球
    动态
    set_var提示应用
    类型字符串

    重置计数值InnoDB度量计数器零。计数器数据可查询使用INFORMATION_SCHEMA.INNODB_METRICS表使用的信息,参见第15.14.6,“InnoDB information_schema度量表”

    innodb_monitor_reset='latch'重置统计报告SHOW ENGINE INNODB MUTEX。有关更多信息,参见第13.7.6.15,“显示引擎语法”

  • innodb_monitor_reset_all

    财产价值
    命令行格式--innodb-monitor-reset-all=[counter|module|pattern|all]
    系统变量innodb_monitor_reset_all
    范围全球
    动态
    set_var提示应用
    类型字符串

    重置所有值(最小,最大,等等)为InnoDB度量计数器。计数器数据可查询使用INFORMATION_SCHEMA.INNODB_METRICS表使用的信息,参见第15.14.6,“InnoDB information_schema度量表”

  • innodb_numa_interleave

    财产价值
    命令行格式--innodb-numa-interleave=#
    系统变量innodb_numa_interleave
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    使用NUMA交织分配内存的政策InnoDB缓冲池。什么时候innodb_numa_interleave启用NUMA内存策略设置为MPOL_INTERLEAVE对于mysqld过程。后InnoDB缓冲池分配,NUMA内存策略设置回mpol_default。对于innodb_numa_interleave选项可用,MySQL必须启用NUMA编译Linux系统。

    CMake设置默认WITH_NUMA基于当前平台的价值NUMA支持有关更多信息,参见2.8.4”部分,MySQL源配置选项”

  • innodb_old_blocks_pct

    财产价值
    命令行格式--innodb-old-blocks-pct=#
    系统变量innodb_old_blocks_pct
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值37
    最小值5
    最大值95

    指定的近似百分比InnoDB缓冲池使用旧的块子列表。值的范围是5到95。默认值是37(即3/8的池)。经常结合使用innodb_old_blocks_time

    有关更多信息,参见第15.6.3.4,“缓冲池扫描耐”。对缓冲池的管理信息,LRU算法,并驱逐政策,看第15.6.3.1,“InnoDB缓冲池”

  • innodb_old_blocks_time

    财产价值
    命令行格式--innodb-old-blocks-time=#
    系统变量innodb_old_blocks_time
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值1000
    最小值0
    最大值2**32-1

    非零的值,防止缓冲池被那仅仅是一个短暂的时期引用的数据填充,如在全表扫描。增加这个值提供了对全表扫描干扰保护缓存中的数据缓冲池。

    指定以毫秒为单位的块插入老多久子列表要移动到新的子表的首次访问后留在那里。如果该值为0,一块插入老子马上行动的新的子表的首次访问,无论多么快的访问发生后插入。如果该值大于0,块仍然在旧的子列表直到访问至少发生多少毫秒后首次访问。例如,一个价值1000块的原因在旧子表1秒才成为合格的移动到新的子列表的第一个访问后。

    默认值是1000

    此配置选项往往是结合使用innodb_old_blocks_pct。有关更多信息,参见第15.6.3.4,“缓冲池扫描耐”。对缓冲池的管理信息,LRU算法,并驱逐政策,看第15.6.3.1,“InnoDB缓冲池”

  • innodb_online_alter_log_max_size

    财产价值
    命令行格式--innodb-online-alter-log-max-size=#
    系统变量innodb_online_alter_log_max_size
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值134217728
    最小值65536
    最大值2**64-1

    指定过程中使用的临时日志文件的字节大小的上限在线DDL操作InnoDB表有一个正在创建或改变各指标如表日志文件。此日志文件存储数据的插入、更新或删除表中的DDL操作期间。临时日志文件扩展时所需要的价值innodb_sort_buffer_size,到指定的最大值innodb_online_alter_log_max_size。如果一个临时日志文件超过大小上限,这ALTER TABLE操作失败,所有未提交的并发DML操作回滚。因此,一个大值这个选项允许更多的DML到在线DDL操作期间发生的,而且延长时间在DDL操作结束时,表被应用的数据从日志。

  • innodb_open_files

    财产价值
    命令行格式--innodb-open-files=#
    系统变量innodb_open_files
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值-1(意味着调整;不转让本文字值)
    最小值10
    最大值4294967295

    如果您使用多个配置选项是唯一相关的InnoDB表空间。。。。。。。它specifies的最大数.ibd文件MySQL可以一次保持开放。最小值是10。默认值是300如果innodb_file_per_table未启用,和高300table_open_cache否则

    descriptors used for the file.ibd文件是InnoDB表。他们是独立于指定的--open-files-limit服务器的选择,而不影响表的缓存操作。通用I/O调优建议,看第8.5.8,“优化InnoDB的磁盘I / O”

  • innodb_optimize_fulltext_only

    财产价值
    命令行格式--innodb-optimize-fulltext-only=#
    系统变量innodb_optimize_fulltext_only
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    改变的方式OPTIMIZE TABLE操作上InnoDB表为了使暂时在维护作业InnoDB全文指标

    默认情况下,OPTIMIZE TABLE在reorganizes日期聚集索引该表。当启用此选项,OPTIMIZE TABLE跳表数据的重组过程,而新增,删除和更新数据,令牌InnoDBFULLTEXT指标。有关更多信息,参见InnoDB全文索引优化

  • innodb_page_cleaners

    财产价值
    命令行格式--innodb-page-cleaners=#
    系统变量innodb_page_cleaners
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值4
    最小值1
    最大值64

    那冲洗脏页从缓冲池的页面清洁的线程数。页面清洁螺纹进行冲洗和LRU刷新列表。当有多个线程缓冲池页面清洁,冲洗的任务,每个缓冲池的实例被派遣到空闲页面清洁螺纹。这个innodb_page_cleaners默认值是4。如果一些页面清洁螺纹超过缓冲池的实例数,innodb_page_cleaners自动设置为相同的值innodb_buffer_pool_instances

    如果你的工作量是写IO绑定冲洗时从缓冲池的实例数据文件的脏页,如果您的系统硬件的可用容量,增加页面清洁螺纹可能有助于提高写IO吞吐量。

    多线程网页吸尘器支持延伸到关闭和恢复阶段。

    这个setpriority()系统调用是使用Linux平台,它的支持,并在mysqld执行用户授权给page_cleaner线程的优先级比其他MySQLInnoDB线程的帮助页面冲洗与当前工作量保持同步。setpriority()支持所显示的是这个InnoDB启动信息:

    [Note] InnoDB: If the mysqld execution user is authorized, page cleaner
    thread priority can be changed. See the man page of setpriority().        
    

    对系统的启动和关闭服务器不是由系统,mysqld执行用户授权可以配置/etc/security/limits.conf。例如,如果mysqld是运行在mysql用户可以授权MySQL通过增加这些线路的用户/etc/security/limits.conf

    MySQL硬好看的20mysql软好- 20

    对于系统的管理系统,同样可以实现通过指定LimitNICE=-20在一个局部的系统配置文件。例如,创建一个文件名为override.conf进入/etc/systemd/system/mysqld.service.d/override.conf并将该条目:

    [Service]LimitNICE=-20

    在创建或更改override.conf,重装系统的配置,然后告诉系统重启mysql服务:

    systemctl守护reloadsystemctl重启mysqld #转platformssystemctl重启mysql # Debian平台

    有关使用本地化的系统配置文件的更多信息,参见MySQL的配置系统

    经过授权的mysqld执行用户,使用命令来验证配置Nice限制的mysqld过程:

    shell> cat /proc/mysqld_pid/limits | grep nice
    Max nice priority         18446744073709551596 18446744073709551596 
    
  • innodb_page_size

    财产价值
    命令行格式--innodb-page-size=#k
    系统变量innodb_page_size
    范围全球
    动态
    set_var提示应用
    类型枚举
    默认值16384
    有效值

    4k

    8k

    16k

    32k

    64k

    4096

    8192

    16384

    32768

    65536

    指定页面大小所有InnoDB表空间在MySQL实例。你可以使用价值64k指定页面大小,32k,16k(The default),8K,或4k。或者,您可以指定页面大小(字节检测,再16384,2000,4096)。

    innodb_page_size只能配置之前初始化MySQL实例并不能改变之后。如果没有指定任何值,实例是使用默认的页大小初始化。看到第15.6.1,“InnoDB启动配置”

    既为32K和64K的页面大小,最大的行长度大约是16000个字节。ROW_FORMAT=COMPRESSED时不支持innodb_page_size设置32KB或64Kb。为innodb_page_size=32k,大小为2MB。为innodb_page_size=64k,大小为4MBinnodb_log_buffer_size应设置至少16m(默认值)时,使用32K或64K的页面大小。

    默认16kb页面大小或更大的适用范围广工作负载,特别是涉及到的表扫描和DML操作涉及批量更新查询。较小的页大小可能更有效OLTP包括许多小的写入负载,可以在竞争的问题时,单页包含多行。较小的页面也可能是有效的SSD存储设备,通常使用小的块尺寸。保持InnoDB页面大小接近存储设备的块大小不变,减少数据改写磁盘。

    对于第一个系统表空间数据文件的最小文件大小(ibdata1)根据不同的innodb_page_sizeValue。See theinnodb_data_file_path选项描述的更多信息

    通用I/O调优建议,看第8.5.8,“优化InnoDB的磁盘I / O”

  • innodb_print_all_deadlocks

    财产价值
    命令行格式--innodb-print-all-deadlocks=#
    系统变量innodb_print_all_deadlocks
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    启用此选项时,所有的信息死锁进入InnoDB用户的交易记录在mysqld错误日志。否则,你看到的只有最后的死锁信息,使用SHOW ENGINE INNODB STATUS命令。一个偶然的InnoDB僵局不一定是一个问题,因为InnoDB检测条件立即回滚一个事务自动。你可以使用此选项来解决死锁的发生是为什么如果一个应用程序没有适当的错误处理逻辑检测回滚并重试操作。大量的死锁可能表明需要重组交易问题DMLSELECT ... FOR UPDATE多表报表,使每一个事务访问表中的相同的顺序,从而避免死锁的条件。

    相关的信息,看第15.5.5,“会”Deadlocks

  • innodb_print_ddl_logs

    财产价值
    命令行格式--innodb-print-ddl-logs=#
    介绍8.0.3
    系统变量innodb_print_ddl_logs
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    启用此选项使MySQL写DDL日志stderr。有关更多信息,参见查看DDL日志

  • innodb_purge_batch_size

    财产价值
    命令行格式--innodb-purge-batch-size=#
    系统变量innodb_purge_batch_size
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值300
    最小值1
    最大值5000

    定义了一些撤消清除日志页面解析和处理一批从历史记录列表。在一个多线程的清除配置,协调清除线程分innodb_purge_batch_sizeinnodb_purge_threads然后将该页面的数量每个清洗线。这个innodb_purge_batch_size期权也定义了一些UNDO日志页面,清除释放后每128次迭代通过UNDO日志。

    这个innodb_purge_batch_size选项用于先进的性能优化结合innodb_purge_threads设置大多数的MySQL用户不需要改变innodb_purge_batch_size其默认值

    相关的信息,看第15.6.10,“配置InnoDB净化调度”

  • innodb_purge_threads

    财产价值
    命令行格式--innodb-purge-threads=#
    系统变量innodb_purge_threads
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值4
    最小值1
    最大值32

    后台线程用于数InnoDB净化运营最小值1意味着清洗操作通常是由一个后台线程执行,永远的一部分主线程。在一个或多个后台线程有助于减少内部竞争在运行清除操作InnoDB,提高可扩展性。增加值大于1,创造了许多单独的清洗线,可以提高效率的系统DML对多个表进行操作。最大的是32。

    相关的信息,看第15.6.10,“配置InnoDB净化调度”

  • innodb_purge_rseg_truncate_frequency

    财产价值
    命令行格式--innodb-purge-rseg-truncate-frequency=#
    系统变量innodb_purge_rseg_truncate_frequency
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值128
    最小值1
    最大值128

    定义了频率与吹扫系统释放回滚段中的次数,清洗时。UNDO表空间不能被截断,直到它的回滚段被释放。通常情况下,吹扫系统释放回滚段每128次清洗时。默认值为128。减少该值增加的频率,清除线程释放回滚段。

    innodb_purge_rseg_truncate_frequency目的是为使用innodb_undo_log_truncate。有关更多信息,参见第15.7.9,“Truncating Undo Tablespaces”

  • innodb_random_read_ahead

    财产价值
    命令行格式--innodb-random-read-ahead=#
    系统变量innodb_random_read_ahead
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    使随机读前技术优化InnoDB我/ O.

    为详细了解性能考虑不同类型提前读请求,看第15.6.3.5”配置,InnoDB缓冲池预取(预读)”。通用I/O调优建议,看第8.5.8,“优化InnoDB的磁盘I / O”

  • innodb_read_ahead_threshold

    财产价值
    命令行格式--innodb-read-ahead-threshold=#
    系统变量innodb_read_ahead_threshold
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值56
    最小值0
    最大值64

    控制灵敏度线性读前那个InnoDB使用预取页面进入缓冲池。如果InnoDB至少读取innodb_read_ahead_threshold页面顺序从程度(64页),引发了整个异步读以下程度。值的允许范围是0到64。值0禁用预读。对于56的默认值,InnoDB必须至少读56页的程度依次为下列范围初始化一个异步读。

    知道有多少页面浏览预读机制,如何对这些页面会被从缓冲池没有被访问,可能是有用的当微调innodb_read_ahead_threshold设置SHOW ENGINE INNODB STATUS输出显示计数器信息从Innodb_buffer_pool_read_aheadInnodb_buffer_pool_read_ahead_evicted全局状态变量,该报告纳入页数缓冲池通过提前读请求,和这样的页面数驱逐从缓冲池没有被访问,分别。状态变量的全球价值报告自上次重新启动服务器。

    SHOW ENGINE INNODB STATUS也显示了速度,预读页面读取和速率,这样的页面会被没有被访问。每秒平均值是基于自上次调用的统计显示引擎INNODB STATUS并显示在BUFFER POOL AND MEMORY部分的SHOW ENGINE INNODB STATUS输出

    有关更多信息,参见第15.6.3.5”配置,InnoDB缓冲池预取(预读)”。通用I/O调优建议,看第8.5.8,“优化InnoDB的磁盘I / O”

  • innodb_read_io_threads

    财产价值
    命令行格式--innodb-read-io-threads=#
    系统变量innodb_read_io_threads
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值4
    最小值1
    最大值64

    数字I/O读操作的线程InnoDB。其对应的写线程innodb_write_io_threads。有关更多信息,参见第15.6.6,“配置一些背景InnoDB I/O线程”。通用I/O调优建议,看第8.5.8,“优化InnoDB的磁盘I / O”

    笔记

    在Linux系统上,运行多个MySQL服务器(通常超过12)的默认设置innodb_read_io_threadsinnodb_write_io_threads,和LinuxAIO的最大NR设置可以超过系统限制。理想的情况下,增加aio-max-nr设置;作为一种替代方法,可以减少一个或两个MySQL的配置选项的设置。

  • innodb_read_only

    财产价值
    命令行格式--innodb-read-only=#
    系统变量innodb_read_only
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    开始InnoDB在只读模式。分布式数据库应用程序或只读媒体数据集。也可以使用数据仓库中的多个实例之间共享相同的数据目录。有关更多信息,参见第15.6.2,“配置InnoDB只读操作”

    此前,使innodb_read_only系统变量不能创建和删除表只为InnoDB存储引擎。在MySQL 5.0,使innodb_read_only防止这些操作对所有的存储引擎。表的创建和删除操作的任何存储引擎修改数据字典表MySQL系统的数据库,但这些表的使用InnoDB存储引擎不能修改时innodb_read_only启用。同样的原则也适用于其他表的操作,需要修改数据字典表。实例:

    此外,在其他表mysql系统数据库使用InnoDB在MySQL 8的存储引擎。这些表的读操作,修改限制只有结果。实例:

  • innodb_redo_log_encrypt

    财产价值
    命令行格式--innodb-redo-log-encrypt=#
    介绍8.0.1
    系统变量innodb_redo_log_encrypt
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    控制加密的重做日志数据表使用加密InnoDB表空间加密功能。加密的重做日志数据默认是禁用的。有关更多信息,参见重做日志数据加密

  • innodb_replication_delay

    财产价值
    命令行格式--innodb-replication-delay=#
    系统变量innodb_replication_delay
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值0
    最小值0
    最大值4294967295

    复制线程延迟毫秒在从服务器,如果innodb_thread_concurrency达到

  • innodb_rollback_on_timeout

    财产价值
    命令行格式--innodb-rollback-on-timeout
    系统变量innodb_rollback_on_timeout
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    InnoDB回滚在默认情况下,事务超时的最后声明。如果--innodb_rollback_on_timeout指定事务超时的原因InnoDB中止并回滚整个事务

    笔记

    如果开始交易声明START TRANSACTIONBEGIN语句回滚不取消声明。进一步的SQL语句成为交易的一部分,直到发生COMMITROLLBACK,或一些SQL语句引起的隐式提交。

    有关更多信息,参见第15.20.4,“InnoDB错误处理”

  • innodb_rollback_segments

    财产价值
    命令行格式--innodb-rollback-segments=#
    系统变量innodb_rollback_segments
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值128
    最小值1
    最大值128

    innodb_rollback_segments定义了一些回滚段分配给临时表空间每个undo表空间。每个回滚段可以支持最多1023个数据修改事务。

    对回滚段的更多信息,参见15.3节,“InnoDB的多版本”。关于撤销表空间,看第15.7.8”配置,撤销表空间”

  • innodb_scan_directories

    财产价值
    命令行格式--innodb-scan-directories=#
    介绍8.0.2
    系统变量innodb_scan_directories
    范围全球
    动态
    set_var提示应用
    类型字符串
    默认值NULL

    如果,在恢复,InnoDB遇到重做日志从上一个检查点的日志写的,必须应用到受影响的表空间。识别受影响的表空间的过程称为表空间的发现。表空间的发现取决于表空间地图文件,地图表空间ID在重做日志表空间文件。如果表空间地图文件丢失或损坏,该innodb_scan_directories启动选项可以用来指定表空间文件目录。此选项InnoDB仔细阅读每个表空间文件的第一页中指定的目录并重新创建表空间地图文件,恢复过程可以应用重做日志到受影响的表空间。

    innodb_scan_directories可以指定在启动命令或在MySQL选项文件选项。行情是在参数值用否则分号(;)是由一些命令解释器解释为一个特殊的字符。(UNIX shell作为命令终止符,例如。)

    启动命令:

    mysqld --innodb-scan-directories="directory_path_1;directory_path_2"
    

    MySQL选项文件:

    [mysqld]
    innodb_scan_directories="directory_path_1;directory_path_2"
    

    有关更多信息,参见丢失或损坏的文件表空间地图

  • innodb_saved_page_number_debug

    财产价值
    命令行格式--innodb-saved-page-number-debug=#
    系统变量innodb_saved_page_number_debug
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值0
    最大值2**23-1

    节省一个页码。设置innodb_fil_make_page_dirty_debug选择垢定义的页面innodb_saved_page_number_debug。这个innodb_saved_page_number_debug选项仅可如果调试支持编译使用WITH_DEBUGCMake选项

  • innodb_sort_buffer_size

    财产价值
    命令行格式--innodb-sort-buffer-size=#
    系统变量innodb_sort_buffer_size
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值1048576
    最小值65536
    最大值67108864

    指定排序缓冲区用来排序的数据建立一个在大小InnoDB指数指定的大小定义,读入内存内部排序,然后写入磁盘的数据量。这个过程被称为运行。在合并阶段,对指定大小的缓冲区对阅读和合并。较大的设置、运行及合并有少。

    这类地区仅用于合并排序在索引创建过程中,在以后的索引维护操作。缓冲区释放索引创建完成时。

    此选项的值也控制量由临时日志文件记录并行DML延长期间在线DDL运营

    在这之前的设置进行配置,大小为1048576字节的硬编码(1MB),这是默认的。

    在一个ALTER TABLECREATE TABLE语句创建一个索引,三缓冲区分配的,每一个尺寸定义的这个选项。此外,辅助指针分配在排序缓冲区行指针使排序可以运行(与排序操作时移动行)。

    对于一个典型的排序操作,如这一公式可以用来估算内存的消耗:

    (6 /*FTS_NUM_AUX_INDEX*/ * (3*@@global.innodb_sort_buffer_size)
    + 2 * number_of_partitions * number_of_secondary_indexes_created
    * (@@global.innodb_sort_buffer_size/dict_index_get_min_size(index)*/)
    * 8 /*64-bit sizeof *buf->tuples*/")
    

    @@global.innodb_sort_buffer_size/dict_index_get_min_size(index)显示最大的图标2 *(@ @全球。innodb_sort_buffer_size / * dict_index_get_min_size(指数)* /)* 8 / * 64位尺寸* buf -&#62;元组* /表明辅助指针分配

    笔记

    32位,乘以4而不是8。

    并行在一个全文索引,乘innodb_ft_sort_pll_degree设置

    (6 / * FTS Proceed.Num Num Course on the Effect Index * / * @ @ @ @ @ @ @ @ @ @ @ @
  • innodb_spin_wait_delay

    财产价值
    命令行格式--innodb-spin-wait-delay=#
    系统变量innodb_spin_wait_delay
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值6
    最小值0
    最大值(64位平台)2**64-1
    最大值(32位平台)2**32-1

    一个民意调查之间的最大延迟旋转锁具这一机制的底层实现取决于硬件和操作系统的组合,所以延迟不符合一个固定的时间间隔。有关更多信息,参见第15.6.9”配置,自旋锁投票”

  • innodb_stats_auto_recalc

    财产价值
    命令行格式--innodb-stats-auto-recalc=#
    系统变量innodb_stats_auto_recalc
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值ON

    起因InnoDB自动重新计算持续的统计在表中的数据发生了实质性的变化。该阈值是表中行的10%.。此设置适用于表时创建的innodb_stats_persistent选项启用。自动统计计算,也可以通过指定配置STATS_PERSISTENT=1在一个CREATE TABLEALTER TABLE声明。采样数据产生统计金额是由innodb_stats_persistent_sample_pages配置选项

    有关更多信息,参见第15.6.11.1”配置,持续优化统计参数

  • innodb_stats_include_delete_marked

    财产价值
    命令行格式--innodb-stats-include-delete-marked=#
    介绍8.0.1
    系统变量innodb_stats_include_delete_marked
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    默认情况下,InnoDB读取未提交的数据在计算统计。在一个事务中删除行从表的情况,InnoDB排除了删除标记时计算行估计和指数统计记录,从而导致非最优的执行计划的其他交易,操作上同时使用事务隔离级别以外READ UNCOMMITTED。为了避免这一情况的发生,innodb_stats_include_delete_marked能够确保InnoDB包括删除标记的记录计算时持续优化统计。

    什么时候innodb_stats_include_delete_marked启用,ANALYZE TABLE考虑删除标记的记录时,重新计算统计。

    innodb_stats_include_delete_marked是一个全球性的设置影响所有InnoDB表它只适用于持续优化统计。

    相关的信息,看第15.6.11.1”配置,持续优化统计参数

  • innodb_stats_method

    财产价值
    命令行格式--innodb-stats-method=name
    系统变量innodb_stats_method
    范围全球
    动态
    set_var提示应用
    类型枚举
    默认值nulls_equal
    有效值

    nulls_equal

    nulls_unequal

    nulls_ignored

    服务器如何对待NULL值时收集统计对指标值的分布InnoDB表允许值nulls_equalnulls_unequal,和nulls_ignored。为nulls_equal,所有的无效的指数值都是相同的,大小等于该数形成一个单值群NULL价值观。为nulls_unequalNULL价值观是不平等的,每个无效的形成了一个鲜明的价值大小1组。为nulls_ignored无效的值将被忽略

    用于生成表统计方法如何影响优化器选择查询执行的指标,如第8.3.8,”InnoDB和MyISAM索引的统计信息收集”

  • innodb_stats_on_metadata

    财产价值
    命令行格式--innodb-stats-on-metadata
    系统变量innodb_stats_on_metadata
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    此选项仅适用于当优化器统计被配置为非持久性。优化器统计信息不保存到磁盘时innodb_stats_persistent被禁用或当个人表创建或改变STATS_PERSISTENT=0。有关更多信息,参见第15.6.11.2,“配置非持续优化统计参数

    什么时候innodb_stats_on_metadata启用,InnoDB更新非持久性统计当元数据报表等SHOW TABLE STATUS或当访问INFORMATION_SCHEMA.TABLESINFORMATION_SCHEMA.STATISTICS表(这些更新是类似于什么事情ANALYZE TABLE当禁用。),InnoDB不更新统计在这些操作中。离开设置残疾人可以提高,有大量的表或索引架构的访问速度。它也可以提高稳定性执行计划查询涉及InnoDB

    要更改设置,问题的声明SET GLOBAL innodb_stats_on_metadata=mode,在那里mode要么是打开(放)OFF(或0)。改变设置要求SYSTEM_VARIABLES_ADMIN超级的特权和立即影响所有连接的操作。

  • innodb_stats_persistent

    财产价值
    命令行格式--innodb-stats-persistent=setting
    系统变量innodb_stats_persistent
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值ON
    有效值

    OFF

    ON

    0

    1

    指定是否InnoDB索引统计信息保存到磁盘。否则,统计数字可能会多次计算导致的变化执行计划。这个设置是保存在每个表创建表时。你可以设置innodb_stats_persistent在全球层面,在创建一个表,或使用_持久性数据的条款CREATE TABLEALTER TABLE语句覆盖系统范围的设置和配置个人持续统计表。

    有关更多信息,参见第15.6.11.1”配置,持续优化统计参数

  • innodb_stats_persistent_sample_pages

    财产价值
    命令行格式--innodb-stats-persistent-sample-pages=#
    系统变量innodb_stats_persistent_sample_pages
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值20

    指标的数量网页样本估计基数和其他统计对于索引列,如计算ANALYZE TABLE。增加值提高了指标统计的准确性,从而提高查询执行计划,以增加I/O的执行过程ANALYZE TABLE对于一个InnoDB表有关更多信息,参见第15.6.11.1”配置,持续优化统计参数

    笔记

    设置较高的值innodb_stats_persistent_sample_pages可能导致冗长的ANALYZE TABLE执行时间。估计数据库访问的页面的数量ANALYZE TABLE,看到第15.6.11.3,“估计分析表的复杂性InnoDB表”

    innodb_stats_persistent_sample_pages只适用于当innodb_stats_persistent是一个表时启用;innodb_stats_persistent被禁用,innodb_stats_transient_sample_pages适用于代替

  • innodb_stats_transient_sample_pages

    财产价值
    命令行格式--innodb-stats-transient-sample-pages=#
    系统变量innodb_stats_transient_sample_pages
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值8

    指标的数量网页样本估计基数和其他统计对于索引列,如计算ANALYZE TABLE。默认值是8。增加值提高了指标统计的准确性,从而提高查询执行计划,以增加I/O打开InnoDB表或重新计算统计。有关更多信息,参见第15.6.11.2,“配置非持续优化统计参数

    笔记

    设置较高的值innodb_stats_transient_sample_pages可能导致冗长的ANALYZE TABLE执行时间。估计数据库访问的页面的数量ANALYZE TABLE,看到第15.6.11.3,“估计分析表的复杂性InnoDB表”

    innodb_stats_transient_sample_pages只适用于当innodb_stats_persistent是一个表时禁用;innodb_stats_persistent启用,innodb_stats_persistent_sample_pages适用于代替。需要的地方_ InnoDB数据_ _ pages样品。有关更多信息,参见第15.6.11.2,“配置非持续优化统计参数

  • innodb_status_output

    财产价值
    命令行格式--innodb-status-output
    系统变量innodb_status_output
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    启用或禁用的标准周期输出InnoDB显示器同时结合使用innodb_status_output_locks启用或禁用周期输出InnoDB锁监视器。有关更多信息,参见第15.16.2,“启用InnoDB监视器”

  • innodb_status_output_locks

    财产价值
    命令行格式--innodb-status-output-locks
    系统变量innodb_status_output_locks
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    可使用或可转让InnoDB锁监视器。When enabled,theInnoDB指纹锁锁监视器中的附加信息SHOW ENGINE INNODB STATUS输出和输出打印周期对MySQL错误日志。对于周期性输出InnoDB锁监视器是印刷作为标准的一部分InnoDB监视器输出。茶叶标准InnoDB因此,必须启用的监控InnoDB锁监视器打印数据到MySQL错误日志定期。有关更多信息,参见第15.16.2,“启用InnoDB监视器”

  • innodb_strict_mode

    财产价值
    命令行格式--innodb-strict-mode=#
    系统变量innodb_strict_mode
    范围全球会议
    动态
    set_var提示应用
    类型布尔
    默认值ON

    什么时候innodb_strict_mode启用,InnoDBReturns Erles rather than wawnings for certain conditions .

    严格模式有助于防止忽略错别字和SQL语法错误,或其他意想不到的后果的各种组合的操作模式和SQL语句。什么时候innodb_strict_mode启用,InnoDB提出了在某些情况下的错误条件,而不是发出警告和处理指定的声明(也许是无意的行为)。这是类似于sql_mode在MySQL中,控制MySQL接受SQL语法,并确定它默默地忽略错误,或者验证输入的语法和数据值。

    这个innodb_strict_mode设置影响语法错误的处理CREATE TABLEALTER TABLECREATE INDEX,和OPTIMIZE TABLE声明.innodb_strict_mode也使一个记录大小检查,以便INSERT更新从来没有因为记录被选定的页面尺寸太大。

    Oracle建议使innodb_strict_mode当使用row_formatKEY_BLOCK_SIZE条款CREATE TABLEALTER TABLE,和CREATE INDEX声明.什么时候innodb_strict_mode被禁用,InnoDB忽略了冲突的条款和创造在消息日志警告表或索引。结果表可能比预期的不同的特点,如压缩支持缺乏尝试创建一个压缩的表时。什么时候innodb_strict_mode启用,这样的问题产生立竿见影的误差和不创建表或索引。

    您可以启用或禁用innodb_strict_mode在命令行启动时mysqld,或在一个MySQL配置文件。您还可以启用或禁用innodb_strict_mode在报表运行时SET [GLOBAL|SESSION] innodb_strict_mode=mode,在那里mode要么是打开(放)OFF。改变全球设置要求SYSTEM_VARIABLES_ADMIN超级的特权和影响所有的客户,随后连接操作。任何客户端都可以改变SESSION设置innodb_strict_mode,并设置只影响客户端。

    innodb_strict_mode不适用于禁忌将军。对于一般的表空间,表空间管理制度严格执行独立innodb_strict_mode。有关更多信息,参见第13.1.19,“创建表的语法”

  • innodb_sync_array_size

    财产价值
    命令行格式--innodb-sync-array-size=#
    系统变量innodb_sync_array_size
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值1
    最小值1
    最大值1024

    定义大小的互斥锁等待阵列/。增加值将内部数据结构用来协调线程,在大量等待的线程负载高并发。此设置必须配置MySQL实例启动时,不能改变之后。增加价值的建议,经常产生大量等待的线程的工作负载,通常大于768。

  • innodb_sync_spin_loops

    财产价值
    命令行格式--innodb-sync-spin-loops=#
    系统变量innodb_sync_spin_loops
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值30
    最小值0
    最大值4294967295

    一个线程等待的次数InnoDB互斥锁被释放之前,线程被挂起。

  • innodb_sync_debug

    财产价值
    命令行格式--innodb-sync-debug=#
    系统变量innodb_sync_debug
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    使同步调试的检查InnoDB存储引擎。此选项仅可如果调试支持编译使用WITH_DEBUGCMake选项

  • innodb_table_locks

    财产价值
    命令行格式--innodb-table-locks
    系统变量innodb_table_locks
    范围全球会议
    动态
    set_var提示应用
    类型布尔
    默认值TRUE

    如果autocommit = 0InnoDB荣誉LOCK TABLESMySQL不回来;锁定表…写直到所有其他线程释放所有的锁表。默认值innodb_table_locks一,这意味着LOCK TABLES导致InnoDB锁定表内如果autocommit = 0

    在MySQL 5.0,innodb_table_locks = 0没有效果明确锁定表LOCK TABLES ... WRITE。它有一个效果表锁定为读或写的LOCK TABLES ... WRITE隐式(例如,通过触发)或LOCK TABLES ... READ

    相关的信息,看第15,“InnoDB锁和事务模型”

  • innodb_temp_data_file_path

    财产价值
    命令行格式--innodb-temp-data-file-path=file
    系统变量innodb_temp_data_file_path
    范围全球
    动态
    set_var提示应用
    类型字符串
    默认值ibtmp1:12M:autoextend

    定义了相对路径、名称、大小、属性InnoDB临时表空间数据文件。如果你不指定一个值innodb_temp_data_file_path,默认行为是创建一个自动扩展数据文件命名ibtmp1在MySQL数据目录,略大于12mb。

    一个临时表空间的数据文件规范完整的语法包括文件名,文件大小,和autoextend最大值属性:

    file_name:file_size[:autoextend[:max:max_file_size]]
    

    临时表空间的数据文件不能作为另一个相同的名字InnoDB数据文件。任何不能或错误创建临时表空间的数据文件被视为致命的和服务器启动时被拒绝。临时表空间是一个动态的生成空间ID,它可以改变每个服务器上重新启动。

    文件大小指定KB、MB或GB(即1024MB)通过添加KMG的大小值。对文件的大小的总和必须略大于12mb。

    单个文件的大小限制是由操作系统决定的。你可以设置文件的大小超过4GB,支持大文件的操作系统。临时表空间的数据文件的磁盘分区不支持使用。

    这个autoextend最大值属性可以只用于指定数据文件中的最后一个innodb_temp_data_file_path设置。例如:

    [mysqld]innodb_temp_data_file_path=ibtmp1:50M;ibtmp2:12M:autoextend:max:500MB

    如果您指定的autoextend选项,InnoDB扩展数据文件,如果它运行的自由空间。这个autoextend增量64mb默认。修改增加,改变innodb_autoextend_increment系统变量

    临时表空间的数据文件的完整目录路径是通过连接定义的路径的形成innodb_data_home_dirinnodb_temp_data_file_path

    临时表空间是共享的InnoDB临时表

    在跑步前InnoDB在只读模式,集innodb_temp_data_file_path在数据目录以外的位置。路径必须相对于数据目录。例如:

    --innodb_temp_data_file_path=../../../tmp/ibtmp1:12M:autoextend

    元数据的活性InnoDB临时表位于INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO

    相关的信息,看第15.4.11,临时表空间”

  • innodb_temp_tablespaces_dir

    财产价值
    命令行格式--innodb-temp-tablespaces-dir=dir_name
    介绍8.0.13
    系统变量innodb_temp_tablespaces_dir
    范围全球
    动态
    set_var提示应用
    类型目录名称
    默认值.#innodb_temp

    场的位置在哪里?InnoDB创建启动一池会话的临时表空间。默认位置是# InnoDB _温度在数据目录的目录。一个完全合格的路径或相对路径的数据可以指定目录。

    什么时候internal_tmp_disk_storage_engine=InnoDB,一个会话的临时表空间分配给会话的第一个请求创建一个用户或优化内部临时表。一个最大的两个临时表空间分配给每个会议,为用户创建临时表和其他优化的内部临时表。额外的临时表空间自动添加到池中是必要的。当一个会话断开连接,临时表空间被截断和放生池。临时表空间的池每次都重新创建服务器重新启动。会话的临时表空间的文件有托福网考文件扩展名

  • innodb_thread_concurrency

    财产价值
    命令行格式--innodb-thread-concurrency=#
    系统变量innodb_thread_concurrency
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值0
    最小值0
    最大值1000

    InnoDB试图保持操作系统线程的数量,同时在InnoDB小于或等于该变量的极限(InnoDB使用操作系统的线程来处理用户事务)。一旦线程数达到此限制,额外的线程进入等待状态中第一,先出(FIFO)队列执行。等待锁的线程不计算在许多并发执行的线程。

    这一变量的范围是0到1000。值0(默认值)被解释为无限并发(无并发检查)。禁用线程并发检查使InnoDB创建多线程需要。0值也禁用在InnoDB查询queries in queue counters行操作SHOW ENGINE INNODB STATUS输出

    考虑设置这个变量如果你的MySQL实例共享CPU资源与其他应用程序,或者如果你的工作量或并发用户数的增长。正确的设置取决于工作量,计算环境和版本的MySQL,你正在运行。你将需要测试的值的范围来确定设置,提供了最佳的性能。innodb_thread_concurrency是一个动态的变量,它可以让你尝试不同的设置,在现场测试系统。如果一个特定的环境表现不佳,你可以快速的设置innodb_thread_concurrency回到0

    使用以下指南帮助寻找和保持一个适当的设置:

    • 如果一个工作量用户并发线程数小于64,集innodb_thread_concurrency=0

    • 如果你的工作量是一贯重或偶尔穗状花序,先设定innodb_thread_concurrency=128然后降低值为96, 80, 64,等等,直到找到你的线程提供了最佳的性能数。例如,假设你的系统通常有40到50的用户,但周期数增加到60, 70,甚至200。你会发现在80个并发用户的性能是稳定的而开始显示超过这个数量的回归。在这种情况下,你可以设置innodb_thread_concurrency=80为了避免影响性能

    • 如果你不想InnoDB使用超过一定数量的虚拟CPU用户线程(20个虚拟CPU,例如),集innodb_thread_concurrency这个号码(或可能更低,根据绩效结果)。如果你的目标是将MySQL从其他应用程序,你可以考虑结合mysqld过程完全虚拟CPU。但要注意,,,独家结合可能导致非最优的使用如果硬件mysqld过程是不是一直忙。在这种情况下,你可能会把mysqld过程的虚拟CPU也允许其他应用程序使用的一些或所有的虚拟CPU。

      笔记

      从操作系统的角度来看,使用资源管理解决方案来管理应用程序之间共享CPU时间可能是最好的结合mysqld过程。例如,你可以分配90%个虚拟CPU时间为一个给定的应用程序在其他关键流程是不是跑步,和规模,值回40%当其他关键流程运行

    • innodb_thread_concurrency太高的值可能导致由于增加了对系统内部资源竞争绩效的回归。

    • 在某些情况下,最佳的innodb_thread_concurrency设置可以小于虚拟CPU数量。

    • 定期系统分析。改变工作量,用户数,或计算环境可能需要你调整innodb_thread_concurrency设置

    相关的信息,看第15.6.5,“配置InnoDB线程并发

  • innodb_thread_sleep_delay

    财产价值
    命令行格式--innodb-thread-sleep-delay=#
    系统变量innodb_thread_sleep_delay
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值10000
    最小值0
    最大值1000000

    多久InnoDB线程睡眠之前加入InnoDB队列,在微秒。默认值是一万。值为0时禁止。你可以设置配置选项innodb_adaptive_max_sleep_delay你会允许的最高值innodb_thread_sleep_delay,和InnoDB自动调整innodb_thread_sleep_delay向上或向下取决于当前线程调度活动。这种动态的调整有助于线程调度机制时,当系统负载较轻时顺利工作或接近满负荷运行。

    有关更多信息,参见第15.6.5,“配置InnoDB线程并发

  • innodb_tmpdir

    财产价值
    命令行格式--innodb-tmpdir=path
    系统变量innodb_tmpdir
    范围全球会议
    动态
    set_var提示应用
    类型目录名称
    默认值NULL

    用于定义临时排序文件创建在网上另一个目录ALTER TABLE作业是rebuild桌。

    在线ALTER TABLE操作重建表同时也创造了一个媒介在同一个目录表文件作为原始表。这个innodb_tmpdir选项不适用于中间表文件。

    一个有效的值不是MySQL数据目录路径的目录路径。如果值为空(默认),临时文件创建MySQL临时目录($TMPDIR在UNIX,%temp%在Windows中,或者指定的目录下--tmpdir配置选项)。如果指定的目录,目录和权限存在只检查时_ tmpdir InnoDB被配置为使用一个SET声明。如果一个链接是一个目录,链接是解决存储为一个绝对路径。路径不能超过512个字节。一个在线ALTER TABLE运行报告错误如果_ tmpdir InnoDB设置为一个无效的目录。innodb_tmpdir重写的MySQLtmpdir设置只有在线ALTER TABLE运营

    这个FILE特权是需要配置_ tmpdir InnoDB

    这个innodb_tmpdir期权的引入有助于避免溢出的临时文件目录位于临时文件系统文件系统。这种溢出可能由于大型临时排序文件创建在网上出现ALTER TABLE操作重建表

    复制环境中,只考虑复制innodb_tmpdir如果所有的服务器都有相同的操作系统环境设置。否则,复制_ tmpdir InnoDB设置可能会导致复制失败在线运行时ALTER TABLE操作重建表。如果服务器运行环境的不同,建议您配置_ tmpdir InnoDB在每个单独的服务器

    有关更多信息,参见第15.12.3,“在线DDL空间要求”。关于在线ALTER TABLE操作,看15.12节,“InnoDB和在线DDL”

  • innodb_trx_purge_view_update_only_debug

    财产价值
    命令行格式--innodb-trx-purge-view-update-only-debug=#
    系统变量innodb_trx_purge_view_update_only_debug
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    暂停删除标记的记录同时允许清除视图进行更新,清除。这个选项人为产生情况,清除视图更新但尚未完成清洗。此选项仅可如果调试支持编译使用WITH_DEBUGCMake选项

  • innodb_trx_rseg_n_slots_debug

    财产价值
    命令行格式--innodb-trx-rseg-n-slots-debug=#
    系统变量innodb_trx_rseg_n_slots_debug
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值0
    最大值1024

    设置一个调试标记限制TRX_RSEG_N_SLOTS一个给定的值为trx_rsegf_undo_find_free功能看起来免费的插槽,UNDO日志片段。此选项仅可如果调试支持编译使用WITH_DEBUGCMake选项

  • innodb_undo_directory

    财产价值
    命令行格式--innodb-undo-directory=dir_name
    系统变量innodb_undo_directory
    范围全球
    动态
    set_var提示应用
    类型目录名称

    路径InnoDB创建撤销表空间。通常用于将撤消对不同存储设备的日志。配合使用innodb_rollback_segmentsinnodb_undo_tablespaces

    没有默认值(是空的)。如果没有指定路径,撤销表空间中创建MySQL数据目录,定义为datadir

    有关更多信息,参见第15.7.8”配置,撤销表空间”

  • innodb_undo_log_encrypt

    财产价值
    命令行格式--innodb-undo-log-encrypt=#
    介绍8.0.1
    系统变量innodb_undo_log_encrypt
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值OFF

    控制加密撤消日志数据表使用加密InnoDB表空间加密功能。仅适用于撤销,放在单独的日志基于还原表空间。看到第15.7.8”配置,撤销表空间”。加密是不是撤消日志数据驻留在系统表空间支持。有关更多信息,参见UNDO日志数据加密

  • innodb_undo_log_truncate

    财产价值
    命令行格式--innodb-undo-log-truncate=#
    系统变量innodb_undo_log_truncate
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值(>= 8.0.2)ON
    默认值(<= 8.0.1)OFF

    当启用时,撤消超过定义的阈值的表空间innodb_max_undo_log_size用于截断。只有撤销表空间可以被截断。截断撤消驻留在系统表空间的日志不支持。截断的发生,至少要有两个撤销表空间。

    这个innodb_purge_rseg_truncate_frequency配置选项可以用来加快撤消tablepaces截断。

    有关更多信息,参见第15.7.9,“Truncating Undo Tablespaces”

  • innodb_undo_logs

    财产价值
    命令行格式--innodb-undo-logs=#
    过时的是的(除去8.0.2)
    系统变量innodb_undo_logs
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值128
    最小值1
    最大值128
    笔记

    innodb_undo_logs在MySQL 8.0.2删除。

    这个innodb_undo_logs选项是一个别名innodb_rollback_segments。更多信息,见描述innodb_rollback_segments

  • innodb_undo_tablespaces

    财产价值
    命令行格式--innodb-undo-tablespaces=#
    过时的8.0.4
    系统变量innodb_undo_tablespaces
    范围全球
    动态(>= 8.0.2)
    动态(<= 8.0.1)
    set_var提示应用
    类型整数
    默认值(>= 8.0.2)2
    默认值(<= 8.0.1)0
    最小值(>= 8.0.3)2
    最小值(<= 8.0.2)0
    最大值(>= 8.0.2)127
    最大值(<= 8.0.1)95

    基于还原表空间InnoDB。默认的最小值为2

    笔记

    innodb_undo_tablespaces是过时的、将在未来的版本中删除。

    UNDO日志可以在长期交易成为大。使用多个撤销表空间,减少任何一个undo表空间的大小。

    在以前的版本,innodb_undo_tablespaces可以设置为0使用SYSTEM回滚段。大于0的值意味着在SYSTEM回滚段不再分配给交易。在MySQL 8,一个0的设置是不允许和回滚段不仅创造了在撤销表空间。

    undo表空间文件中定义的位置创建innodb_undo_directory。文件名的形式undo _NNN,在那里NNN是撤销空间数

    一个undo表空间文件取决于初始大小innodb_page_size的价值。for the default 16KInnoDB页面大小,初始的undo表空间的文件大小是10mib。4K,8K,32K、64K的页面大小,初始undo表空间文件大小7mib,8mib,20mib,和40mib,分别。

    innodb_undo_tablespaces可配置在启动或在服务器正在运行。增加innodb_undo_tablespaces设置创建指定数量的撤销表空间,并将其添加到列表主动撤销表空间。降低innodb_undo_tablespaces设置删除撤销表空间从主动撤销表空间的表。然而,这些undo表空间仍然有效,直到他们不再使用现有的交易。撤销表空间是消极而不是删除,活动数量撤销表空间可以增加又容易。

    有关更多信息,参见第15.7.8”配置,撤销表空间”

  • innodb_use_native_aio

    财产价值
    命令行格式--innodb-use-native-aio=#
    系统变量innodb_use_native_aio
    范围全球
    动态
    set_var提示应用
    类型布尔
    默认值ON

    指定是否使用Linux的异步I/O子系统。这个变量适用于Linux系统,并且不能在服务器正在运行的改变。通常情况下,你不需要配置此选项,因为它是默认启用。

    这个异步I/O的能力,InnoDB对Windows系统可在Linux系统。(其他Unix系统继续使用同步I/O调用。)这一功能提高了可扩展性的大量I/O密集型系统,这通常表明许多悬而未决的读/写显示引擎INNODB STATUS \ G输出

    随着大量运行InnoDBI/O线程,特别是运行多个这样的实例在同一台服务器的机器,可以超过对Linux系统的容量限制。在这种情况下,您可能会收到以下错误:

    EAGAIN:指定maxevents超过可用事件用户的限制。

    你通常可以解决这个错误写一个更高的极限/proc/sys/fs/aio-max-nr

    然而,如果使用异步I/O子系统在操作系统的问题,防止InnoDB从一开始,你可以启动服务器innodb_use_native_aio=0。这个选项也可以禁用自动启动时,如果InnoDB检测到一个潜在的问题,如组合tmpdir位置,临时文件系统文件系统和Linux内核不支持AIO上tmpfs

    有关更多信息,参见第15.6.7,使用异步I/O的Linux”

  • innodb_version

    这个InnoDBversion number。在单独的MySQL版本为8.0,意大利InnoDB不适用,这个值是相同的version服务器的数量

  • innodb_write_io_threads

    财产价值
    命令行格式--innodb-write-io-threads=#
    系统变量innodb_write_io_threads
    范围全球
    动态
    set_var提示应用
    类型整数
    默认值4
    最小值1
    最大值64

    数字I/O线程的写操作InnoDB。默认值为4。读线程对应的是innodb_read_io_threads。有关更多信息,参见第15.6.6,“配置一些背景InnoDB I/O线程”。通用I/O调优建议,看第8.5.8,“优化InnoDB的磁盘I / O”

    笔记

    在Linux系统上,运行多个MySQL服务器(通常超过12)的默认设置innodb_read_io_threadsinnodb_write_io_threads,和Linuxaio-max-nr设置可以超过系统限制。理想的情况下,增加AIO的最大NR设置;作为一种替代方法,可以减少一个或两个MySQL的配置选项的设置。

    同时考虑价值sync_binlog,它控制的二进制日志同步到磁盘。

    通用I/O调优建议,看第8.5.8,“优化InnoDB的磁盘I / O”

15.14 information_schema InnoDB表

本节提供的信息和使用实例InnoDBINFORMATION_SCHEMA

InnoDBinformation_schema表提供元数据,状态信息,并对各方面统计InnoDB存储引擎。你可以查看列表InnoDBINFORMATION_SCHEMA通过发行表SHOW TABLES声明对information_schema数据库:

mysql> SHOW TABLES FROM INFORMATION_SCHEMA LIKE 'INNODB%';

为表定义,见24.35节,“information_schema InnoDB表”。一般信息MySQLinformation_schema数据库,看24章,information_schema表

15.14.1 InnoDB information_schema表压缩

有两对InnoDBinformation_schema表压缩,可以提供洞察如何压缩工作:

15.14.1.1 innodb_cmp和innodb_cmp_reset

这个INNODB_CMPINNODB_CMP_RESET表包含状态信息的操作来压缩表相关,它描述了15.9节,“InnoDB表和页面压缩”。这个PAGE_SIZE列报告压缩页面大小

这两个表有相同的内容,但阅读INNODB_CMP_RESET重置的压缩与解压缩操作统计。例如,如果你的档案输出INNODB_CMP_RESET每隔60分钟,你看到的每一段时间内的统计。如果你的显示器输出INNODB_CMP(确保不会读INNODB_CMP_RESET),你看InnoDB启动以来的累计数据。

为表定义,见第24.35.5,“information_schema innodb_cmp和innodb_cmp_reset表”

15.14.1.2 innodb_cmpmem和innodb_cmpmem_reset

这个INNODB_CMPMEMINNODB_CMPMEM_RESET表包含状态信息的压缩页驻留在缓冲池。请咨询15.9节,“InnoDB表和页面压缩”为进一步的信息在压缩表和缓冲池的使用。这个INNODB_CMPINNODB_CMP_RESET表应该提供更多有用的数据压缩。

内部细节

InnoDB使用一个伙伴系统系统管理的内存分配各种尺寸的页,从1KB 16KB。每行两个表描述对应于一个单一的页面大小。

这个INNODB_CMPMEMINNODB_CMPMEM_RESET表的内容是完全相同的,但读INNODB_CMPMEM_RESET重置搬迁业务统计。例如,如果你每60分钟存档输出INNODB_CMPMEM_RESET,它会显示每小时统计。如果你没有读过INNODB_CMPMEM_RESET监测输出INNODB_CMPMEM相反,它会显示以来的累计数据InnoDB开始

为表定义,见第24.35.6,“information_schema innodb_cmpmem和innodb_cmpmem_reset表”

15.14.1.3使用压缩信息架构表

例15.1使用压缩信息架构表

以下是从一个数据库,包含压缩输出样本(见表15.9节,“InnoDB表和页面压缩”INNODB_CMPINNODB_CMP_PER_INDEX,和INNODB_CMPMEM

下表显示的内容INFORMATION_SCHEMA.INNODB_CMP在灯光下工作量。只有压缩页面的大小,缓冲池包含8K。压缩或解压缩页消耗了由于时间的统计复位不到一秒钟,因为列COMPRESS_TIMEuncompress_time是零

页面大小压缩操作压缩OPS OK压缩时间解压缩操作解压缩时间
一千零二十四
二千零四十八
四千零九十六
八千一百九十二一千零四十八九百二十一六十一
一万六千三百八十四

根据INNODB_CMPMEM,压缩包中有6169 8kb页的缓冲池。唯一的其他分配块大小是64个字节。斯马利斯特PAGE_SIZE进入INNODB_CMPMEM用于块描述符的压缩页没有压缩的页面中存在的缓冲池。我们看到有5910个这样的页面。间接地,我们看到,259(6169-5910)压缩页面还存在的缓冲池中的压缩格式。

下表显示的内容INFORMATION_SCHEMA.INNODB_CMPMEM在灯光下工作量。由于压缩页面的内存分配器的一些记忆碎片是无用的:SUM(PAGE_SIZE*PAGES_FREE)=6784。这是因为小内存分配请求的分裂更大的块完成,从是从主缓冲池分配16K块,使用好友分配系统。这是因为一些碎片低分配块已搬迁(复制)形成大的相邻的空闲块。这个复制和(page_size * relocation_ops)字节消耗了不到一秒(SUM(RELOCATION_TIME)=0)

页面大小页面使用网页免费搬迁行动搬迁时间
六十四五千九百一十二千四百三十六
一百二十八
二百五十六
五百一十二
一千零二十四
二千零四十八
四千零九十六
八千一百九十二六千一百六十九
一万六千三百八十四

15.14.2 InnoDB information_schema事务和锁定信息

笔记

本节介绍了锁定信息的性能架构曝光data_locksdata_lock_waitssupersede桌子,which theinformation_schemaINNODB_LOCKSINNODB_LOCK_WAITS在MySQL 8表。类似的讨论写在旧的条款information_schema表,看InnoDB information_schema事务和锁定信息进入MySQL 5.7参考手册

INFORMATION_SCHEMA表2性能模式表使您能够监控InnoDB交易和诊断潜在的锁定问题:

  • INNODB_TRX本:information_schema表中包含的信息,对每一笔交易正在执行的内部InnoDB,包括交易状态(例如,是否正在运行或等待一个锁),交易开始时,和特定的SQL语句的事务执行。

  • data_locks:这个性能模式表包含每一把锁的一行,每个锁请求被阻塞来等待持有的锁被释放:

    • 对于每个持有锁一行,无论是持有锁的事务的状态(INNODB_TRX.TRX_STATE运行LOCK WAIT滚回去COMMITTING

    • 每一笔交易在InnoDB,等待另一个事务释放锁(INNODB_TRX.TRX_STATE锁等待)是完全由一个锁定请求被阻塞。阻塞锁请求的是一个行或表锁在一个不兼容的模式,另一个事务举行。一个锁定请求总是随着持有锁块的请求模式不兼容模式(读与写,共享与专属)。

      阻塞的交易无法继续,直到其他事务提交或回滚,从而释放请求的锁。对于每一个阻止交易,data_locks包含一行描述每个锁的事务请求,并且它正在等待。

  • data_lock_waits:这个性能模式表表明交易正在等待一个特定的锁,或锁一个事务正在等待。这个表格包含一行或多行中每个阻止交易,说明锁请求和任何锁被阻断,请求。这个requesting_engine_lock_id价值是指一个事务请求的锁,和BLOCKING_ENGINE_LOCK_ID价值是指锁(由另一个事务举行)防止第一交易的进行。对于任何给定的阻止交易,所有行data_lock_waits有相同的价值requesting_engine_lock_id不同的价值观BLOCKING_ENGINE_LOCK_ID

约前表的更多信息,参见第24.35.30,“information_schema innodb_trx表”第25.11.12.1,“data_locks表”,和第25.11.12.2,“data_lock_waits表”

15.14.2.1使用InnoDB事务和锁定信息

笔记

本节介绍了锁定信息的性能架构曝光data_locksdata_lock_waitsTable,which Superation Superation theinformation_schemaINNODB_LOCKSINNODB_LOCK_WAITS在MySQL 5.0表。类似的讨论写在旧的条款information_schema表,看使用InnoDB事务和锁定信息进入MySQL 5.7参考手册

识别阻塞事务

有时是帮助确定哪些事务块另一。包含资料表InnoDB交易和数据锁使你确定哪些交易是在等待另一个,和资源要求。(这些表的描述看,第15.14.2,“InnoDB information_schema事务和锁定信息”。)

假设三届同时运行。每个会话对应一个MySQL线程和一个交易之后的另一个执行。考虑系统的状态时,这些会议有以下声明,但还没有提交其交易:

  • 会话:

    BEGIN;
    SELECT a FROM t FOR UPDATE;
    SELECT SLEEP(100);
    
  • 会话B:

    SELECT b FROM t FOR UPDATE;
    
  • 会话C:

    SELECT c FROM t FOR UPDATE;
    

在这种情况下,使用以下查询查看交易等交易阻止他们:

SELECT
  r.trx_id waiting_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_query blocking_query
FROM       performance_schema.data_lock_waits w
INNER JOIN information_schema.innodb_trx b
  ON b.trx_id = w.blocking_engine_transaction_id
INNER JOIN information_schema.innodb_trx r
  ON r.trx_id = w.requesting_engine_transaction_id;

或者,更简单地说,使用sys图式innodb_lock_waits意见

选择waiting_trx_id,waiting_pid,waiting_query,blocking_trx_id,blocking_pid,blocking_queryfrom sys.innodb_lock_waits;

如果一个空值报道阻塞查询,看识别卡查询发行后的会话空闲

等待TRX ID等待线程等待查询阻断TRX ID阻塞线程阻塞查询
A46SELECT b FROM t FOR UPDATEA35SELECT SLEEP(100)
A57SELECT c FROM t FOR UPDATEA35SELECT SLEEP(100)
A57SELECT c FROM t FOR UPDATEA46SELECT b FROM t FOR UPDATE

上表中,你可以通过识别会话等待查询阻塞查询专栏正如你所看到的:

  • 硫氧还蛋白B(会话IDA4,螺纹)和会话C(TRX IDA5,螺纹)都在等待会议(TRX IDA3,螺纹

  • 会话C等待会话B以及A阶段

你可以看到在下面的数据INFORMATION_SCHEMAINNODB_TRX表和绩效模式data_locksdata_lock_waits

下表显示了一些样品INNODB_TRX

TRX IDTRX状态TRX开始TRX要求锁定标识符TRX的等待开始TRX的重量TRX MySQL线程IDTRX查询
A3RUN-NING2008-01-15 16:44:54NULLNULL25SELECT SLEEP(100)
A4LOCK WAIT2008-01-15 16:45:09A4:1:3:22008-01-15 16:45:0926SELECT b FROM t FOR UPDATE
A5LOCK WAIT2008-01-15 16:45:14A5:1:3:22008-01-15 16:45:1427SELECT c FROM t FOR UPDATE

下表显示了一些样品data_locks

锁ID锁TRX ID锁模式锁的类型锁模式锁表锁定指标锁定数据
A3:1:3:2A3XRECORDtesttPRIMARY0x0200
A4:1:3:2A4XRECORDtesttPRIMARY0x0200
A5:1:3:2A5XRECORDtesttPRIMARY0x0200

下表显示了一些样品data_lock_waits

请求TRX ID请求锁的ID阻断TRX ID阻塞锁ID
A4A4:1:3:2A3A3:1:3:2
A5A5:1:3:2A3A3:1:3:2
A5A5:1:3:2A4A4:1:3:2
识别卡查询发行后的会话空闲

当确定阻断交易,空值报道阻塞查询如果发出的查询会话已成为闲置。在这种情况下,使用以下步骤来确定阻塞的查询:

  1. 识别阻塞事务列表ID。在sys.innodb_lock_waits表,阻塞的事务ID的列表blocking_pid价值

  2. 使用blocking_pid,查询MySQL性能模式threads表确定thread_id阻塞的交易。例如,如果blocking_pid6、本查询问题:

    SELECT THREAD_ID FROM performance_schema.threads WHERE PROCESSLIST_ID = 6;
  3. 使用THREAD_ID,查询性能架构events_statements_current表确定的线程中执行的最后一个查询。例如,如果thread_id28、本查询问题:

    SELECT THREAD_ID, SQL_TEXT FROM performance_schema.events_statements_current 
    WHERE THREAD_ID = 28\G
    
  4. 如果线程执行的最后一个查询没有足够的信息来确定为什么加锁,你可以查询性能模式events_statements_history表观10个语句的线程中执行。

    SELECT THREAD_ID, SQL_TEXT FROM performance_schema.events_statements_history WHERE THREAD_ID = 28 ORDER BY EVENT_ID;
InnoDB事务与会议相关的MySQL

有时它是有用的相关内InnoDB在会话级别的信息由MySQL锁定信息。例如,你可能会想知道,对于一个给定的InnoDB事务ID,该会话可能持有锁相应的MySQL会话ID和名称,从而阻止其他事务。

输出from the following theINFORMATION_SCHEMAINNODB_TRX表和绩效模式data_locksdata_lock_waits表是从一个点加载系统。可以看出,有几个交易运行。

以下data_locksdata_lock_waits表格显示:

  • 交易77F(执行INSERT)等交易77E条77D,和77B承诺

  • 交易77E(执行INSERT)等交易77D77B承诺

  • 交易77D(执行INSERT)等交易77B承诺

  • 交易77B(执行INSERT)等交易第77承诺

  • 交易77A运行,目前执行的SELECT

  • 交易E56(执行INSERT)等交易E55承诺

  • 交易E55(执行INSERT)等交易19c承诺

  • 交易19C运行,目前执行INSERT

笔记

有可能是显示在查询之间的矛盾INFORMATION_SCHEMAPROCESSLISTINNODB_TRX表一个解释,看第15.14.2.3,“毅力和InnoDB事务一致性和锁定信息”

下表显示的内容PROCESSLIST一个系统中运行一个笨重的桌子工作量

身份证件用户主机DB命令时间状态信息
384rootlocalhosttestQuery10updateINSERT INTO t2 VALUES …
257rootlocalhosttestQuery3updateINSERT INTO t2 VALUES …
130rootlocalhosttestQuery0updateINSERT INTO t2 VALUES …
61rootlocalhosttestQuery1updateINSERT INTO t2 VALUES …
8rootlocalhosttestQuery1updateINSERT INTO t2 VALUES …
4rootlocalhosttestQuery0preparingSELECT * FROM PROCESSLIST
2rootlocalhosttestSleep566NULL

下表显示的内容INNODB_TRX一个系统中运行一个笨重的桌子工作量

TRX IDTRX状态TRX开始TRX要求锁定标识符TRX的等待开始TRX的重量TRX MySQL线程IDTRX查询
77FLOCK WAIT2008-01-15 13:10:1677F2008-01-15 13:10:161876INSERT INTO t09 (D, B, C) VALUES …
77ELOCK WAIT2008-01-15 13:10:1677E2008-01-15 13:10:161875INSERT INTO t09 (D, B, C) VALUES …
77DLOCK WAIT2008-01-15 13:10:1677D2008-01-15 13:10:161874INSERT INTO t09 (D, B, C) VALUES …
77BLOCK WAIT2008-01-15 13:10:1677B:733:12:12008-01-15 13:10:164873INSERT INTO t09 (D, B, C) VALUES …
77ARUN-NING2008-01-15 13:10:16NULLNULL4872SELECT b, c FROM t09 WHERE …
E56LOCK WAIT2008-01-15 13:10:06E56:743:6:22008-01-15 13:10:065384INSERT INTO t2 VALUES …
E55LOCK WAIT2008-01-15 13:10:06E55:743:38:22008-01-15 13:10:13965257INSERT INTO t2 VALUES …
19CRUN-NING2008-01-15 13:09:10NULLNULL2900130INSERT INTO t2 VALUES …
E15RUN-NING2008-01-15 13:08:59NULLNULL539561INSERT INTO t2 VALUES …
51DRUN-NING2008-01-15 13:08:47NULLNULL98078INSERT INTO t2 VALUES …

下表显示的内容data_lock_waits一个系统中运行一个笨重的桌子工作量

请求TRX ID请求锁的ID阻断TRX ID阻塞锁ID
77F77F:80677E77E:806
77F77F:80677D77D:806
77F77F:80677B77B:806
77E77E:80677D77D:806
77E77E:80677B77B:806
77D77D:80677B77B:806
77B77B:733:12:177A77A:733:12:1
E56E56:743:6:2E55E55:743:6:2
E55E55:743:38:219C19C:743:38:2

下表显示的内容data_locks一个系统中运行一个笨重的桌子工作量

锁ID锁TRX ID锁模式锁的类型锁模式锁表锁定指标锁定数据
77F:80677FAUTO_INCTABLEtestt09NULLNULL
77E:80677EAUTO_INCTABLEtestt09NULLNULL
77D:80677DAUTO_INCTABLEtestt09NULLNULL
77B:80677BAUTO_INCTABLEtestt09NULLNULL
77B:733:12:177BXRECORDtestt09PRIMARYsupremum pseudo-record
77A:733:12:177AXRECORDtestt09PRIMARYsupremum pseudo-record
E56:743:6:2E56SRECORDtestt2PRIMARY0, 0
E55:743:6:2E55XRECORDtestt2PRIMARY0, 0
E55:743:38:2E55SRECORDtestt2PRIMARY1922, 1922
19C:743:38:219CXRECORDtestt2PRIMARY1922, 1922

15.14.2.2 InnoDB锁和锁等待的信息

笔记

本节介绍了锁定信息的性能架构曝光data_locksdata_lock_waitsTable,which Superation Superation theinformation_schemaINNODB_LOCKSINNODB_LOCK_WAITS在MySQL 5.0表。类似的讨论写在旧的条款information_schema表,看InnoDB锁和锁等待的信息进入MySQL 5.7参考手册

当一个事务更新表中的一行,或锁着SELECT FOR UPDATEInnoDB建立在该行列表或队列的锁。同样,InnoDB维护一个列表,表上的锁表级锁。如果一次交易要更新的表行或锁在一个不兼容的模式之前的交易已经锁了,InnoDB增加了对排到相应的队列锁请求。一个锁被一个事务获得,所有不兼容的锁请求先前进入锁队列,行或表必须被删除(这发生在交易控股或要求这些锁提交或回滚)。

交易可能有很多不同的行或表锁请求。在任何给定的时间,一个事务请求锁,是由另一个事务举行,在这种情况下,它是由其他交易受阻。请求的事务必须等待着阻塞锁提交或回滚事务。如果一个交易不是在等待一个锁,它是在一个RUNNING状态如果一个事务正在等待锁,它是在一个锁等待国家。(The)INFORMATION_SCHEMAINNODB_TRX表显示交易状态值。)

性能模式data_locks表包含一行或多行中的每个锁等待交易,表明任何锁请求,防止其进展。该表还包含一行描述每个锁队列中的锁等待一个给定的行或表格。性能模式data_lock_waits表格显示,锁的交易已经举行了阻塞其他事务请求的锁。

15.14.2.3 InnoDB事务和lockinginformation持久性和一致性

笔记

本节介绍了锁定信息的性能架构曝光data_locksdata_lock_waitsTable,which Superation Superation theinformation_schemaINNODB_LOCKSINNODB_LOCK_WAITS在MySQL 5.0表。类似的讨论写在旧的条款information_schema表,看坚持和InnoDB事务一致性和锁定信息进入MySQL 5.7参考手册

数据暴露的事务和锁表(INFORMATION_SCHEMAINNODB_TRX表,性能模式data_locksdata_lock_waits表)代表一窥快速变化的数据。这不是像用户表,其中的数据变化,只有当应用程序启动的更新发生。基础数据是系统内部的管理数据,并能够很快的改变:

15.14.3 InnoDB information_schema架构对象表

你可以提取方案对象的元数据管理InnoDB使用InnoDBINFORMATION_SCHEMA表此信息来自数据字典。传统上,你会使用技术,得到这类信息15.16节,“InnoDB监视器”,设置InnoDB监控和分析输出从SHOW ENGINE INNODB STATUS声明。这个InnoDBINFORMATION_SCHEMA表格界面允许您使用SQL查询数据。

InnoDBinformation_schema架构对象表包括下面列出的表。

INNODB_DATAFILES
INNODB_TABLESTATS
INNODB_FOREIGN
INNODB_COLUMNS
INNODB_INDEXES
INNODB_FIELDS
INNODB_TABLESPACES
INNODB_TABLESPACES_BRIEF
INNODB_FOREIGN_COLS
INNODB_TABLES

表名的指示提供的数据类型:

InnoDBinformation_schema架构对象表可以连接在一起,通过等TABLE_IDindex_id,和SPACE,让你轻松获取所有可用的数据对象要研究或监测。

指的是InnoDBinformation_schema对于每个表的列的信息文件。

例15.2 InnoDB information_schema架构对象表

这个例子使用一个简单的表(t1与一个单一的指标()1)展示在元数据的类型InnoDBinformation_schema面向对象的模式

  1. 创建一个测试数据库和表t1

    MySQL的&#62;CREATE DATABASE test;MySQL的&#62;USE test;MySQL的&#62;CREATE TABLE t1 (col1 INT,col2 CHAR(10),col3 VARCHAR(10))ENGINE = InnoDB;MySQL的&#62;CREATE INDEX i1 ON t1(col1);
  2. 在创建表t1,查询INNODB_TABLES定位元数据测试/ T1

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME='test/t1' \G
    *************************** 1. row ***************************
         TABLE_ID: 71
             NAME: test/t1
             FLAG: 1
           N_COLS: 6
            SPACE: 57
       ROW_FORMAT: Compact
    ZIP_PAGE_SIZE: 0
     INSTANT_COLS: 0
    

    t1有一个table_idOf 71 .theFLAG现场提供的比特级信息表的格式和存储特性。有六列,其中三列是隐藏的InnoDBDB_ROW_ID_ TRX _ DB ID,和DB_ROLL_PTR)。该表的ID空间57(0值表示该表驻留在系统表空间)。这个ROW_FORMAT紧凑zip_page_size只适用于表一Compressed行格式瞬间显示列数增加立即使用ALTER TABLE ... ADD COLUMNALGORITHM=INSTANT

  3. 使用TABLE_ID信息INNODB_TABLES,查询INNODB_COLUMNS关于表的列信息表

    MySQL的&#62;SELECT * FROM INFORMATION_SCHEMA.INNODB_COLUMNS where TABLE_ID = 71\G*************************** 1。行*************************** table_id:71名称:col1 POS:0 M型:6:1027:4 prtype Len has_default:0default_value:空*************************** 2。行*************************** table_id:71名称:COL2 POS:1米型:2:524542:10 prtype Len has_default:0default_value:空*************************** 3。行*************************** table_id:71名称:col3名次:2米型:1:524303:10 prtype Len has_default:0default_value:空

    除了对TABLE_ID姓名INNODB_COLUMNS提供的序号位置(销售时点情报系统)每列(从0和递增的顺序),列MTYPE主要类型(6 = INT, 2 = CHAR, 1 = VARCHAR), thePRTYPE精密型(二值位代表MySQL数据类型、字符集编码,并为空性),和列长度(LEN页:1的你_违约DEFAULT_VALUE列仅适用于列添加立即使用修改表…添加列ALGORITHM=INSTANT

  4. 使用TABLE_ID信息INNODB_TABLES再次,查询INNODB_INDEXES关于与表的索引信息T1

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_INDEXES WHERE TABLE_ID = 71 \G
    *************************** 1. row ***************************
           INDEX_ID: 111
               NAME: GEN_CLUST_INDEX
           TABLE_ID: 71
               TYPE: 1
           N_FIELDS: 0
            PAGE_NO: 3
              SPACE: 57
    MERGE_THRESHOLD: 50
    *************************** 2. row ***************************
           INDEX_ID: 112
               NAME: i1
           TABLE_ID: 71
               TYPE: 0
           N_FIELDS: 1
            PAGE_NO: 4
              SPACE: 57
    MERGE_THRESHOLD: 50
    

    INNODB_INDEXES返回两个指标数据。第一个指标是gen_clust_index,这是一个聚集索引的创建InnoDB如果表中没有定义聚集索引。第二指数(1)是用户定义的辅助索引。

    这个INDEX_ID对于指数是独特的在所有的数据库实例标识符。这个table_id确定的表,索引关联的。该指数TYPEvalue indicates the type of index (1 = Clustered Index, 0 = Secondary index). Then_fileds价值领域,包括数PAGE_NO为索引B树的根页号,和空间是在索引所在的表空间ID。非零值表示指数不存在于系统表空间。MERGE_THRESHOLD定义在一个索引页的数据量的百分比阈值。如果在一个索引页的数据量低于此值(默认为50)当删除一行或一行后缩短了更新操作,InnoDB试图索引页与相邻的索引页合并。

  5. 使用INDEX_ID信息INNODB_INDEXES,查询INNODB_FIELDS有关索引字段的信息1

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FIELDS where INDEX_ID = 112 \G
    *************************** 1. row ***************************
    INDEX_ID: 112
        NAME: col1
         POS: 0
    

    INNODB_FIELDS提供姓名索引的字段及其顺序的索引位置。如果指数(I1)已经在多个领域定义,INNODB_FIELDS将为每个索引字段的元数据。

  6. 使用SPACE信息INNODB_TABLES,查询INNODB_TABLESPACES有关表的表空间表

    MySQL的&#62;SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE SPACE = 57 \G*************************** 1。行***************************空间:57名:测试/ T1标志:16417 row_format:动态page_size:16384 zip_page_size:0 space_type:单fs_block_size:4096 file_size:114688allocated_size:98304server_version:8.0.4 space_version:1.

    除了对SPACE我的表空间和姓名相关表的,INNODB_TABLESPACES提供空间标志数据,这是位信息表的格式和存储特性。还提供了空间ROW_FORMATpage_size,和其他几个表空间元数据项。

  7. 使用SPACE信息INNODB_TABLES再次,查询INNODB_DATAFILESfor the租赁of the表空间的数据文件。

    MySQL的&#62;SELECT * FROM INFORMATION_SCHEMA.INNODB_DATAFILES WHERE SPACE = 57 \G*************************** 1。行***************************空间:57条路径:/测试/ t1.ibd。

    数据文件位于test在MySQL的目录数据目录。如果在文件表表空间创建在MySQL数据目录的位置使用DATA DIRECTORY的条款CREATE TABLE语句,表空间路径将是一个完全合格的路径。

  8. 最后一步,在表中插入一行t1TABLE_ID = 71)和视图中的数据INNODB_TABLESTATS表本表数据由MySQL优化器计算指数使用查询时使用InnoDB表这个信息是从内存中的数据结构。

    mysql> INSERT INTO t1 VALUES(5, 'abc', 'def');
    Query OK, 1 row affected (0.06 sec)
    
    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLESTATS where TABLE_ID = 71 \G
    *************************** 1. row ***************************
             TABLE_ID: 71
                 NAME: test/t1
    STATS_INITIALIZED: Initialized
             NUM_ROWS: 1
     CLUST_INDEX_SIZE: 1
     OTHER_INDEX_SIZE: 0
     MODIFIED_COUNTER: 1
              AUTOINC: 0
            REF_COUNT: 1
    

    这个STATS_INITIALIZED指出是否统计已收集表。num_rows是目前的估计数的表中的行。这个CLUST_INDEX_SIZE其他_指数_大小田野报告存储集群和表的辅助索引的磁盘页面的数量,分别。这个MODIFIED_COUNTER值显示行的外键的DML操作和级联操作修改数。这个autoinc价值是下一个数字发行任何递增的基础操作。有没有自动递增列定义表t1,所以值为0。这个折扣计数价值是一个计数器。当计数器达到0,这意味着表的元数据可以逐出表缓存。


例15.3 information_schema架构对象表的外键

这个INNODB_FOREIGNINNODB_FOREIGN_COLS表提供有关外键关系数据。这个例子使用一个父表和子中发现一个外键关系表的数据显示INNODB_FOREIGNINNODB_FOREIGN_COLS

  1. 创建测试数据库与父表和子表:

    mysql> CREATE DATABASE test;
    
    mysql> USE test;
    
    mysql> CREATE TABLE parent (id INT NOT NULL,
           PRIMARY KEY (id)) ENGINE=INNODB;
    
    mysql> CREATE TABLE child (id INT, parent_id INT,
           INDEX par_ind (parent_id),
           CONSTRAINT fk1
           FOREIGN KEY (parent_id) REFERENCES parent(id)
           ON DELETE CASCADE) ENGINE=INNODB;
    
  2. 在父表和子表的创建,查询INNODB_FOREIGN定位为国外关键数据测试/儿童test/parent外键关系:

    MySQL的&#62;SELECT * FROM INFORMATION_SCHEMA.INNODB_FOREIGN \G*************************** 1。行*************************** ID:测试/ fk1for_name:测试/ childref_name:测试/母n_cols:1型:1

    元数据包括外键IDFK1),这是命名为“CONSTRAINT这是对孩子表定义。这个for_name是孩子的名字表的外键定义。REF_NAME是父表的名称(的引用目录(续)N_COLS在外键索引的列数类型是一个表示位标志提供关于外键列的附加信息的数值。在这种情况下,的TYPE值为1,这表明级联删除期权是外键指定。看到INNODB_FOREIGN为更多的信息关于表的定义类型价值观

  3. 使用外键ID,查询INNODB_FOREIGN_COLS查看关于外键列的数据。

    MySQL的&#62;SELECT * FROM INFORMATION_SCHEMA.INNODB_FOREIGN_COLS WHERE ID = 'test/fk1' \G*************************** 1。行*************************** ID:测试/ fk1for_col_name:parent_idref_col_name:ID名次:0

    FOR_COL_NAME是在子表的外键列的名称,并中领领领是引用列在父表的名称。这个POS值在外键索引键字段的顺序位置,从零开始。


例15.4加入InnoDB information_schema架构对象表

这个例子演示了连接三InnoDBinformation_schema图式objeect表(INNODB_TABLESINNODB_TABLESPACES,和INNODB_TABLESTATS)收集的文件格式,行格式,页面大小,和索引的大小信息在员工样本数据库表。

下面的表的别名来缩短查询字符串:

一个IF()控制流的功能是用来考虑压缩表。如果一个表被压缩,索引大小的计算zip_page_size而不是PAGE_SIZEclust_index_sizeOTHER_INDEX_SIZE据报道,这是以字节为单位,分1024 * 1024在兆提供指数大小(MBS)。MB值舍入为零的小数空间使用ROUND()功能

MySQL的&#62;SELECT a.NAME, a.ROW_FORMAT,@page_size :=IF(a.ROW_FORMAT='Compressed',b.ZIP_PAGE_SIZE, b.PAGE_SIZE)AS page_size,ROUND((@page_size * c.CLUST_INDEX_SIZE)/(1024*1024)) AS pk_mb,ROUND((@page_size * c.OTHER_INDEX_SIZE)/(1024*1024)) AS secidx_mbFROM INFORMATION_SCHEMA.INNODB_TABLES aINNER JOIN INFORMATION_SCHEMA.INNODB_TABLESPACES b on a.NAME = b.NAMEINNER JOIN INFORMATION_SCHEMA.INNODB_TABLESTATS c on b.NAME = c.NAMEWHERE a.NAME LIKE 'employees/%'ORDER BY a.NAME DESC;------------------------ ------------ ----------- ------- ----------- |名字| row_format | page_size | pk_mb | secidx_mb | ------------------------ ------------ ----------- ------- ----------- |员工/职称|动态| 16384 | 20 | 11 | |员工薪金|动态| 16384 | 93 | 34 | |员工/员工|动态| 16384 | 15 | 0 | |员工/ dept_manager |动态| 16384 | 0 0 | | |员工/ dept_emp |动态| 16384 | 12 |十| |员工/部门|动态| 16384 | 0 0 | | ------------------------ ------------ ----------- ------- -----------

15.14.4 InnoDB表的架构信息_ fulltext index

下面的表中存储的元数据FULLTEXT指标:

MySQL的&#62;SHOW TABLES FROM INFORMATION_SCHEMA LIKE 'INNODB_FT%';表中的信息------------------------------------------- | _ _ _模式(FT | InnoDB _ %)------------------------------------------- | InnoDB _ FT _ InnoDB配置| | _ FT _被_消去| | InnoDB _ FT _消去| | InnoDB默认_ FT _ _ +屏蔽词| | InnoDB _ FT _指数_ | | InnoDB表_ FT _指数_ | -------------------------------------------缓存

表概述

笔记

除了INNODB_FT_DEFAULT_STOPWORD表格,你必须设置innodb_ft_aux_table配置变量表的名字(database_name/table_name)包含全文指标。否则,InnoDB全文指数INFORMATION_SCHEMA表出现空

例15.5 information_schema InnoDB索引表

这个例子使用一张FULLTEXT包含在数据显示指数全文指数INFORMATION_SCHEMA

  1. 在创建一个表FULLTEXT指数和插入一些数据:

    MySQL的&#62;CREATE TABLE articles (id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,title VARCHAR(200),body TEXT,FULLTEXT (title,body)) ENGINE=InnoDB;MySQL的&#62;INSERT INTO articles (title,body) VALUES('MySQL Tutorial','DBMS stands for DataBase ...'),('How To Use MySQL Well','After you went through a ...'),('Optimizing MySQL','In this tutorial we will show ...'),('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),('MySQL vs. YourSQL','In the following database comparison ...'),('MySQL Security','When configured properly, MySQL ...');
  2. 设置innodb_ft_aux_table变量表的名字与全文指数如果没有设置这个变量,这InnoDB全文INFORMATION_SCHEMA表出现空荡荡的,除了INNODB_FT_DEFAULT_STOPWORD

    MySQL的&#62;SET GLOBAL innodb_ft_aux_table = 'test/articles';
  3. 查询INNODB_FT_INDEX_CACHE表,这表明新插入的行中的信息全文指数为了避免昂贵的索引重组在DML操作,新插入的行的数据保留在FULLTEXT直到索引缓存OPTIMIZE TABLE运行(或直到服务器关闭或缓存超过限制)。

    MySQL的&#62;SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE LIMIT 5;------------ -------------- ------------- ----------- -------- ---------- |字| first_doc_id | last_doc_id | doc_count | doc_id |位置| ------------ -------------- ------------- ----------- -------- ---------- | 1001 | 5 | 5 | 1 | 5 | 0 | |后| 3 | 3 | 1 | 3 | 22 | |比较| 6 | 6 1 6 44 | | | | |配置| 7 | 7 | 1 | 7 | 20 | |数据库| 2 | 6 | 2 | 2 | 31 | ------------ -------------- ------------- ----------- -------- ----------
  4. 使innodb_optimize_fulltext_only和运行OPTIMIZE TABLE在表中包含全文指数此操作将该内容FULLTEXT在主索引缓存全文指数innodb_optimize_fulltext_only变化的方式OPTIMIZE TABLE语句运行InnoDB表,旨在使暂时,在维护操作InnoDB全文指标

    mysql> SET GLOBAL innodb_optimize_fulltext_only=ON;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> OPTIMIZE TABLE articles;
    +---------------+----------+----------+----------+
    | Table         | Op       | Msg_type | Msg_text |
    +---------------+----------+----------+----------+
    | test.articles | optimize | status   | OK       |
    +---------------+----------+----------+----------+
    
  5. 查询INNODB_FT_INDEX_TABLE表观的主要数据信息全文指标,包括就得从数据信息FULLTEXT索引缓存

    MySQL的&#62;SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE LIMIT 5;------------ -------------- ------------- ----------- -------- ---------- |字| first_doc_id | last_doc_id | doc_count | doc_id |位置| ------------ -------------- ------------- ----------- -------- ---------- | 1001 | 5 | 5 | 1 | 5 | 0 | |后| 3 | 3 | 1 | 3 | 22 | |比较| 6 | 6 1 6 44 | | | | |配置| 7 | 7 | 1 | 7 | 20 | |数据库| 2 | 6 | 2 | 2 | 31 | ------------ -------------- ------------- ----------- -------- ----------

    这个INNODB_FT_INDEX_CACHE表现在空自OPTIMIZE TABLE操作冲全文索引缓存

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE LIMIT 5;
    Empty set (0.00 sec)
    
  6. 从删除一些记录test/articles

    MySQL的&#62;DELETE FROM test.articles WHERE id < 4;查询行,3行受影响(0.11秒)
  7. 查询INNODB_FT_DELETED表本表中删除记录行全文指数为了避免昂贵的索引重组在DML操作,了解新的删除记录信息分别存储,过滤搜索结果的时候你做文本搜索,然后取出主要的搜索指数当你运行OPTIMIZE TABLE

    MySQL的&#62;SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DELETED;-------- | DOC _ ID | -------- | 2 3 4 | | | | | --------
  8. 运行OPTIMIZE TABLE删除删除的记录

    MySQL的&#62;OPTIMIZE TABLE articles;--------------- ---------- ---------- ---------- |表| OP | msg_type | msg_text | --------------- ---------- ---------- ---------- | test.articles |优化|状态|好| --------------- ---------- ---------- ----------

    这个INNODB_FT_DELETED表应该现在出现空

    MySQL的&#62;SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DELETED;空集合(0秒)
  9. 查询INNODB_FT_CONFIG表这个表格包含的元数据全文指数及相关处理:

    • optimize_checkpoint_limit是多少秒后一OPTIMIZE TABLE止损

    • synced_doc_id是下一个DOC _ ID将发行

    • stopword_table_name是的database/table一个用户定义的表名称的词。这场出现空如果没有自定义词表。

    • use_stopword指示是否一词用桌子,它的定义是当全文创建索引

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_CONFIG;
    +---------------------------+-------+
    | KEY                       | VALUE |
    +---------------------------+-------+
    | optimize_checkpoint_limit | 180   |
    | synced_doc_id             | 8     |
    | stopword_table_name       |       |
    | use_stopword              | 1     |
    +---------------------------+-------+
    

15.14.5 InnoDB缓冲池表information_schema

这个InnoDBinformation_schema缓冲池表提供的缓冲池的状态信息和元数据的页面InnoDB缓冲池

这个InnoDBinformation_schema缓冲池表包括以下:

mysql> SHOW TABLES FROM INFORMATION_SCHEMA LIKE 'INNODB_BUFFER%';
+-----------------------------------------------+
| Tables_in_INFORMATION_SCHEMA (INNODB_BUFFER%) |
+-----------------------------------------------+
| INNODB_BUFFER_PAGE_LRU                        |
| INNODB_BUFFER_PAGE                            |
| INNODB_BUFFER_POOL_STATS                      |
+-----------------------------------------------+

表概述

警告

查询INNODB_BUFFER_PAGEINNODB_BUFFER_PAGE_LRU表格可以影响性能。不查询这些表在生产系统,除非你是知道的性能影响和决定了它是可以接受的。为了避免性能对生产系统的影响,再现你要调查和查询的一个测试实例缓冲池的统计问题。

实例15.6查询系统的数据在innodb_buffer_page表

此查询提供了一个近似的数页,包含系统数据不包括页面的TABLE_NAME值是无效的或包括削减/或时期在表名,显示一个用户定义的表。

mysql> SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
       WHERE TABLE_NAME IS NULL OR (INSTR(TABLE_NAME, '/') = 0 AND INSTR(TABLE_NAME, '.') = 0);
+----------+
| COUNT(*) |
+----------+
|     1516 |
+----------+

这个查询返回的数据页包含系统的近似值,缓冲池的总页数,并包含系统数据页的近似百分比。

mysql> SELECT
       (SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
       WHERE TABLE_NAME IS NULL OR (INSTR(TABLE_NAME, '/') = 0 AND INSTR(TABLE_NAME, '.') = 0)
       ) AS system_pages,
       (
       SELECT COUNT(*)
       FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
       ) AS total_pages,
       (
       SELECT ROUND((system_pages/total_pages) * 100)
       ) AS system_page_percentage;
+--------------+-------------+------------------------+
| system_pages | total_pages | system_page_percentage |
+--------------+-------------+------------------------+
|          295 |        8192 |                      4 |
+--------------+-------------+------------------------+

缓冲池内系统数据类型可以通过查询PAGE_TYPE价值。例如,下面的查询将返回八个不同的网页类型包含系统数据的网页中的价值:

mysql> SELECT DISTINCT PAGE_TYPE FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
       WHERE TABLE_NAME IS NULL OR (INSTR(TABLE_NAME, '/') = 0 AND INSTR(TABLE_NAME, '.') = 0);
+-------------------+
| PAGE_TYPE         |
+-------------------+
| SYSTEM            |
| IBUF_BITMAP       |
| UNKNOWN           |
| FILE_SPACE_HEADER |
| INODE             |
| UNDO_LOG          |
| ALLOCATED         |
+-------------------+

实例15.7查询用户数据在innodb_buffer_page表

此查询提供了一个近似的数页包含用户数据通过计算页面的TABLE_NAME不为空NOT LIKE '%INNODB_TABLES%'

MySQL的&#62;SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGEWHERE TABLE_NAME IS NOT NULL AND TABLE_NAME NOT LIKE '%INNODB_TABLES%';---------- |计数(*)| ---------- | 7897 | ----------

这个查询返回的页面包含用户数据的近似值,缓冲池的总页数,并包含用户数据页面的近似百分比。

mysql> SELECT
       (SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
       WHERE TABLE_NAME IS NOT NULL AND (INSTR(TABLE_NAME, '/') > 0 OR INSTR(TABLE_NAME, '.') > 0)
       ) AS user_pages,
       (
       SELECT COUNT(*)
       FROM information_schema.INNODB_BUFFER_PAGE
       ) AS total_pages,
       (
       SELECT ROUND((user_pages/total_pages) * 100)
       ) AS user_page_percentage;
+------------+-------------+----------------------+
| user_pages | total_pages | user_page_percentage |
+------------+-------------+----------------------+
|       7897 |        8192 |                   96 |
+------------+-------------+----------------------+

该查询标识用户定义的表在缓冲池页面:

mysql> SELECT DISTINCT TABLE_NAME FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
       WHERE TABLE_NAME IS NOT NULL AND (INSTR(TABLE_NAME, '/') > 0 OR INSTR(TABLE_NAME, '.') > 0)
       AND TABLE_NAME NOT LIKE '`mysql`.`innodb_%';
+-------------------------+
| TABLE_NAME              |
+-------------------------+
| `employees`.`salaries`  |
| `employees`.`employees` |
+-------------------------+

实例15.8查询索引数据在innodb_buffer_page表

有关索引页面信息,查询INDEX_NAME使用索引名称列。例如,下面的查询返回的页面和页面数据的总大小的数量不,不,不指数被定义在employees.salaries

MySQL的&#62;SELECT INDEX_NAME, COUNT(*) AS Pages,ROUND(SUM(IF(COMPRESSED_SIZE = 0, @@global.innodb_page_size, COMPRESSED_SIZE))/1024/1024)AS 'Total Data (MB)'FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGEWHERE INDEX_NAME='emp_no' AND TABLE_NAME = '`employees`.`salaries`';| ------------ ------- -----------------总指数数据页| | _ name(MB)| ------------ ------- ----------------- | EMP _不| 1609 | 25 | ------------ -------;

此查询返回的页面,在页面中定义的所有指标的总数据大小的数量employees.salaries

MySQL的&#62;SELECT INDEX_NAME, COUNT(*) AS Pages,ROUND(SUM(IF(COMPRESSED_SIZE = 0, @@global.innodb_page_size, COMPRESSED_SIZE))/1024/1024)AS 'Total Data (MB)'FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGEWHERE TABLE_NAME = '`employees`.`salaries`'GROUP BY INDEX_NAME;------------ ------- ----------------- | index_name |页|总数据(MB)| ------------ ------- ----------------- | emp_no | 1608 | 25 | |初级| 6086 | 95 | ------------ ------- -----------------

例15.9在innodb_buffer_page_lru lru_position数据表查询

这个INNODB_BUFFER_PAGE_LRU表是在页面信息InnoDB缓冲池,特别是他们是如何决定哪些网页下令驱逐从缓冲池,当它变得完整。此网页的定义是相同的INNODB_BUFFER_PAGE,除了这个表有一个_ LRU的位置而不是列BLOCK_ID专栏

该查询项的位置数的页在被占领的LRU列表的特定位置employees.employees

MySQL的&#62;SELECT COUNT(LRU_POSITION) FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE_LRUWHERE TABLE_NAME='`employees`.`employees`' AND LRU_POSITION < 3072;--------------------- |计数(lru_position)| --------------------- | 548 | ---------------------

实例15.10查询innodb_buffer_pool_stats表

这个INNODB_BUFFER_POOL_STATS表提供了类似的信息SHOW ENGINE INNODB STATUSInnoDBBoffer pool变量。

mysql> SELECT * FROM information_schema.INNODB_BUFFER_POOL_STATS \G
*************************** 1. row ***************************
                         POOL_ID: 0
                       POOL_SIZE: 8192
                    FREE_BUFFERS: 1
                  DATABASE_PAGES: 8173
              OLD_DATABASE_PAGES: 3014
         MODIFIED_DATABASE_PAGES: 0
              PENDING_DECOMPRESS: 0
                   PENDING_READS: 0
               PENDING_FLUSH_LRU: 0
              PENDING_FLUSH_LIST: 0
                PAGES_MADE_YOUNG: 15907
            PAGES_NOT_MADE_YOUNG: 3803101
           PAGES_MADE_YOUNG_RATE: 0
       PAGES_MADE_NOT_YOUNG_RATE: 0
               NUMBER_PAGES_READ: 3270
            NUMBER_PAGES_CREATED: 13176
            NUMBER_PAGES_WRITTEN: 15109
                 PAGES_READ_RATE: 0
               PAGES_CREATE_RATE: 0
              PAGES_WRITTEN_RATE: 0
                NUMBER_PAGES_GET: 33069332
                        HIT_RATE: 0
    YOUNG_MAKE_PER_THOUSAND_GETS: 0
NOT_YOUNG_MAKE_PER_THOUSAND_GETS: 0
         NUMBER_PAGES_READ_AHEAD: 2713
       NUMBER_READ_AHEAD_EVICTED: 0
                 READ_AHEAD_RATE: 0
         READ_AHEAD_EVICTED_RATE: 0
                    LRU_IO_TOTAL: 0
                  LRU_IO_CURRENT: 0
                UNCOMPRESS_TOTAL: 0
              UNCOMPRESS_CURRENT: 0

比较,SHOW ENGINE INNODB STATUS输出InnoDB缓冲池的状态变量的输出如下所示,基于相同的数据集。

为更多的信息关于SHOW ENGINE INNODB STATUS输出,看第15.16.3,“InnoDB标准监控锁监视器输出”

mysql> SHOW ENGINE INNODB STATUS \G
...
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 137428992
Dictionary memory allocated 579084
Buffer pool size   8192
Free buffers       1
Database pages     8173
Old database pages 3014
Modified db pages  0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 15907, not young 3803101
0.00 youngs/s, 0.00 non-youngs/s
Pages read 3270, created 13176, written 15109
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 8173, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
...

状态变量的描述,参见第5.1.9,“服务器状态变量”

mysql> SHOW STATUS LIKE 'Innodb_buffer%';
+---------------------------------------+-------------+
| Variable_name                         | Value       |
+---------------------------------------+-------------+
| Innodb_buffer_pool_dump_status        | not started |
| Innodb_buffer_pool_load_status        | not started |
| Innodb_buffer_pool_resize_status      | not started |
| Innodb_buffer_pool_pages_data         | 8173        |
| Innodb_buffer_pool_bytes_data         | 133906432   |
| Innodb_buffer_pool_pages_dirty        | 0           |
| Innodb_buffer_pool_bytes_dirty        | 0           |
| Innodb_buffer_pool_pages_flushed      | 15109       |
| Innodb_buffer_pool_pages_free         | 1           |
| Innodb_buffer_pool_pages_misc         | 18          |
| Innodb_buffer_pool_pages_total        | 8192        |
| Innodb_buffer_pool_read_ahead_rnd     | 0           |
| Innodb_buffer_pool_read_ahead         | 2713        |
| Innodb_buffer_pool_read_ahead_evicted | 0           |
| Innodb_buffer_pool_read_requests      | 33069332    |
| Innodb_buffer_pool_reads              | 558         |
| Innodb_buffer_pool_wait_free          | 0           |
| Innodb_buffer_pool_write_requests     | 11985961    |
+---------------------------------------+-------------+

15.14.6 InnoDB information_schema度量表

这个INNODB_METRICS该数据表InnoDB性能和资源相关的计数器:

的列INNODB_METRICS桌子下面的示例所示。为每列的说明,见第24.35.16,“information_schema innodb_metrics表”

mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME="dml_inserts" \G
*************************** 1. row ***************************
           NAME: dml_inserts
      SUBSYSTEM: dml
          COUNT: 46273
      MAX_COUNT: 46273
      MIN_COUNT: NULL
      AVG_COUNT: 492.2659574468085
    COUNT_RESET: 46273
MAX_COUNT_RESET: 46273
MIN_COUNT_RESET: NULL
AVG_COUNT_RESET: NULL
   TIME_ENABLED: 2014-11-28 16:07:53
  TIME_DISABLED: NULL
   TIME_ELAPSED: 94
     TIME_RESET: NULL
         STATUS: enabled
           TYPE: status_counter
        COMMENT: Number of rows inserted

启用、禁用、复位计数器

您可以启用、禁用、复位计数器使用以下配置选项:

  • innodb_monitor_enable:使一个或多个计数器。

    SET GLOBAL innodb_monitor_enable = [counter-name|module_name|pattern|all];
  • innodb_monitor_disable:禁用一个或多个计数器。

    SET GLOBAL innodb_monitor_disable = [counter-name|module_name|pattern|all];
  • innodb_monitor_reset:重置一个或多个计数器的计数值为零。

    SET GLOBAL innodb_monitor_reset = [counter-name|module_name|pattern|all];
  • innodb_monitor_reset_all:重置所有值的一个或多个计数器。一个计数器必须在使用前被禁用innodb_monitor_reset_all

    SET GLOBAL innodb_monitor_reset_all = [counter-name|module_name|pattern|all];

您还可以启用计数器和计数器模块在启动时使用MySQL服务器配置文件。例如,使log模块,metadata_table_handles_openedmetadata_table_handles_closed计数器,在输入下面的线[ mysqld ]部分的你my.cnf配置文件

[mysqld]innodb_monitor_enable = module_recovery,metadata_table_handles_opened,metadata_table_handles_closed

当启用多个柜台或模块在您的配置文件,您必须指定innodb_monitor_enable配置选项后跟计数器模块名称以逗号分隔,如上面的例子。只有innodb_monitor_enable选项可用于您的配置文件。禁用和重新配置选项只在命令行支持。

笔记

因为每个计数器对服务器上的一定程度的运行时开销,通常要使测试更多的柜台和发展实验和测试期间服务器,只有使生产服务器的计数器来诊断问题或监控方面,很可能是为一个特定的服务器和工作量的瓶颈。

计数器

代表在柜台INNODB_METRICS表格是随时变化的,所以最新列表,查询运行MySQL服务器。下面的列表显示计数器,可作为MySQL 8。

计数器是默认启用的对应于所使用的SHOW ENGINE INNODB STATUS。计数器的使用SHOW ENGINE INNODB STATUS总是打开(放)在系统水平上但你可以禁用这些计数器INNODB_METRICS表的要求。同时,计数器状态不具有持续性。除非另有规定,计数器恢复到默认的启用或禁用状态,当服务器重启。

如果你运行程序,可以通过增加或改变的影响INNODB_METRICS表,建议你复习笔记和查询发布INNODB_METRICS前升级为新版本的表

MySQL的&#62;SELECT name, subsystem, status FROM INFORMATION_SCHEMA.INNODB_METRICS ORDER BY NAME;子系统名称------------------------------------------ ------------------------选择| | |状态自适应选择| ------------------------------------------ ------------------------ | _哈希_页面添加_ _ |自适应哈希指数| _残疾人| |自适应哈希_页面删除_ _ |自适应哈希指数_ _ |残疾人| _ |自适应哈希_ rows _增值|自适应_ _ |残疾人|哈希指数|自适应_ _ rows删除哈希散列_ _ _ NO _收|自适应哈希指数_ _ |残疾人| |自适应_ _ _ rows删除哈希散列索引|自适应_ _ |残疾人| |自适应_ _ rows _ |自适应更新哈希哈希索引_ _ |残疾人| | _ _ |自适应哈希搜索自适应散列索引_ _ | | |启用自适应哈希搜索_ _ _ btree指数_ |自适应哈希_ |启用缓冲数据读取| | _ _ |启用缓冲数据缓冲区| | | _ _写缓冲功能的| | | | _冲洗_自适应缓冲缓冲区缓冲区残疾人| | | | _冲洗_自适应_ AVG _护照|缓冲缓冲|残疾人| | _冲洗_自适应_ AVG _ _ EST |缓冲时间缓冲|残疾人| | _冲洗_自适应_ AVG _时_ |缓冲槽|残疾人| |缓冲_ _自适应_ AVG _冲洗时间_ | |残疾人线程缓冲缓冲| | _冲洗_自适应_页面缓冲| |残疾人| |缓冲_冲洗_完全自适应_ _页面缓冲| |残疾人| |缓冲_冲洗_ AVG _页缓冲_率| |残疾人| |缓冲_冲洗_ AVG _ |缓冲|残疾人| |护照_冲洗缓冲时间缓冲_ AVG _ | |残疾人| |缓冲_冲洗_背景|缓冲缓冲|残疾人| | _冲洗_背景_页面缓冲| |残疾人| |缓冲_冲洗_背景_完全_页面缓冲| |残疾人| |缓冲_ _ |批量冲洗缓冲区缓冲区残疾人| | | _间歇冲洗_ _ Num _扫描|缓冲缓冲|残疾人| | _间歇冲洗_ _页面缓冲| |残疾人| |缓冲_间歇冲洗_ _扫描|缓冲缓冲|残疾人| | _间歇冲洗_ _扫描_呼叫通过_ | |残疾人| |缓冲器缓冲器_间歇冲洗_ _完全_页面缓冲| |残疾人| |缓冲_冲洗_ lsn _ AVG _率|缓冲缓冲|残疾人| | _冲洗_近邻|缓冲缓冲|残疾人| | _冲洗_近邻_页面缓冲| |残疾人| |缓冲_冲洗_近邻_完全| _页面缓冲|残疾人| |缓冲_冲洗冲洗_ _ N到_ _ red _时代|缓冲缓冲|残疾人| | _冲洗冲洗_ _ N到_ _请求缓冲| |残疾人| |缓冲_冲洗肮脏的_ PCT _ _ | |禁用缓存

计数器模块

模块名称对应,但不完全相同,从价值观SUBSYSTEM列的INNODB_METRICS表而启用,禁用,或重置计数器单独,您可以使用模块名快速启用,禁用,或重置为一个特定的子系统的所有计数器。例如,使用module_dml使与之相关的所有计数器dml子系统

MySQL的&#62;SET GLOBAL innodb_monitor_enable = module_dml;MySQL的&#62;SELECT name, subsystem, status FROM INFORMATION_SCHEMA.INNODB_METRICSWHERE subsystem ='dml';------------- ----------- --------- |名字|子系统|状态| ------------- ----------- --------- | dml_reads | DML |启用| | dml_inserts | DML |启用| | dml_deletes | DML |启用| | dml_updates | DML |启用| ------------- ----------- ---------

这是你可以利用的价值module_nameinnodb_monitor_enable和相关的配置选项,以及相应的子系统姓名

  • module_adaptive_hash(subsystem =adaptive_hash_index

  • module_buffer(subsystem =缓冲区

  • module_buffer_page(subsystem =buffer_page_io

  • module_compress(subsystem =压缩

  • module_ddl(subsystem =DDL

  • module_dml(subsystem =DML

  • module_file(subsystem =file_system

  • module_ibuf_system(subsystem =change_buffer

  • module_icp(subsystem =ICP

  • module_index(subsystem =指数

  • module_innodb(subsystem =InnoDB

  • module_lock(subsystem =锁具

  • module_log(subsystem =恢复

  • module_metadata(subsystem =元数据

  • module_os(subsystem =操作系统

  • module_purge(subsystem =净化

  • module_trx(subsystem =交易

例15.11 innodb_metrics表计数器的工作

这个例子演示了启用、禁用、复位计数器和计数器数据查询INNODB_METRICS

  1. 创建一个简单的InnoDB

    MySQL的&#62;USE test;数据库changedmysql &#62;CREATE TABLE t1 (c1 INT) ENGINE=INNODB;查询行,0行受影响(0.02秒)
  2. 使dml_inserts计数器

    MySQL的&#62;SET GLOBAL innodb_monitor_enable = dml_inserts;查询行,0行受影响(0.01秒)

    描述了dml_inserts计数器中可以找到评论列的INNODB_METRICS

    MySQL的&#62;SELECT NAME, COMMENT FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME="dml_inserts";------------- ------------------------- |名字|评论| ------------- ------------------------- | dml_inserts |行数插入| ------------- -------------------------
  3. 查询INNODB_METRICS表为_插入DML计数器数据。因为没有DML操作已经完成,该计数器的值为零或零。这个TIME_ENABLED_ elapsed时值指示当计数器最后被启用,因为这时间有多少秒。

    mysql>  SELECT * FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME="dml_inserts" \G
    *************************** 1. row ***************************
               NAME: dml_inserts
          SUBSYSTEM: dml
              COUNT: 0
          MAX_COUNT: 0
          MIN_COUNT: NULL
          AVG_COUNT: 0
        COUNT_RESET: 0
    MAX_COUNT_RESET: 0
    MIN_COUNT_RESET: NULL
    AVG_COUNT_RESET: NULL
       TIME_ENABLED: 2014-12-04 14:18:28
      TIME_DISABLED: NULL
       TIME_ELAPSED: 28
         TIME_RESET: NULL
             STATUS: enabled
               TYPE: status_counter
            COMMENT: Number of rows inserted
    
  4. 插入三行数据到表

    mysql> INSERT INTO t1 values(1);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> INSERT INTO t1 values(2);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> INSERT INTO t1 values(3);
    Query OK, 1 row affected (0.00 sec)
    
  5. 查询INNODB_METRICS对于再次表_插入DML计数器数据。一批反价值已经增加的包括COUNT最大_计数AVG_COUNT,和count_reset。指的是INNODB_METRICS对这些价值观的描述表定义。

    MySQL的&#62;SELECT * FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME="dml_inserts"\G×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××1。××××××××××××××××××××××××一×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××:子系统名称:DML DML:_刀片3计数最大计数:3分钟_ _计数:计数:计数零平均_ 0.046153846153846156 _ _计数复位:复位:3max _ _ 3min _计数计数复位:复位:nullavg _ _零时间:2014年启用_—12—04 28 14 18队球队_ _残疾人:空运行时间:时间:_ 65复位启用状态:零状态_型:评论:插入的行数计数器
  6. 重置dml_inserts计数器,和查询INNODB_METRICS对于再次表_插入DML计数器数据。这个%_RESET值进行了报道,如count_resetMAX_RESET,设置回零。这样的价值观计数MAX_COUNT,和【中文解释】,累计收集数据从时间计数器启用,不受复位。

    mysql> SET GLOBAL innodb_monitor_reset = dml_inserts;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME="dml_inserts"\G
    *************************** 1. row ***************************
               NAME: dml_inserts
          SUBSYSTEM: dml
              COUNT: 3
          MAX_COUNT: 3
          MIN_COUNT: NULL
          AVG_COUNT: 0.03529411764705882
        COUNT_RESET: 0
    MAX_COUNT_RESET: 0
    MIN_COUNT_RESET: NULL
    AVG_COUNT_RESET: 0
       TIME_ENABLED: 2014-12-04 14:18:28
      TIME_DISABLED: NULL
       TIME_ELAPSED: 85
         TIME_RESET: 2014-12-04 14:19:44
             STATUS: enabled
               TYPE: status_counter
            COMMENT: Number of rows inserted
    
  7. 重置所有计数器的值,必须先禁用计数器。禁用计数器集STATUS价值关闭

    mysql> SET GLOBAL innodb_monitor_disable = dml_inserts;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME="dml_inserts"\G
    *************************** 1. row ***************************
               NAME: dml_inserts
          SUBSYSTEM: dml
              COUNT: 3
          MAX_COUNT: 3
          MIN_COUNT: NULL
          AVG_COUNT: 0.030612244897959183
        COUNT_RESET: 0
    MAX_COUNT_RESET: 0
    MIN_COUNT_RESET: NULL
    AVG_COUNT_RESET: 0
       TIME_ENABLED: 2014-12-04 14:18:28
      TIME_DISABLED: 2014-12-04 14:20:06
       TIME_ELAPSED: 98
         TIME_RESET: NULL
             STATUS: disabled
               TYPE: status_counter
            COMMENT: Number of rows inserted
    
    笔记

    通配符匹配计数器和模块名支持。例如,而不是指定的全dml_inserts计数器名称,可以指定容器的_)%。您还可以启用,禁用,或重置多个柜台或模块一次使用通配符匹配。例如,指定dml_%启用、禁用,或重置开始所有计数器容器的_ %

  8. 后反被禁用,您可以重置所有计数器值的使用innodb_monitor_reset_all选项所有的值都设置为零或空。

    MySQL的&#62;SET GLOBAL innodb_monitor_reset_all = dml_inserts;查询好,为受影响的行(0.001秒)MySQL &#62;SELECT * FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME="dml_inserts"\G×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××1。××××××××××××××××××××××××一×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××:子系统名称:DML DML:_插入计数最大计数为0 _空:空_字数:字数:AVG _ _零计数计数复位:复位:0max _ _ nullmin _ _计数计数复位:复位:nullavg _ _启用时间:时间_空空空的时间运行时间的设置:_ _:空:空时_复位状态设置状态:评论:_型:插入的行数计数器

15.14.7 InnoDB information_schema临时表信息表

INNODB_TEMP_TABLE_INFO提供有关用户的信息创建InnoDB临时表是目前活跃在InnoDB实例。它没有提供信息有关的内部InnoDB临时表,查询优化器使用。

mysql> SHOW TABLES FROM INFORMATION_SCHEMA LIKE 'INNODB_TEMP%';
+---------------------------------------------+
| Tables_in_INFORMATION_SCHEMA (INNODB_TEMP%) |
+---------------------------------------------+
| INNODB_TEMP_TABLE_INFO                      |
+---------------------------------------------+

为表定义,见第24.35.29,“information_schema innodb_temp_table_info表”

例15.12 innodb_temp_table_info

此示例演示的特点INNODB_TEMP_TABLE_INFO

  1. 创建一个简单的InnoDB临时表:

    MySQL的&#62;CREATE TEMPORARY TABLE t1 (c1 INT PRIMARY KEY) ENGINE=INNODB;
  2. 查询INNODB_TEMP_TABLE_INFO查看临时表的元数据

    MySQL的&#62;SELECT * FROM INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO\G*************************** 1。行*************************** table_id:194名称:# sql7a79_1_0 n_cols:4空间:182

    这个TABLE_ID 对于临时表的唯一标识符。这个姓名列显示系统生成的临时表的名称,它是以# SQL。列数(N_COLS)是4而不是1因为InnoDB总是有三个隐藏的表列(DB_ROW_ID_ TRX _ DB ID,和DB_ROLL_PTR

  3. 启动MySQL查询INNODB_TEMP_TABLE_INFO

    MySQL的&#62;SELECT * FROM INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO\G

    返回空集因为INNODB_TEMP_TABLE_INFO和它里面的数据不保留在服务器关闭磁盘。

  4. 创建一个新的临时表

    mysql> CREATE TEMPORARY TABLE t1 (c1 INT PRIMARY KEY) ENGINE=INNODB;
    
  5. 查询INNODB_TEMP_TABLE_INFO查看临时表的元数据

    MySQL的&#62;SELECT * FROM INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO\G*************************** 1。行*************************** table_id:196名称:# sql7b0e_1_0 n_cols:4空间:184

    这个SPACE我是新的因为它是动态生成的服务器上重新启动。


15.14.8 InnoDB表空间元数据检索information_schema.files

这个INFORMATION_SCHEMA.FILES表提供了元数据的所有InnoDB包括每个表的表空间文件禁忌将军,的系统表空间临时表的表空间,和基于还原表空间(如果存在的话)

本节提供InnoDB具体用法的例子。有关所提供的数据的更多信息INFORMATION_SCHEMA.FILES表,看24.9节,“information_schema文件表”

笔记

这个INNODB_TABLESPACESINNODB_DATAFILES表格还提供元数据InnoDB表空间的数据文件,但仅限于每个表和一般的表空间。

该查询检索的元数据InnoDB从领域的系统表空间INFORMATION_SCHEMA.FILES表是相关的InnoDB表空间INFORMATION_SCHEMA.FILES是不相关的领域InnoDB始终返回null,并排除查询。

mysql> SELECT FILE_ID, FILE_NAME, FILE_TYPE, TABLESPACE_NAME, FREE_EXTENTS,
       TOTAL_EXTENTS,  EXTENT_SIZE, INITIAL_SIZE, MAXIMUM_SIZE, AUTOEXTEND_SIZE, DATA_FREE, STATUS ENGINE
       FROM INFORMATION_SCHEMA.FILES WHERE TABLESPACE_NAME LIKE 'innodb_system' \G
*************************** 1. row ***************************
        FILE_ID: 0
      FILE_NAME: ./ibdata1
      FILE_TYPE: TABLESPACE
TABLESPACE_NAME: innodb_system
   FREE_EXTENTS: 0
  TOTAL_EXTENTS: 12
    EXTENT_SIZE: 1048576
   INITIAL_SIZE: 12582912
   MAXIMUM_SIZE: NULL
AUTOEXTEND_SIZE: 67108864
      DATA_FREE: 4194304
         ENGINE: NORMAL

该查询检索FILE_ID(相当于空间ID)和file_name(包括路径信息)为InnoDB每个表和一般的表空间文件。每个表和表空间文件有一个鸡传染性法氏囊病文件扩展名

mysql> SELECT FILE_ID, FILE_NAME FROM INFORMATION_SCHEMA.FILES
       WHERE FILE_NAME LIKE '%.ibd%' ORDER BY FILE_ID;
    +---------+---------------------------------------+
    | FILE_ID | FILE_NAME                             |
    +---------+---------------------------------------+
    |       2 | ./mysql/plugin.ibd                    |
    |       3 | ./mysql/servers.ibd                   |
    |       4 | ./mysql/help_topic.ibd                |
    |       5 | ./mysql/help_category.ibd             |
    |       6 | ./mysql/help_relation.ibd             |
    |       7 | ./mysql/help_keyword.ibd              |
    |       8 | ./mysql/time_zone_name.ibd            |
    |       9 | ./mysql/time_zone.ibd                 |
    |      10 | ./mysql/time_zone_transition.ibd      |
    |      11 | ./mysql/time_zone_transition_type.ibd |
    |      12 | ./mysql/time_zone_leap_second.ibd     |
    |      13 | ./mysql/innodb_table_stats.ibd        |
    |      14 | ./mysql/innodb_index_stats.ibd        |
    |      15 | ./mysql/slave_relay_log_info.ibd      |
    |      16 | ./mysql/slave_master_info.ibd         |
    |      17 | ./mysql/slave_worker_info.ibd         |
    |      18 | ./mysql/gtid_executed.ibd             |
    |      19 | ./mysql/server_cost.ibd               |
    |      20 | ./mysql/engine_cost.ibd               |
    |      21 | ./sys/sys_config.ibd                  |
    |      23 | ./test/t1.ibd                         |
    |      26 | /home/user/test/test/t2.ibd           |
    +---------+---------------------------------------+

该查询检索FILE_IDfile_nameInnoDB临时表空间。临时表空间文件名前缀ibtmp

mysql> SELECT FILE_ID, FILE_NAME FROM INFORMATION_SCHEMA.FILES
       WHERE FILE_NAME LIKE '%ibtmp%';
+---------+-----------+
| FILE_ID | FILE_NAME |
+---------+-----------+
|      22 | ./ibtmp1  |
+---------+-----------+

同样,InnoDBundo表空间文件名前缀解开。下面的查询返回FILE_IDfile_nameInnoDBundo表空间

MySQL的&#62;SELECT FILE_ID, FILE_NAME FROM INFORMATION_SCHEMA.FILESWHERE FILE_NAME LIKE '%undo%';

15.15 InnoDB集成MySQL性能模式

本节提供了一个简要介绍InnoDB性能模式集成。综合性能的架构文档,看第25章,MySQL性能模式

你可以配置一定的内部InnoDB使用MySQL操作性能模式特征。这种方法主要是专家用户评价的优化策略来克服性能瓶颈。数据库管理员也可以使用此功能进行容量规划,看看是否他们的典型工作遇到瓶颈的一个特定组合的CPU、内存、磁盘的存储;如果这样,判断性能可以通过增加系统的某些部分的能力提高。

要使用此功能检查InnoDB性能

  • 你通常必须熟悉如何使用性能模式特征。例如,你应该知道如何使仪器和消费者,以及如何查询performance_schema表中检索数据。一个介绍性的概述,看25.1节,“性能模式快速启动”

  • 你应该熟悉绩效模式的仪器,可用于InnoDB。查看InnoDB相关的工具,你可以查询setup_instruments对于包含仪器名称表InnoDB&#39;

    mysql> SELECT * FROM setup_instruments WHERE NAME LIKE '%innodb%';
    
    +-------------------------------------------------------+---------+-------+
    | NAME                                                  | ENABLED | TIMED |
    +-------------------------------------------------------+---------+-------+
    | wait/synch/mutex/innodb/commit_cond_mutex             | NO      | NO    |
    | wait/synch/mutex/innodb/innobase_share_mutex          | NO      | NO    |
    | wait/synch/mutex/innodb/autoinc_mutex                 | NO      | NO    |
    | wait/synch/mutex/innodb/buf_pool_mutex                | NO      | NO    |
    | wait/synch/mutex/innodb/buf_pool_zip_mutex            | NO      | NO    |
    | wait/synch/mutex/innodb/cache_last_read_mutex         | NO      | NO    |
    | wait/synch/mutex/innodb/dict_foreign_err_mutex        | NO      | NO    |
    | wait/synch/mutex/innodb/dict_sys_mutex                | NO      | NO    |
    | wait/synch/mutex/innodb/recalc_pool_mutex             | NO      | NO    |
    ...
    | wait/io/file/innodb/innodb_data_file                  | YES     | YES   |
    | wait/io/file/innodb/innodb_log_file                   | YES     | YES   |
    | wait/io/file/innodb/innodb_temp_file                  | YES     | YES   |
    | stage/innodb/alter table (end)                        | YES     | YES   |
    | stage/innodb/alter table (flush)                      | YES     | YES   |
    | stage/innodb/alter table (insert)                     | YES     | YES   |
    | stage/innodb/alter table (log apply index)            | YES     | YES   |
    | stage/innodb/alter table (log apply table)            | YES     | YES   |
    | stage/innodb/alter table (merge sort)                 | YES     | YES   |
    | stage/innodb/alter table (read PK and internal sort)  | YES     | YES   |
    | stage/innodb/buffer pool load                         | YES     | YES   |
    | memory/innodb/buf_buf_pool                            | NO      | NO    |
    | memory/innodb/dict_stats_bg_recalc_pool_t             | NO      | NO    |
    | memory/innodb/dict_stats_index_map_t                  | NO      | NO    |
    | memory/innodb/dict_stats_n_diff_on_level              | NO      | NO    |
    | memory/innodb/other                                   | NO      | NO    |
    | memory/innodb/row_log_buf                             | NO      | NO    |
    | memory/innodb/row_merge_sort                          | NO      | NO    |
    | memory/innodb/std                                     | NO      | NO    |
    | memory/innodb/sync_debug_latches                      | NO      | NO    |
    | memory/innodb/trx_sys_t::rw_trx_ids                   | NO      | NO    |
    ...
    +-------------------------------------------------------+---------+-------+
    155 rows in set (0.00 sec)
    

    关于仪表的附加信息InnoDB对象,你可以查询性能模式实例表,为检测对象的附加信息。相关实例表InnoDB包括:

    笔记

    Mutexes和读写锁相关的InnoDB缓冲池是不包括在该覆盖;同样的输出显示引擎InnoDB互斥命令

    例如,查看有关仪表InnoDB文件对象的性能架构在执行文件I/O设备,你可能会发出以下查询:

    MySQL的&#62;SELECT * FROM file_instances WHERE EVENT_NAME LIKE '%innodb%'\G* * * * * * * * * * * * * * * * * * * * * * * * * * * 1。行* * * * * * * * * * * * * * * * * * * * * * * * * * * _ /路径/文件名:8.0 - to / MySQL /日期/ ibdata1event _ name:/我/文件/等/ InnoDB数据_ InnoDB _ FileOpen _ count:3 * * * * * * * * * * * * * * * * * * * * * * * * * * * 2。行* * * * * * * * * * * * * * * * * * * * * * * * * * * _ /路径/文件名:8.0 - to / MySQL /日期/ IB _ logfile0event _ name:等我/ / / / _ InnoDB InnoDB日志文件_ FileOpen _ count 2:* * * * * * * * * * * * * * * * * * * * * * * * * * * 3。行* * * * * * * * * * * * * * * * * * * * * * * * * * * _ /路径/文件名:8.0 - to / MySQL /日期/ IB _ logfile1event _ name:等我/ / / / _ InnoDB InnoDB日志文件_ FileOpen _ count 2:* * * * * * * * * * * * * * * * * * * * * * * * * * * 4。行* * * * * * * * * * * * * * * * * * * * * * * * * * * _ /路径/文件名:8.0 - to / MySQL /发动机/ MySQL /日期等_ cost.ibdevent _ name:文件/ / / /我InnoDB数据_ InnoDB _ FileOpen _ count:3。
  • 你应该熟悉performance_schema表存储InnoDB事件数据。表相关InnoDB相关的事件包括:

    如果你只是感兴趣InnoDB相关的对象,使用条款在event_name像&#39;&#39;%1 InnoDB %WHERE NAME LIKE '%innodb%'当(as required)查询这些表。

15.15.1监测改变InnoDB表使用performanceschema表进展

你可以监控ALTER TABLE进展InnoDB表格的使用性能模式

有七个阶段,不同阶段的代表事件ALTER TABLE。每个阶段的事件报告一个总的运行work_completedWORK_ESTIMATED对于整体ALTER TABLE运行在其通过其不同阶段。work_estimated计算公式考虑了所有的工作,ALTER TABLE执行,并可能被修改时ALTER TABLE处理.work_completedWORK_ESTIMATED价值观是所有进行工作的抽象表示ALTER TABLE

发生顺序,ALTER TABLE阶段活动包括:

  • stage/innodb/alter table (read PK and internal sort)这个阶段是活动时:ALTER TABLE在阅读的关键阶段。它开始WORK_COMPLETED=0WORK_ESTIMATED将估计的页数主键。当阶段完成,work_estimated更新主键中的页面的实际数量。

  • stage/innodb/alter table (merge sort):这一阶段是每个指标反复加ALTER TABLE运营

  • stage/innodb/alter table (insert):这一阶段是每个指标反复加ALTER TABLE运营

  • stage/innodb/alter table (log apply index):这个阶段包括DML日志生成应用程序时ALTER TABLE运行

  • stage/innodb/alter table (flush)在这一阶段开始,work_estimated是一个更准确的估计的基础上更新,刷新列表的长度。

  • stage/innodb/alter table (log apply table)这一阶段包括:产生并发DML测井中的应用ALTER TABLE运行。这个阶段的持续时间取决于表的变化程度。如果没有并行DML运行表相是瞬间。

  • stage/innodb/alter table (end)任何剩余的工作:包括冲洗阶段后出现的,如重新执行DML,桌上同时ALTER TABLE运行

笔记

InnoDBALTER TABLE舞台事件现在不加考虑的空间索引。

修改表的使用性能模式监测实例

下面的示例演示如何使用stage/innodb/alter table%阶段事件的仪器及相关消费表来监控ALTER TABLE进步。关于绩效模式阶段事件的仪器和相关的消费者,看到第25.11.5,“表现图式阶段事件表”

  1. 使stage/innodb/alter%仪器

    MySQL的&#62;UPDATE setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'stage/innodb/alter%';查询行,7行受影响(0秒)的行匹配:7改变:7警告:0
  2. 使舞台事件消费表,其中包括events_stages_currentevents_stages_history,和events_stages_history_long

    MySQL的&#62;UPDATE setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%stages%';查询行,3行受影响(0秒)的行匹配:3改变:3警告:0
  3. 运行一个ALTER TABLE运营在这个例子中,一个中_ name列添加到员工的样本数据库的员工表。

    mysql> ALTER TABLE employees.employees ADD COLUMN middle_name varchar(14) AFTER first_name;
    Query OK, 0 rows affected (9.27 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
  4. 检查的进展ALTER TABLE通过查询性能模式运行events_stages_current表。在舞台的事件,这取决于shown differsALTER TABLE阶段是目前正在进行中。这个work_completed列显示完成工作。这个WORK_ESTIMATED柱提供剩余工作的估计。

    MySQL的&#62;SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM events_stages_current;------------------------------------------------------ ---------------- ---------------- | event_name | work_completed | work_estimated | ------------------------------------------------------ ---------------- ---------------- |阶段/ InnoDB /修改表(读PK和内部排序)| 280 | 1245 | ------------------------------------------------------ ---------------- ----------------一行集(0.01秒)

    这个events_stages_current表返回空集如果ALTER TABLE操作完成。在这种情况下,你可以检查events_stages_history表查看已完成的操作事件数据。例如:

    MySQL的&#62;SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM events_stages_history;------------------------------------------------------ ---------------- ---------------- | event_name | work_completed | work_estimated | ------------------------------------------------------ ---------------- ---------------- |阶段/ InnoDB /修改表(读PK和内部排序)| 886 | 1213 | |阶段/ InnoDB /修改表(冲洗)| 1213 | 1213 | |阶段/ InnoDB /修改表(日志申请表)| 1597 | 1597 | |阶段/ InnoDB /修改表(结束)| 1597 | 1597 | |阶段/ InnoDB /修改表(日志申请表)| 1981 | 1981 | ------------------------------------------------------ ---------------- ---------------- 5行集(0秒)

    如上图所示,该WORK_ESTIMATED值的调整是在修改表处理.估计工作的初始阶段完成后是1213。什么时候ALTER TABLE处理完成,work_estimated将实际值,这是1981。

15.15.2监测InnoDB互斥等使用性能模式

一个互斥锁是一种用于代码的执行,在一个给定的时间只有一个线程可以访问一个共享资源的同步机制。当两个或多个线程在服务器端执行需要访问相同的资源,线程互相竞争。第一个线程获得互斥锁使其他线程等待直到锁被释放。

InnoDB互斥锁,互斥等仪器,可以监测使用性能模式。等待在性能模式表收集的数据可以帮助确定互斥事件与大多数等待或最大的总等待时间,例如。

下面的示例演示如何启用InnoDB互斥等工具,如何使相关的消费者,以及如何查询等待事件数据。

  1. 要查看可用的InnoDB互斥等工具,查询的性能模式setup_instruments表全部InnoDB互斥等工具默认是关闭的。

    mysql> SELECT * FROM performance_schema.setup_instruments
           WHERE NAME LIKE '%wait/synch/mutex/innodb%';
    +---------------------------------------------------------+---------+-------+
    | NAME                                                    | ENABLED | TIMED |
    +---------------------------------------------------------+---------+-------+
    | wait/synch/mutex/innodb/commit_cond_mutex               | NO      | NO    |
    | wait/synch/mutex/innodb/innobase_share_mutex            | NO      | NO    |
    | wait/synch/mutex/innodb/autoinc_mutex                   | NO      | NO    |
    | wait/synch/mutex/innodb/autoinc_persisted_mutex         | NO      | NO    |
    | wait/synch/mutex/innodb/buf_pool_flush_state_mutex      | NO      | NO    |
    | wait/synch/mutex/innodb/buf_pool_LRU_list_mutex         | NO      | NO    |
    | wait/synch/mutex/innodb/buf_pool_free_list_mutex        | NO      | NO    |
    | wait/synch/mutex/innodb/buf_pool_zip_free_mutex         | NO      | NO    |
    | wait/synch/mutex/innodb/buf_pool_zip_hash_mutex         | NO      | NO    |
    | wait/synch/mutex/innodb/buf_pool_zip_mutex              | NO      | NO    |
    | wait/synch/mutex/innodb/cache_last_read_mutex           | NO      | NO    |
    | wait/synch/mutex/innodb/dict_foreign_err_mutex          | NO      | NO    |
    | wait/synch/mutex/innodb/dict_persist_dirty_tables_mutex | NO      | NO    |
    | wait/synch/mutex/innodb/dict_sys_mutex                  | NO      | NO    |
    | wait/synch/mutex/innodb/recalc_pool_mutex               | NO      | NO    |
    | wait/synch/mutex/innodb/fil_system_mutex                | NO      | NO    |
    | wait/synch/mutex/innodb/flush_list_mutex                | NO      | NO    |
    | wait/synch/mutex/innodb/fts_bg_threads_mutex            | NO      | NO    |
    | wait/synch/mutex/innodb/fts_delete_mutex                | NO      | NO    |
    | wait/synch/mutex/innodb/fts_optimize_mutex              | NO      | NO    |
    | wait/synch/mutex/innodb/fts_doc_id_mutex                | NO      | NO    |
    | wait/synch/mutex/innodb/log_flush_order_mutex           | NO      | NO    |
    | wait/synch/mutex/innodb/hash_table_mutex                | NO      | NO    |
    | wait/synch/mutex/innodb/ibuf_bitmap_mutex               | NO      | NO    |
    | wait/synch/mutex/innodb/ibuf_mutex                      | NO      | NO    |
    | wait/synch/mutex/innodb/ibuf_pessimistic_insert_mutex   | NO      | NO    |
    | wait/synch/mutex/innodb/log_sys_mutex                   | NO      | NO    |
    | wait/synch/mutex/innodb/log_sys_write_mutex             | NO      | NO    |
    | wait/synch/mutex/innodb/mutex_list_mutex                | NO      | NO    |
    | wait/synch/mutex/innodb/page_zip_stat_per_index_mutex   | NO      | NO    |
    | wait/synch/mutex/innodb/purge_sys_pq_mutex              | NO      | NO    |
    | wait/synch/mutex/innodb/recv_sys_mutex                  | NO      | NO    |
    | wait/synch/mutex/innodb/recv_writer_mutex               | NO      | NO    |
    | wait/synch/mutex/innodb/redo_rseg_mutex                 | NO      | NO    |
    | wait/synch/mutex/innodb/noredo_rseg_mutex               | NO      | NO    |
    | wait/synch/mutex/innodb/rw_lock_list_mutex              | NO      | NO    |
    | wait/synch/mutex/innodb/rw_lock_mutex                   | NO      | NO    |
    | wait/synch/mutex/innodb/srv_dict_tmpfile_mutex          | NO      | NO    |
    | wait/synch/mutex/innodb/srv_innodb_monitor_mutex        | NO      | NO    |
    | wait/synch/mutex/innodb/srv_misc_tmpfile_mutex          | NO      | NO    |
    | wait/synch/mutex/innodb/srv_monitor_file_mutex          | NO      | NO    |
    | wait/synch/mutex/innodb/buf_dblwr_mutex                 | NO      | NO    |
    | wait/synch/mutex/innodb/trx_undo_mutex                  | NO      | NO    |
    | wait/synch/mutex/innodb/trx_pool_mutex                  | NO      | NO    |
    | wait/synch/mutex/innodb/trx_pool_manager_mutex          | NO      | NO    |
    | wait/synch/mutex/innodb/srv_sys_mutex                   | NO      | NO    |
    | wait/synch/mutex/innodb/lock_mutex                      | NO      | NO    |
    | wait/synch/mutex/innodb/lock_wait_mutex                 | NO      | NO    |
    | wait/synch/mutex/innodb/trx_mutex                       | NO      | NO    |
    | wait/synch/mutex/innodb/srv_threads_mutex               | NO      | NO    |
    | wait/synch/mutex/innodb/rtr_active_mutex                | NO      | NO    |
    | wait/synch/mutex/innodb/rtr_match_mutex                 | NO      | NO    |
    | wait/synch/mutex/innodb/rtr_path_mutex                  | NO      | NO    |
    | wait/synch/mutex/innodb/rtr_ssn_mutex                   | NO      | NO    |
    | wait/synch/mutex/innodb/trx_sys_mutex                   | NO      | NO    |
    | wait/synch/mutex/innodb/zip_pad_mutex                   | NO      | NO    |
    | wait/synch/mutex/innodb/master_key_id_mutex             | NO      | NO    |
    +---------------------------------------------------------+---------+-------+
    
  2. 一些InnoDB互斥的实例在服务器启动时创建,只有仪表如果相关的仪器也在服务器启动时启用。确保所有InnoDB互斥情况后启用,添加以下performance-schema-instrument统治你的MySQL的配置文件:

    performance-schema-instrument='wait/synch/mutex/innodb/%=ON'

    如果你不需要等待事件的所有数据InnoDB互斥锁,你可以通过添加禁用特定的仪器仪器性能模式规则你的MySQL的配置文件。例如,禁用InnoDB互斥等全文搜索相关事件的工具,添加以下规则:

    performance-schema-instrument='wait/synch/mutex/innodb/fts%=OFF'
    笔记

    如较长的前缀wait/synch/mutex/innodb/fts%优先于较短的前缀,如规则等待/同步/互斥/会/ %

    在加入performance-schema-instrument规则配置文件,重新启动服务器。所有的InnoDB互斥除了全文搜索相关的启用。验证查询setup_instruments表这个启用TIMED柱应设置为的工具,你可以

    mysql> SELECT * FROM performance_schema.setup_instruments
           WHERE NAME LIKE '%wait/synch/mutex/innodb%';
    +-------------------------------------------------------+---------+-------+
    | NAME                                                  | ENABLED | TIMED |
    +-------------------------------------------------------+---------+-------+
    | wait/synch/mutex/innodb/commit_cond_mutex             | YES     | YES   |
    | wait/synch/mutex/innodb/innobase_share_mutex          | YES     | YES   |
    | wait/synch/mutex/innodb/autoinc_mutex                 | YES     | YES   |
    ...
    | wait/synch/mutex/innodb/master_key_id_mutex           | YES     | YES   |
    +-------------------------------------------------------+---------+-------+
    49 rows in set (0.00 sec)
    
  3. 使消费者通过更新等待事件setup_consumers表等待事件消费者默认是关闭的。

    MySQL的&#62;UPDATE performance_schema.setup_consumers SET enabled = 'YES'WHERE name like 'events_waits%';查询行,3行受影响(0秒)的行匹配:3改变:3警告:0

    您可以验证等待事件消费者的查询setup_consumers表这个events_waits_currentevents_waits_history,和events_waits_history_long消费者应该启用

    MySQL的&#62;SELECT * FROM performance_schema.setup_consumers;---------------------------------- --------- |名字|启用| ---------------------------------- --------- | events_stages_current |没有| | events_stages_history |没有| | events_stages_history_long |没有| | events_statements_current |是| | events_statements_history |是| | events_statements_history_long |没有| | events_transactions_current |是| | events_transactions_history |是| | events_transactions_history_long |没有| | events_waits_current |是| | events_waits_history |是| | events_waits_history_long |是| | global_instrumentation |是| | thread_instrumentation |是| | statements_digest |是| ---------------------------------- --------- 15行集(0秒)
  4. 一次仪表和消费者都启用,运行的工作量要监视。在这个例子中,该mysqlslap负载模拟客户端是用于模拟的工作量。

    shell> ./mysqlslap --auto-generate-sql --concurrency=100 --iterations=10 
           --number-of-queries=1000 --number-char-cols=6 --number-int-cols=6;
    
  5. 查询等待事件数据。在这个例子中,等待事件数据是通过查询events_waits_summary_global_by_event_name表中数据集events_waits_currentevents_waits_history,和events_waits_history_long表数据是通过总结(事件名称事件_ name),这是产生事件的仪器名称。汇总数据包括:

    • COUNT_STAR

      总结等事件的数量

    • SUM_TIMER_WAIT

      在总结时间等待事件的总等待时间。

    • MIN_TIMER_WAIT

      在总结时间等待事件的最小等待时间。

    • AVG_TIMER_WAIT

      在总结时间的等待事件的平均等待时间。

    • MAX_TIMER_WAIT

      最大等待的时间等待事件的时间了。

    下面的查询返回的仪器名称(EVENT_NAME), the number of wait events (count_star),和总的等待时间,仪器的事件(SUM_TIMER_WAIT)。因为等待时间在皮秒(万亿分之一秒)默认情况下,等待时间除以1000000000显示等待时间。数据是按降序排列,通过总结等事件的数量(count_star)。你可以调整ORDER BY条款的总等待时间顺序的数据。

    MySQL的&#62;SELECT EVENT_NAME, COUNT_STAR, SUM_TIMER_WAIT/1000000000 SUM_TIMER_WAIT_MSFROM performance_schema.events_waits_summary_global_by_event_nameWHERE SUM_TIMER_WAIT > 0 AND EVENT_NAME LIKE 'wait/synch/mutex/innodb/%'ORDER BY COUNT_STAR DESC;--------------------------------------------------------- ------------ ------------------- | event_name | count_star | sum_timer_wait_ms | --------------------------------------------------------- ------------ -------------------等待/同步/互斥/ | InnoDB / trx_mutex | 201111 | 23.4719 |等待/同步/互斥/ | InnoDB / fil_system_mutex | 62244 | 9.6426 |等待/同步/互斥/ | InnoDB / redo_rseg_mutex | 48238 | 3.1135 | |等待/同步/互斥/ / log_sys_mutex InnoDB | 46113 | 2.0434 |等待/同步/互斥/ | InnoDB / trx_sys_mutex | 35134 | 1068.1588 |等待/同步/互斥/ | InnoDB / lock_mutex | 34872 | 1039.2589 |等待/同步/互斥/ | InnoDB / log_sys_write_mutex | 17805 | 1526.0490 | | /同步/互斥/等/ dict_sys_mutex InnoDB | 14912 | 1606.7348 | |等待/同步/ / / trx_undo_mutex InnoDB互斥| 10634 | 1.1424 |等待/同步/互斥/ | InnoDB / rw_lock_list_mutex | 8538 | 0.1960 |等待/同步/互斥/ | InnoDB / buf_pool_free_list_mutex | 5961 |传代后|等待/同步/互斥/ | InnoDB / trx_pool_mutex |四千八百八十五| 8821.7496 | | /同步/互斥/ InnoDB等/ buf_pool_lru_list_mutex | 4364 | 0.2077 |等待/同步/互斥/ | InnoDB / innobase_share_mutex |吗| 0.2650 |等待/同步/互斥/ | InnoDB / flush_list_mutex | 3178 | 0.2349 |等待/同步/互斥/ | InnoDB / trx_pool_manager_mutex |以下| 0.1310 |等待/同步/互斥/ | InnoDB / buf_pool_flush_state_mutex | 1318 | 0.2161 |等待/同步/互斥/ | InnoDB / log_flush_order_mutex | 1250 | 0.0893 |等待/同步/互斥/ | InnoDB / buf_dblwr_mutex | 951 | 0.0918 | | /同步/互斥/创新等670 | 0.0942分贝/ recalc_pool_mutex | |等待/同步/互斥/ | InnoDB / dict_persist_dirty_tables_mutex | 345 | 0.0414 |等待/同步/互斥/ | InnoDB / lock_wait_mutex | 303 | 0.1565 |等待/同步/互斥/ | InnoDB / autoinc_mutex | 196 | 0.0213 |等待/同步/互斥/ | InnoDB / autoinc_persisted_mutex | 196 | 0.0175 |等待/同步/互斥/ | InnoDB / purge_sys_pq_mutex | 117 | 0.0308 |等待/同步/互斥/ | InnoDB / srv_sys_mutex | 94 | 0.0077 |等待/同步/互斥/ | InnoDB / ibuf_mutex | 22 | 0.0086 |等待/同步/互斥/ | InnoDB / recv_sys_mutex | 12 | 0.0008 | |等待/同步/互斥/会/ srv_innodb_monitor_mutex | 4 | 0.0009 | | /同步/互斥/等/ recv_writer_mutex InnoDB
    笔记

    前面的结果集包含等待事件数据的启动过程中产生的。排除这些数据,你可以使用events_waits_summary_global_by_event_name启动后,运行您的工作量之前立即表。然而,截断操作本身可能会产生一个微不足道的等待事件数据。

    MySQL的&#62;TRUNCATE performance_schema.events_waits_summary_global_by_event_name;

15.16 InnoDB监视器

InnoDB显示器提供的信息InnoDB内部状态。这个信息对于性能调优是有用的。

15.16.1 InnoDB监视器类型

有两种类型InnoDB班长:

  • 标准InnoDB监视器显示下列信息:

    • 由主线程的工作背景

    • 信号量等待

    • 有关数据的最近的外交重点和死锁错误

    • 锁等待交易

    • 表格和记录锁的活动事务举行

    • 等待I/O操作和相关统计

    • 插入缓冲和自适应哈希索引统计

    • 重做日志数据

    • 缓冲池数据

    • 行操作数据

  • 这个InnoDB指纹锁锁监视器附加信息作为标准的一部分InnoDB监视器输出

15.16.2使InnoDB监视器

什么时候InnoDB监测周期输出启用,InnoDB写输出到mysqld服务器的标准错误输出(stderrInnoDB将诊断输出stderr而不是标准输出或固定大小的内存缓冲区来避免潜在的缓冲区溢出。

在Windows,stderr针对默认日志文件,除非另外配置。如果你想直接输出到控制台窗口而不是错误日志,从与在控制台窗口中的命令提示符启动服务器--console选项有关更多信息,参见错误记录在Windows

在UNIX和类UNIX系统,stderr通常是针对终端除非另外配置。有关更多信息,参见错误记录在UNIX和类UNIX系统

当启用,InnoDB监控打印每十五秒数据。这一数据在性能调优是有用的。作为一个副作用,输出SHOW ENGINE INNODB STATUS写入文件状态每十五秒在MySQL数据目录。该文件的名称是_ InnoDB的地位。pid,在那里pid是服务器进程IDInnoDB删除文件时,服务器正常停运。如果异常停机时有发生,这些情况下可能存在的文件,必须手动删除。删除文件之前,检查它们是否包含有关异常停机造成有用的信息。一个innodb_status.pid文件只能是如果innodb-status-file配置选项启用。这是默认情况下禁用。

InnoDB显示器应该只被启用时,你真的想看到监控信息因为输出导致一些性能的衰减。另外,如果监视器输出定向到错误日志,日志可能如果你忘记关闭显示器后变得相当大。

笔记

协助排除故障,InnoDB暂时使标准InnoDB在一定的条件下,输出监控。有关更多信息,参见15.20节,“InnoDB故障排除”

InnoDB监视器输出始于头包含一个时间戳和班长的名字。例如:

=====================================2014-10-16 18:37:29 0x7fc2a95c1700 INNODB MONITOR OUTPUT=====================================

the header for the标准InnoDB监视器(InnoDB监视器输出)也用于锁监视器因为后者产生相同的输出信息添加额外的锁。

这个innodb_status_outputinnodb_status_output_locks系统变量是用来使标准InnoDB监控InnoDB锁监视器

这个PROCESS特权是需要启用或禁用InnoDB显示器

使标准InnoDB监视器

使标准InnoDB显示器的设置innodb_status_output系统变量打开(放)

SET GLOBAL innodb_status_output=ON;

禁用标准InnoDB监测组innodb_status_output关闭

当你关闭服务器,这innodb_status_output变量设置为默认关闭价值

获取标准InnoDB监视器输出的需求

作为一种替代使得标准InnoDB定期输出监视器,你可以得到标准InnoDB监视器输出的需求使用SHOW ENGINE INNODB STATUSSQL语句,并能输出到您的客户端程序。如果你使用的是MySQL交互式的客户端,如果你取代通常的分号语句终止与输出更具有可读性\G

MySQL的&#62;SHOW ENGINE INNODB STATUS\G

SHOW ENGINE INNODB STATUS输出也包括InnoDB锁监视器数据如果InnoDB锁监视器启用

使InnoDB锁监视器

InnoDB锁监视器数据与印刷InnoDB标准监视器输出。两InnoDB标准的监测InnoDB锁监视器必须能够有InnoDB锁定期监测数据打印

为了使InnoDB锁监视器设置innodb_status_output_locks系统变量打开(放)。两InnoDB标准的监测InnoDB锁监视器必须能够有InnoDB锁定期监测数据打印:

SET GLOBAL innodb_status_output=ON;SET GLOBAL innodb_status_output_locks=ON;

禁用InnoDB锁监视器设置innodb_status_output_locks关闭。配置innodb_status_output关闭也禁用InnoDB监测标准

当你关闭服务器,这innodb_status_outputinnodb_status_output_locks变量设置为默认关闭价值

笔记

为了使InnoDB锁监视器SHOW ENGINE INNODB STATUS输出,你只需要使innodb_status_output_locks

15.16.3 InnoDB标准监控锁监视器输出

锁监视器是监控标准除了它包含额外的锁信息相同。使监测周期输出打开相同的输出流,但流包括额外的信息,如果锁监视器启用。例如,如果您启用标准监测和锁定监控,使在一个单一的输出流。流包括额外的锁信息直到你禁用锁监视器。

监测标准输出被限制为1MB生产时使用SHOW ENGINE INNODB STATUS声明。此限制不适用于输出写入标准错误输出(服务器标准错误

例如标准监视器输出:

mysql> SHOW ENGINE INNODB STATUS\G
*************************** 1. row ***************************
  Type: InnoDB
  Name: 
Status: 
=====================================
2018-04-12 15:14:08 0x7f971c063700 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 4 seconds
-----------------
BACKGROUND THREAD
-----------------
srv_master_thread loops: 15 srv_active, 0 srv_shutdown, 1122 srv_idle
srv_master_thread log flush and writes: 0
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 24
OS WAIT ARRAY INFO: signal count 24
RW-shared spins 4, rounds 8, OS waits 4
RW-excl spins 2, rounds 60, OS waits 2
RW-sx spins 0, rounds 0, OS waits 0
Spin rounds per wait: 2.00 RW-shared, 30.00 RW-excl, 0.00 RW-sx
------------------------
LATEST FOREIGN KEY ERROR
------------------------
2018-04-12 14:57:24 0x7f97a9c91700 Transaction:
TRANSACTION 7717, ACTIVE 0 sec inserting
mysql tables in use 1, locked 1
4 lock struct(s), heap size 1136, 3 row lock(s), undo log entries 3
MySQL thread id 8, OS thread handle 140289365317376, query id 14 localhost root update
INSERT INTO child VALUES (NULL, 1), (NULL, 2), (NULL, 3), (NULL, 4), (NULL, 5), (NULL, 6)
Foreign key constraint fails for table `test`.`child`:
,
  CONSTRAINT `child_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE 
  CASCADE ON UPDATE CASCADE
Trying to add in child table, in index par_ind tuple:
DATA TUPLE: 2 fields;
 0: len 4; hex 80000003; asc     ;;
 1: len 4; hex 80000003; asc     ;;

But in parent table `test`.`parent`, in index PRIMARY,
the closest match we can find is record:
PHYSICAL RECORD: n_fields 3; compact format; info bits 0
 0: len 4; hex 80000004; asc     ;;
 1: len 6; hex 000000001e19; asc       ;;
 2: len 7; hex 81000001110137; asc       7;;

------------
TRANSACTIONS
------------
Trx id counter 7748
Purge done for trx's n:o < 7747 undo n:o < 0 state: running but idle
History list length 19
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 421764459790000, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 7747, ACTIVE 23 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s)
MySQL thread id 9, OS thread handle 140286987249408, query id 51 localhost root updating
DELETE FROM t WHERE i = 1
------- TRX HAS BEEN WAITING 23 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 4 page no 4 n bits 72 index GEN_CLUST_INDEX of table `test`.`t` 
trx id 7747 lock_mode X waiting
Record lock, heap no 3 PHYSICAL RECORD: n_fields 4; compact format; info bits 0
 0: len 6; hex 000000000202; asc       ;;
 1: len 6; hex 000000001e41; asc      A;;
 2: len 7; hex 820000008b0110; asc        ;;
 3: len 4; hex 80000001; asc     ;;

------------------
TABLE LOCK table `test`.`t` trx id 7747 lock mode IX
RECORD LOCKS space id 4 page no 4 n bits 72 index GEN_CLUST_INDEX of table `test`.`t` 
trx id 7747 lock_mode X waiting
Record lock, heap no 3 PHYSICAL RECORD: n_fields 4; compact format; info bits 0
 0: len 6; hex 000000000202; asc       ;;
 1: len 6; hex 000000001e41; asc      A;;
 2: len 7; hex 820000008b0110; asc        ;;
 3: len 4; hex 80000001; asc     ;;

--------
FILE I/O
--------
I/O thread 0 state: waiting for i/o request (insert buffer thread)
I/O thread 1 state: waiting for i/o request (log thread)
I/O thread 2 state: waiting for i/o request (read thread)
I/O thread 3 state: waiting for i/o request (read thread)
I/O thread 4 state: waiting for i/o request (read thread)
I/O thread 5 state: waiting for i/o request (read thread)
I/O thread 6 state: waiting for i/o request (write thread)
I/O thread 7 state: waiting for i/o request (write thread)
I/O thread 8 state: waiting for i/o request (write thread)
I/O thread 9 state: waiting for i/o request (write thread)
Pending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0] ,
 ibuf aio reads:, log i/o's:, sync i/o's:
Pending flushes (fsync) log: 0; buffer pool: 0
833 OS file reads, 605 OS file writes, 208 OS fsyncs
0.00 reads/s, 0 avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, 0 merges
merged operations:
 insert 0, delete mark 0, delete 0
discarded operations:
 insert 0, delete mark 0, delete 0
Hash table size 553253, node heap has 0 buffer(s)
Hash table size 553253, node heap has 1 buffer(s)
Hash table size 553253, node heap has 3 buffer(s)
Hash table size 553253, node heap has 0 buffer(s)
Hash table size 553253, node heap has 0 buffer(s)
Hash table size 553253, node heap has 0 buffer(s)
Hash table size 553253, node heap has 0 buffer(s)
Hash table size 553253, node heap has 0 buffer(s)
0.00 hash searches/s, 0.00 non-hash searches/s
---
LOG
---
Log sequence number          19643450
Log buffer assigned up to    19643450
Log buffer completed up to   19643450
Log written up to            19643450
Log flushed up to            19643450
Added dirty pages up to      19643450
Pages flushed up to          19643450
Last checkpoint at           19643450
129 log i/o's done, 0.00 log i/o's/second
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 2198863872
Dictionary memory allocated 409606
Buffer pool size   131072
Free buffers       130095
Database pages     973
Old database pages 0
Modified db pages  0
Pending reads      0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 810, created 163, written 404
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 973, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
----------------------
INDIVIDUAL BUFFER POOL INFO
----------------------
---BUFFER POOL 0
Buffer pool size   65536
Free buffers       65043
Database pages     491
Old database pages 0
Modified db pages  0
Pending reads      0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 411, created 80, written 210
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 491, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
---BUFFER POOL 1
Buffer pool size   65536
Free buffers       65052
Database pages     482
Old database pages 0
Modified db pages  0
Pending reads      0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 399, created 83, written 194
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 482, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
--------------
ROW OPERATIONS
--------------
0 queries inside InnoDB, 0 queries in queue
0 read views open inside InnoDB
Process ID=5772, Main thread ID=140286437054208 , state=sleeping
Number of rows inserted 57, updated 354, deleted 4, read 4421
0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s
----------------------------
END OF INNODB MONITOR OUTPUT
============================

标准的监视器输出部分

一个描述每个度量标准的监测报告,指韵律学章在Oracle企业管理器数据库用户指南

  • Status

    本节显示时间戳,班长的名字,和秒数,每秒平均数的基础上。秒数是时间的当前时间和最后一次之间InnoDB监视器输出打印

  • BACKGROUND THREAD

    这个srv_master_thread线显示的主要后台线程完成工作。

  • SEMAPHORES

    本节介绍线程等待一个信号量和统计多少次线程需要旋转或互斥信号量或RW锁等待。大量等待信号量的线程可能会导致磁盘I/O,或争用问题InnoDB。竞争可能是由于查询或问题的并行操作系统的线程调度的重。设置innodb_thread_concurrency系统变量小于默认值可能有助于在这种情况下。这个旋轮每等线显示自旋锁发每OS数量等待互斥。

    互斥度量报告SHOW ENGINE INNODB MUTEX

  • LATEST FOREIGN KEY ERROR

    本节提供有关最新的外键约束的错误信息。它是不存在的如果没有发生这样的错误。内容包括失败以及失败和参考和引用表的约束信息的声明。

  • LATEST DETECTED DEADLOCK

    本节提供有关最新的死锁信息。它是不存在的如果没有发生死锁。内容显示,交易涉及的语句,每个试图执行,他们需要的锁,而交易InnoDB决定反击打破僵局。锁模式报告的这部分解释第15.5.1,“InnoDB锁定”

  • TRANSACTIONS

    如果这段报道锁等候您的应用程序可能有锁争用。输出也可以帮助跟踪事务死锁的原因。

  • FILE I/O

    本节提供了有关线程InnoDB用于执行各种类型的I / O的这些最初的几个致力于一般InnoDB处理.内容也显示信息等待I/O操作和统计的I/O性能。

    这些线程数的控制innodb_read_io_threadsinnodb_write_io_threads参数.看到15.13节,“InnoDB启动选项和系统变量”

  • INSERT BUFFER AND ADAPTIVE HASH INDEX

    本节说明的状况InnoDB插入缓冲(也被称为变化的缓冲)和自适应哈希索引

    相关的信息,看第15.4.2,“Change Buffer”,和第15.4.3,“自适应哈希索引”

  • LOG

    本节显示有关InnoDB日志内容包括当前日志序列号,记录被刷新到磁盘的有多远,和在哪个位置InnoDB最后拿了一点。(见第15.11.3,“InnoDB检查站”。)的部分也显示信息之前写的写性能统计。

  • BUFFER POOL AND MEMORY

    这部分给你读写页面的统计。你可以从这些数字有多少数据文件I/O操作查询目前所做的计算。

    对缓冲池的统计描述,看第15.6.3.9,“监控缓冲池使用InnoDB监控标准”。对缓冲池的操作的更多信息,参见第15.6.3.1,“InnoDB缓冲池”

  • ROW OPERATIONS

    本节说明主线程做,包括数量和速率为每种类型的行运算。

15.17 InnoDB备份和恢复

本节涵盖的主题相关InnoDB备份和恢复

15.17.1 InnoDB备份

安全数据库管理的关键是定期备份。根据你的数据量,MySQL服务器的数量,和数据库工作负载,您可以使用这些备份技术,单独或联合:热备份MySQL企业备份冷备份通过复制文件,MySQL服务器关闭;逻辑备份mysqldump数据量较小或记录模式对象的结构。热与冷备份物理备份那份实际的数据文件,可以直接使用的mysqld更快的恢复服务器

使用MySQL企业备份是用于备份的推荐方法InnoDB数据

笔记

InnoDB不支持在使用第三方备份工具恢复数据库。

热备份

这个mysqlbackup命令,对MySQL企业备份组件,允许您备份运行MySQL实例,包括InnoDB表,以最小的中断操作而产生一个一致的数据库快照。什么时候mysqlbackup正在复制InnoDB表,读取和写入InnoDB表可以继续。MySQL企业备份也可以创建压缩的备份文件和备份表和数据库的子集。在MySQL的二进制日志相结合,用户可以执行时间点恢复。MySQL企业备份是MySQL企业认购部分。详情见第29,MySQL企业备份概述”

冷备份

如果你可以关闭MySQL服务器,你可以使一个物理备份,包括所使用的所有文件InnoDB管理表。使用以下过程:

  1. 执行缓慢关闭在MySQL服务器,确保没有错误。

  2. 复制所有InnoDB数据文件(ibdata文件和.ibd文件)到一个安全的地方。

  3. 复制所有InnoDB日志文件(ib_logfile文件)到一个安全的地方。

  4. 复制你的my.cnf配置文件到一个安全的地方。

逻辑备份使用mysqldump

除了物理备份,建议您定期创建逻辑备份倾倒你的表使用mysqldump。一个二进制文件可能已损坏,你没有看见它。把表存储成人类可读的文本文件,所以发现表腐败变得容易。同时,由于数据格式简单,严重腐败的机会较小。mysqldump也有一个--single-transaction无锁定了其他客户作出一致的快照选项。看到第7.3.1、“建立备份策略”

复制的作品InnoDB表,所以你可以使用MySQL复制能力保留一份你的数据库在数据库的网站,需要高可用性。看到15.18节,“InnoDB和MySQL复制”

15.17.2 InnoDB恢复

本节介绍InnoDB恢复主题包括:

时间点恢复

恢复InnoDB从时间的物理备份了当前的数据库,您必须运行MySQL服务器启用了二进制日志,甚至之前的备份。实现时间点恢复恢复备份后,你可以申请更改,备份之后发生了二进制日志。看到7.5节,“时间点(增量)使用二进制日志恢复”

恢复数据损坏或磁盘故障

如果你的数据库损坏或磁盘出现故障时,必须使用备份进行恢复。在腐败案件中,先找一个备份,没有损坏。恢复基础备份后,做一个时间点的恢复从二进制日志文件的使用mysqlbinlogMySQL恢复备份后发生了变化。

在一些数据库的腐败案件,这足以倾倒,下降,并重新创建一个或几个腐败的表。你可以使用CHECK TABLE语句检查表是否是腐败的,虽然CHECK TABLE自然无法检测到任何一种可能的腐败。

在某些情况下,明显的数据库页腐败实际上是由于操作系统损坏自己的文件缓存和磁盘上的数据可能是好的。最好的方法是尝试重新启动计算机第一。这样做可以消除错误似乎数据库页腐败。如果仍然无法启动由于MySQLInnoDB一致性的问题,看第15.20.2,迫使InnoDB恢复”采取措施恢复模式启动实例,它允许你把数据。

InnoDB崩溃恢复

从一个MySQL服务器崩溃中恢复,唯一的要求是要启动MySQL服务器。InnoDB自动检查日志进行前滚数据库到现在。InnoDB自动回滚未提交的事务,目前在崩溃的时候。在恢复过程中,mysqld类似这样的显示输出:

InnoDB: The log sequence number 664050266 in the system tablespace does not match 
the log sequence number 685111586 in the ib_logfiles!
InnoDB: Database was not shutdown normally!
InnoDB: Starting crash recovery.
InnoDB: Using 'tablespaces.open.2' max LSN: 664075228
InnoDB: Doing recovery: scanned up to log sequence number 690354176
InnoDB: Doing recovery: scanned up to log sequence number 695597056
InnoDB: Doing recovery: scanned up to log sequence number 700839936
InnoDB: Doing recovery: scanned up to log sequence number 706082816
InnoDB: Doing recovery: scanned up to log sequence number 711325696
InnoDB: Doing recovery: scanned up to log sequence number 713458156
InnoDB: Applying a batch of 1467 redo log records ...
InnoDB: 10%
InnoDB: 20%
InnoDB: 30%
InnoDB: 40%
InnoDB: 50%
InnoDB: 60%
InnoDB: 70%
InnoDB: 80%
InnoDB: 90%
InnoDB: 100%
InnoDB: Apply batch completed!
InnoDB: 1 transaction(s) which must be rolled back or cleaned up in total 561887 row 
operations to undo
InnoDB: Trx id counter is 4096
...
InnoDB: 8.0.1 started; log sequence number 713458156
InnoDB: Waiting for purge to start
InnoDB: Starting in background the rollback of uncommitted transactions
InnoDB: Rolling back trx with id 3596, 561887 rows to undo
...
./mysqld: ready for connections....

InnoDB崩溃恢复包括几个步骤:

  • 表空间的发现

    表空间的发现过程InnoDB用于识别的表空间需要重做日志应用。看到发现在崩溃恢复表空间

  • 重做日志应用

    重做日志应用程序进行初始化时,在接受任何连接。如果所有的改变都是红的缓冲池表空间ibdata*鸡传染性法氏囊病*文件)在关机或死机时,重做日志应用跳过。InnoDB也跳过重做日志应用程序如果重做日志文件丢失时。

    • 当前最大的自动增加计数器的值写入到重做日志每个时间价值的变化,这使得它的安全。在恢复过程中,InnoDB扫描日志收集计数器值的变化和应用改变到内存中的表对象。

      为更多的信息关于如何InnoDB处理自动增量值,见第15.8.1.5,”auto_increment InnoDB”处理,和InnoDB auto_increment计数器初始化

    • 当遇到索引树的腐败,InnoDB写一个腐败标志的重做日志,使腐败标志碰撞安全。InnoDB还写在记忆腐败标志数据引擎系统表在每个关卡的私人。在恢复过程中,InnoDB腐败的旗帜读取位置和合并结果标记在内存中的表和索引对象的腐败之前。

    • 删除重做日志加快复苏是不推荐的,即使一些数据丢失是可以接受的。删除重做日志应该只能算是一个干净的关闭后,用innodb_fast_shutdown设置1

  • 回滚不完全交易

    不完整的交易是任何活跃在碰撞的时候或交易快速关机。它需要回滚未完成事务的时间可以是三或四倍时间的交易活跃量之前就被中断,根据服务器的负载。

    取消正在回滚事务你不能。在极端情况下,当收回交易预计将需要很长的时间,它可以更快的开始InnoDB一个innodb_force_recovery设置或更大。看到第15.20.2,迫使InnoDB恢复”

  • 变化的缓冲合并

    应用从改变缓冲区的变化(部分的系统表空间对辅助索引页),作为索引页读取到缓冲池。

  • 净化

    删除删除标记的记录,不再是交易活跃可见。

接下来的步骤重做日志应用程序不依赖于重做日志(除了记录写)并与正常处理的并行执行。其中,仅回滚未完成的事务是特别的崩溃恢复。插入缓冲合并和清除在正常执行。

在重做日志应用,InnoDB试图接受连接尽可能早的,以减少停机时间。在崩溃恢复部分,InnoDB回滚未提交的事务或XA PREPARE状态服务器崩溃。回滚由后台线程执行,并行执行的从新连接交易。直到回滚操作完成后,新的连接可能会遇到锁冲突恢复交易。

在大多数情况下,即使MySQL服务器竟然在剧烈活动中死亡,恢复过程是自动完成的,没有行动是DBA需要。如果硬件故障或损坏严重的系统错误InnoDB数据,MySQL可能拒绝开始。在这种情况下,看第15.20.2,迫使InnoDB恢复”

关于二进制日志信息InnoDB崩溃恢复,看5.4.4节,“二进制日志”

发现在崩溃恢复表空间

如果,在恢复,InnoDB遇到重做日志从上一个检查点的日志写的,必须应用到受影响的表空间。识别影响表空间恢复的过程称为表空间的发现

表空间发现使用表空间地图文件,地图空间系统表空间文件名进行。表空间地图文件存储在innodb_data_home_dir目录。ifinnodb_data_home_dir不配置,默认的位置是MySQL数据目录(datadir

有两个表空间地图文件(tablespaces.open.1表2。打开),是写在循环方式。表空间地图文件仅用于在恢复。该文件是在正常启动忽略。

在表空间地图文件丢失或损坏的情况下,看到丢失或损坏的文件表空间地图

丢失或损坏的文件表空间地图

如果表空间地图文件丢失或损坏,该innodb_scan_directories选项可以用来在启动时指定表空间文件目录。此选项InnoDB仔细阅读每个表空间文件的第一页中指定的目录并重新创建表空间地图文件,恢复过程可以应用重做日志。

这个选项可以用来指定一个失踪的表空间文件目录路径。例如,如果恢复的报告,由于缺少一个表空间文件错误,您可以配置innodb_scan_directories搜索特定目录中的表文件。

innodb_scan_directories可以指定在启动命令或在MySQL选项文件选项。行情是在参数值用否则分号(;)是由一些命令解释器解释为一个特殊的字符。(UNIX shell作为命令终止符,例如。)

启动命令:

mysqld --innodb-scan-directories="directory_path_1;directory_path_2"

MySQL选项文件:

[mysqld]
innodb_scan_directories="directory_path_1;directory_path_2"

什么时候innodb_scan_directories指定在启动的InnoDB启动过程打印邮件类似下面的报道进行扫描和发现表空间文件的目录数:

InnoDB: Directories to scan 'directory_path_1;directory_path_2'
InnoDB: Scanning 'directory_path_1'
InnoDB: Scanning 'directory_path_2'
InnoDB: Found 10 '.ibd' file(s)

15.18 InnoDB和MySQL复制

MySQL的复制工作InnoDB表中为它MyISAM表它也可能在某种程度上对从存储引擎不在掌握原有的存储引擎使用相同的复制。例如,您可以复制修改一InnoDB在主表MyISAM在子表。更多信息见,本节,“使用复制不同的主从存储引擎”

关于建立一个新的奴隶主的信息,参见第17.1.2.6,“设置复制的奴隶”,和第17.1.2.5,“选择方法对数据的快照”。没有拿下硕士或现有的奴隶,做一个新的奴隶,使用MySQL企业备份产品

交易失败的主人不影响所有复制。MySQL复制是基于MySQL的二进制日志,写SQL语句修改数据。交易失败(例如,由于外键冲突,或因为它是回滚)不写入二进制日志,所以不给奴隶。看到第13.3.1条,“开始事务,提交和回滚语法”

复制和级联连锁行动InnoDB在主桌上的奴隶复制只有如果共享外键关系的表的使用InnoDB对主人和奴隶。无论您使用的是基于或基于行的复制声明这是真的。假设你已经开始复制,然后创建使用以下主表CREATE TABLE声明:

CREATE TABLE fc1 (    i INT PRIMARY KEY,    j INT) ENGINE = InnoDB;CREATE TABLE fc2 (    m INT PRIMARY KEY,    n INT,    FOREIGN KEY ni (n) REFERENCES fc1 (i)        ON DELETE CASCADE) ENGINE = InnoDB;

假设从没有InnoDB支持。如果是这样的话,那么在奴隶的表创建的,但它们的使用MyISAM存储引擎,和FOREIGN KEY忽略选项。现在我们将一些列在主表:

硕士INSERT INTO fc1 VALUES (1, 1), (2, 2);查询行,2行受影响(0.09秒)记录:2份:0警告:0master &#62;INSERT INTO fc2 VALUES (1, 1), (2, 2), (3, 1);查询好,三行受影响(0.19秒)记录:三副本:警告:0 0

在这一点上,对主人和奴隶,表fc1包含2行,表FC2包含3行,如下所示:

master> SELECT * FROM fc1;
+---+------+
| i | j    |
+---+------+
| 1 |    1 |
| 2 |    2 |
+---+------+
2 rows in set (0.00 sec)

master> SELECT * FROM fc2;
+---+------+
| m | n    |
+---+------+
| 1 |    1 |
| 2 |    2 |
| 3 |    1 |
+---+------+
3 rows in set (0.00 sec)

slave> SELECT * FROM fc1;
+---+------+
| i | j    |
+---+------+
| 1 |    1 |
| 2 |    2 |
+---+------+
2 rows in set (0.00 sec)

slave> SELECT * FROM fc2;
+---+------+
| m | n    |
+---+------+
| 1 |    1 |
| 2 |    2 |
| 3 |    1 |
+---+------+
3 rows in set (0.00 sec)

现在假设你执行以下DELETE在主表:

硕士DELETE FROM fc1 WHERE i=1;查询行,1行的影响(0.09秒)

由于级联,表fc2在主现在只包含1行:

硕士SELECT * FROM fc2;--- | M | N | --- | 2 | 2 | --- 1行集(0秒)

然而,梯级上不传播,因为奴隶的奴隶DELETEfc1删除任何行fc2。奴隶的份FC2还包含所有原本插入的行:

slave> SELECT * FROM fc2;
+---+---+
| m | n |
+---+---+
| 1 | 1 |
| 3 | 1 |
| 2 | 2 |
+---+---+
3 rows in set (0.00 sec)

这种差异是由于这样的事实,级联删除是由内部处理InnoDB存储引擎,这意味着没有任何的变化记录。

15 InnoDB Memcached插件

这个InnoDBmemcached插件(daemon_memcached)提供了一个集成的memcached后台自动存储和检索数据从InnoDB表,把MySQL服务器为一个快关键值商店。而在SQL查询,你可以使用简单的get配置,和incr操作,避免SQL解析和构建查询优化计划相关的性能开销。你也可以访问相同的InnoDB通过SQL表方便、复杂查询、批量操作,与传统数据库软件的其他优势。

NoSQL的风格界面使用memcachedAPI来加快数据库操作,让InnoDB处理内存缓存使用缓冲池机制.通过数据修正memcached等操作add配置,和incr存储到磁盘上,在InnoDB表结合memcached简单和InnoDB可靠性和一致性,为用户提供了两全其美,解释第15.19.1,“InnoDB Memcached插件”的好处。在一个建筑的概述,看15.19.2”部分,InnoDB memcached建筑”

在InnoDB Memcached插件15.19.1效益

本节概述了优势daemon_memcached插件结合InnoDB表和memcached提供了使用自己的优势。

  • 直接进入InnoDB存储引擎避免分析和规划架空SQL。

  • 运行memcached在同一个进程空间为MySQL服务器避免传递请求返回的网络开销和四。

  • 数据使用memcached协议透明地写入InnoDB表,而无需通过MySQL的SQL层。你可以控制写入频率达到更高性能的非关键数据更新时的原。

  • 要求通过数据memcached协议透明地查询从InnoDB表,而无需通过MySQL的SQL层。

  • 随后对相同数据的请求是从InnoDB缓冲池。缓冲池的内存缓存处理。你可以调整性能的数据密集型的操作使用InnoDB配置选项

  • 数据是非结构化或结构化,根据应用程序的类型。你可以创建一个新的数据表,或使用现有的表。

  • InnoDB可以处理的合成与分解多个列的值到一个单一的memcached项目的价值,减少字符串解析和连接在你的应用程序所需的。例如,你可以存储字符串值2|4|6|8memcached高速缓存,并有InnoDB基于分隔符的值分割,然后将结果存储在四个数字列。

  • 内存和磁盘之间的转换是自动处理,简化了应用程序的逻辑。

  • 数据存储在一个MySQL数据库来防止死机,停电,和腐败。

  • 你可以访问底层InnoDB表通过SQL报告、分析、即席查询、批量加载、多步交易计算,设置操作如并集和交集,等操作,适合于SQL的表达能力和灵活性。

  • 你可以确保高可用性应用daemon_memcached插件上主服务器在使用MySQL复制组合。

  • 整合memcachedMySQL提供了一种方法,在内存中的数据持久性,所以你可以使用它的数据更重要的种类。你可以使用更多的add增加类似的写操作,并在你的应用程序而不用担心数据会丢失。你可以停止和启动memcached失去了缓存数据更新服务器。为了防止意外中断,你可以利用InnoDB崩溃恢复、复制和备份功能。

  • 的方式InnoDB不快主键查找是一种天然的适合memcached一项查询。直接的、低层次的数据库访问路径使用的daemon_memcached插件是更有效率的关键值的查找比等价的SQL查询。

  • 序列化的特点memcached,它可以将复杂的数据结构,二进制文件,或甚至代码块storeable字符串,提供一个简单的方法来获得这些对象到数据库。

  • 因为你可以通过SQL访问底层数据,您可以生成报告,搜索或更新多个键,呼叫等功能AVG()max()打开(放)memcached数据所有这些操作都是昂贵或复杂的使用memcached本身

  • 你不需要手动加载数据到memcached在启动。作为特定的键是由一个应用程序的请求,从数据库中检索的值是自动缓存在内存使用InnoDB缓冲池

  • 因为memcached消耗相对较少的CPU和内存占用是容易控制的,它可以运行在一个舒适的MySQL实例在同一系统。

  • 因为数据的一致性是由用于定期执行的机制InnoDB表,您不必担心陈旧memcached数据或回退逻辑在缺少关键案例数据库查询。

15.19.2 InnoDB缓存架构

这个InnoDBmemcached插件实现memcached作为一个MySQL的插件程序访问InnoDB存储引擎直接绕过MySQL的SQL层。

下面的关系图说明了如何通过应用程序访问数据daemon_memcached插件,与SQL

图15.1 MySQL服务器集成memcached服务器

Shows an application accessing data in the InnoDB storage engine using both SQL and the memcached protocol. Using SQL, the application accesses data through the MySQL Server and Handler API. Using the memcached protocol, the application bypasses the MySQL Server, accessing data through the memcached plugin and InnoDB API. The memcached plugin is comprised of the innodb_memcache interface and optional local cache.

特征的daemon_memcached插件:

  • memcached作为一个守护进程插件mysqld。两mysqldmemcached运行在相同的进程空间,具有非常低的延迟访问数据。

  • 直接访问InnoDB表,绕过SQL解析器,优化器,甚至处理API层。

  • 标准memcached协议,包括协议的文本和二进制协议。这个daemon_memcached插件通过所有55兼容性测试的memcapable命令

  • 多柱支撑。你可以映射多个列进价值的键/值存储的一部分,与列值由用户指定的分隔符分隔。

  • 默认情况下,该memcached协议是用来读写数据直接InnoDB,让MySQL管理内存使用InnoDB缓冲池。默认设置是一个组合的高可靠性、数据库应用最少的惊喜。例如,默认设置,避免在数据库端未提交的数据,或过期的数据返回memcachedget请求

  • 高级用户可以配置系统作为传统memcached服务器,只有在缓存的所有数据memcached发动机(内存缓存),或结合使用的memcached引擎(内存缓存)和InnoDBmemcached发动机(InnoDB作为后端的持久性存储)。

  • 如何控制往往数据之间来回传送InnoDBmemcached通过作战innodb_api_bk_commit_intervaldaemon_memcached_r_batch_size,和daemon_memcached_w_batch_size配置选项。批量大小选项默认为最大的可靠性值1。

  • 指定的能力memcached选择通过daemon_memcached_option配置参数。例如,你可以改变端口memcached听,减少同时连接的最大数目,换一个键/值对的最大内存大小,或启用调试的错误日志消息。

  • 这个innodb_api_trx_level配置选项控制交易隔离级别在查询处理memcached。虽然memcached没有概念交易,您可以使用此选项来控制多久memcached看到的变化,在使用的表发出的SQL语句造成的daemon_memcached插件默认情况下,innodb_api_trx_level是集READ UNCOMMITTED

  • 这个innodb_api_enable_mdl选项可以用来锁定表在MySQL的水平,这样的映射表不能删除或改变DDL通过SQL接口。没有锁,桌子可以从MySQL层下降,但保持在InnoDB存储到memcached或其他一些用户停止使用它。MDL代表元数据锁定

InnoDB Memcached Memcached和传统之间的差异

你可能已经熟悉使用memcached在MySQL中,如使用mysqlmemcached。本节介绍如何集成功能InnoDBmemcached不同于传统的插件memcached

  • 安装:memcached图书馆是MySQL服务器,使安装和设置相对简单。安装与运行innodb_memcached_config.sql脚本创建一个demo_testmemcached使用,发出INSTALL PLUGIN语句启用daemon_memcached插件,并添加所需的memcached选择一个MySQL的配置文件或启动脚本。你仍然可以安装传统memcached如公用事业附加分布memcpmemcat,和memcapable

    比较与传统的memcached,看到安装memcached

  • 部署:与传统memcached,这是典型的运行大量低容量memcached服务器在一个典型的部署daemon_memcached插件,然而,涉及少量的中等或高性能已在运行MySQL服务器。这种配置的好处是提高个人数据库服务器的效率而不是利用未使用的内存或分布在多台服务器查找。在默认配置中,很少的内存使用memcached在内存中查找服务,并从InnoDB缓冲池,自动缓存最近频繁使用的数据。与传统的MySQL服务器实例,保存的价值innodb_buffer_pool_size配置选项实际高(不在操作系统级别的分页),使尽可能多的工作是在内存中进行。

    比较与传统的memcached,看到memcached部署

  • 有效期:默认情况下(即使用innodb_only缓存策略),从最新的数据InnoDB表总是返回,所以到期期权没有实际效果。如果你改变缓存策略caching唯一的隐藏,到期期权照常工作,但请求的数据可能是陈腐的如果是更新基础表从内存缓存到期之前。

    比较与传统的memcached,看到数据有效

  • namespaces:memcached像一个大的目录,你给文件名称的前缀和后缀精心保持文件的冲突。这个daemon_memcached插件可以让你使用类似的命名约定为键,增加一个。在关键的格式名称@ @table_idkeytable_id解码参考具体的表,使用从测绘数据innodb_memcache.containers表这个key是在抬头或写入到指定的表。

    这个@@符号只适用于个人的电话得到add,和配置的功能,而不是其他如incr删除。指定用于随后的默认表memcached在一个会话中执行一个操作,get要求使用@ @符号与table_id,但没有关键部分。例如:

    得到@ @table_id

    随后get配置incr删除和其他操作,使用指定的表table_idinnodb_memcache.containers.name专栏

    比较与传统的memcached,看到使用命名空间

  • 散列分布:默认配置,使用innodb_only缓存策略,适用于传统的部署配置,所有数据可在所有的服务器,如一套复制从服务器。

    如果你的身体划分数据,作为一个分散配置,你可以把数据在一些机器上运行daemon_memcached插件,用传统的memcached散列机制,某个特定的机器的路由请求。在MySQL的一面,你会让所有的数据被插入的add请求memcached所以,适当的值存储在相应的服务器数据库中。

    比较与传统的memcached,看到memcached散列/分布类型

  • 内存使用:默认情况下(与innodb_only缓存Policy),thememcached协议通过信息来回InnoDB表,和InnoDB缓冲池的内存中查找,而不是处理memcached内存使用量的增长和收缩。内存比较少用的memcached侧面

    如果你切换缓存策略caching唯一的隐藏,正常的规则memcached内存使用申请。记忆memcached数据值分配条款。你可以控制用于板坯尺寸和最大内存memcached

    无论哪种方式,你可以监控和故障排除daemon_memcached插件使用熟悉的统计系统通过标准协议访问,在Telnet会话,例如。额外的设施不包括在daemon_memcached插件你可以使用memcached-tool脚本安装全memcached销售

    比较与传统的memcached,看到在内存分配memcached

  • 用法:MySQL线程和线程memcached线程并存于同一服务器。限制线程由操作系统适用于线程的总数。

    比较与传统的memcached,看到memcached线程的支持

  • 日志:“因为usagememcached守护进程是运行在MySQL服务器写stderr,的V-vv,和- VVV选择日志输出写入MySQL错误日志

    比较与传统的memcached,看到memcached日志

  • memcached操作:熟悉memcached等操作get配置add,和删除可用。序列化(即确切的字符串格式表示复杂的数据结构)取决于语言接口。

    比较与传统的memcached,看到基本memcached运营

  • 使用memcached作为一个MySQL前端:这是主要目的的InnoDBmemcached插件一个集成的memcached守护进程,提高应用程序的性能,并具有InnoDB处理数据传输之间的内存和硬盘可以简化应用程序的逻辑。

    比较与传统的memcached,看到使用memcached作为一个MySQL缓存层

  • 事业:MySQL服务器包括libmemcached图书馆而不是额外的命令行工具。使用命令如memcpmemcat,和memcapable命令,安装一个全memcached销售什么时候memrmmemflush从缓存中删除项目,该项目也从底层的删除InnoDB

    比较与传统的memcached,看到libmemcached命令行实用工具

  • 编程接口:您可以通过访问MySQL服务器daemon_memcached插件使用所有支持的语言:C和CJavaPerlPythonPHP,和红宝石。指定服务器的主机名和端口与传统memcached服务器默认情况下,该daemon_memcached插件侦听端口一万一千二百一十一。你可以同时使用文本和二进制协议。你可以定制行为属于memcached函数在运行时。序列化(即确切的字符串格式表示复杂的数据结构)取决于语言接口。

    比较与传统的memcached,看到开发一个memcached应用

  • 常见问题:MySQL传统广泛的常见问题memcached。FAQ主要是适用的,除非使用InnoDB表作为存储介质memcached数据意味着,你可以使用memcached更多的写密集型应用于前,而不是作为一个只读缓存。

    看到memcached常见问题

15.19.3设置innodb memcached插件

本节介绍如何设置daemon_memcached在MySQL服务器插件。因为memcached守护与MySQL服务器紧密集成,避免网络流量,减少延迟时间,你执行这个过程在每一个MySQL实例,使用此功能。

笔记

在建立的daemon_memcached插件,请第15.19.5,“InnoDB Memcached插件“安全注意事项需要了解的安全程序,以防止未经授权的访问。

先决条件

  • 这个daemon_memcached插件只支持Linux,Solaris,和OS X平台上。不支持其他操作系统。

  • 当建立MySQL从源,你必须建立-DWITH_INNODB_MEMCACHED=ON。这个建造选项在MySQL插件目录生成两个共享库(plugin_dir),是需要运行daemon_memcached插件:

    • libmemcached.so: thememcached后台插件MySQL

    • innodb_engine.so:一个InnoDBAPI插件memcached

  • libevent必须安装

    • 如果你没有从源代码构建的MySQL,libevent图书馆是不包括在您的安装。使用安装方法为您的操作系统安装libevent1.4.12或后。例如,根据不同的操作系统,你可以使用apt-get百胜餐饮集团,或port install。例如,在Ubuntu Linux,使用:

      sudo的ATP - get install libevent DEV
    • 如果你安装MySQL从源代码发布,libevent1.4.12捆绑包,位于MySQL源代码目录的顶层。如果你使用捆绑版libevent,无需行动。如果你想使用本地系统版本libevent,你必须与建立MySQL-DWITH_LIBEVENT建立选项设置系统yes

安装和配置InnoDB Memcached插件

  1. 配置daemon_memcached插件可以互动InnoDB表运行innodb_memcached_config.sql配置脚本,它位于MYSQL_HOME分享。这个脚本安装_ memcache InnoDB三所需的表数据库(cache_policies_配置选项,和containers)。它还安装了demo_test在示例表test数据库

    MySQL的&#62;source MYSQL_HOME/share/innodb_memcached_config.sql

    运行innodb_memcached_config.sql脚本是一种一次性手术。表留在原地,以后如果你卸载并重新安装daemon_memcached插件

    mysql> USE innodb_memcache;
    mysql> SHOW TABLES;
    +---------------------------+
    | Tables_in_innodb_memcache |
    +---------------------------+
    | cache_policies            |
    | config_options            |
    | containers                |
    +---------------------------+
    
    mysql> USE test;
    mysql> SHOW TABLES;
    +----------------+
    | Tables_in_test |
    +----------------+
    | demo_test      |
    +----------------+
    

    Of these tables,theinnodb_memcache.containers表是最重要的。中的条目容器提供一个映射表InnoDB表列。每个InnoDB用表daemon_memcached插件需要在入口容器

    这个innodb_memcached_config.sql脚本中插入一个进入容器为提供一个映射表demo_test表它也插入一行数据到demo_test表这个数据让你立即验证安装设置完成后。

    mysql> SELECT * FROM innodb_memcache.containers\G
    *************************** 1. row ***************************
                      name: aaa
                 db_schema: test
                  db_table: demo_test
               key_columns: c1
             value_columns: c2
                     flags: c3
                cas_column: c4
        expire_time_column: c5
    unique_idx_name_on_key: PRIMARY
    
    mysql> SELECT * FROM test.demo_test;
    +----+------------------+------+------+------+
    | c1 | c2               | c3   | c4   | c5   |
    +----+------------------+------+------+------+
    | AA | HELLO, HELLO     |    8 |    0 |    0 |
    +----+------------------+------+------+------+
    

    为更多的信息关于innodb_memcache表和demo_test示例表,看第15.19.8,“InnoDB Memcached插件内”

  2. 激活daemon_memcached插件运行INSTALL PLUGIN声明:

    MySQL的&#62;INSTALL PLUGIN daemon_memcached soname "libmemcached.so";

    一旦安装了这个插件,它会自动启动MySQL服务器重启一次。

验证InnoDB和缓存设置

为了验证daemon_memcached插件安装,使用Telnet会议议题memcached命令。默认情况下,该memcached守护进程监听端口11211。

  1. 重新编织数据test.demo_test表。单一数据的行demo_test桌上有一个关键值AA

    telnet localhost 11211尝试连接到127.0.0.1…localhost。转义字符是“^ ]”。get AA价值8 12hello AA,helloend
  2. 使用插入数据set命令

    set BB 10 0 16GOODBYE, GOODBYE存储

    哪里:

    • set是命令,存储一个值

    • BB是关键

    • 10是一个用于操作标志;忽视memcached但可以由客户端用来表示任何类型的信息;指定0如果未使用

    • 0是expiration时间(TTL)specify;如果未使用

    • 16在字节的值块的长度

    • GOODBYE, GOODBYE是储存价值

  3. 验证数据插入存储在MySQL连接到MySQL服务器,查询test.demo_test

    MySQL的&#62;SELECT * FROM test.demo_test;---- ------------------ ------ ------ ------ | C1 C2 C3 C4 | | | | C5 | ---- ------------------ ------ ------ ------ | AA |你好,你好| 8 | 0 | 0 | | BB |再见,再见| 10 | 1 | 0 | ---- ------------------ ------ ------ ------
  4. 回到Telnet会话和检索数据的插入,你前面使用的关键BB

    get BB价值10 16goodbye BB,goodbyeendquit

如果你关闭MySQL服务器,并关闭集成memcached服务器,进一步尝试访问memcached数据连接失败错误。通常情况下,的memcached数据也消失在这一点上,你将需要应用逻辑,回来的数据加载到内存中时memcached重新启动。然而,这InnoDBmemcached插件可以自动完成这一过程的你。

当你重新启动MySQL,get操作再次返回键/值存储在早些时候对你memcached会话。当一个关键的要求和相关的价值不在内存中的缓存,该值将自动查询从MySQLtest.demo_test

创建一个新的表和列映射

这个例子显示了如何设置你自己的InnoDB表与daemon_memcached插件

  1. 创建一个InnoDB表表必须具有唯一索引有一个键列。城市的表的键列city_id,它被定义为主键。该表还必须包括柱flags中国科学院,和expiry价值观。可能有一个或多个值的列。这个城市表三值的列(name状态country

    笔记

    没有特别的要求相对于列名只要有效的映射添加到innodb_memcache.containers

    MySQL的&#62;CREATE TABLE city (city_id VARCHAR(32),name VARCHAR(1024),state VARCHAR(1024),country VARCHAR(1024),flags INT,cas BIGINT UNSIGNED, expiry INT,primary key(city_id)ENGINE=InnoDB;
  2. 添加项目到innodb_memcache.containers表,daemon_memcached插件知道如何访问InnoDB表。satisfy the the entry mustinnodb_memcache.containers表定义。用于描述每一个领域,看第15.19.8,“InnoDB Memcached插件内”

    mysql> DESCRIBE innodb_memcache.containers;
    +------------------------+--------------+------+-----+---------+-------+
    | Field                  | Type         | Null | Key | Default | Extra |
    +------------------------+--------------+------+-----+---------+-------+
    | name                   | varchar(50)  | NO   | PRI | NULL    |       |
    | db_schema              | varchar(250) | NO   |     | NULL    |       |
    | db_table               | varchar(250) | NO   |     | NULL    |       |
    | key_columns            | varchar(250) | NO   |     | NULL    |       |
    | value_columns          | varchar(250) | YES  |     | NULL    |       |
    | flags                  | varchar(250) | NO   |     | 0       |       |
    | cas_column             | varchar(250) | YES  |     | NULL    |       |
    | expire_time_column     | varchar(250) | YES  |     | NULL    |       |
    | unique_idx_name_on_key | varchar(250) | NO   |     | NULL    |       |
    +------------------------+--------------+------+-----+---------+-------+
    

    这个innodb_memcache.containers对于城市表表项的定义是:

    MySQL的&#62;INSERT INTO `innodb_memcache`.`containers` (`name`, `db_schema`, `db_table`, `key_columns`, `value_columns`,`flags`, `cas_column`, `expire_time_column`, `unique_idx_name_on_key`)VALUES ('default', 'test', 'city', 'city_id', 'name|state|country', 'flags','cas','expiry','PRIMARY');
    • default被指定为containers.name柱配置city表为默认InnoDB桌子是用daemon_memcached插件

    • InnoDB表列(姓名state国家)映射到containers.value_columns使用|分隔符

    • 这个flags例_柱,和expire_time_column田野里的innodb_memcache.containers表通常不重要的应用程序使用daemon_memcached插件然而,指定InnoDB表列要求每个。当插入数据,指定0如果他们不使用这些列。

  3. 更新后的innodb_memcache.containers表,重新启动_ Memcache守护进程插件应用更改

    mysql> UNINSTALL PLUGIN daemon_memcached;
    
    mysql> INSTALL PLUGIN daemon_memcached soname "libmemcached.so";
    
  4. 使用Telnet,数据插入city表格的使用memcachedset命令

    telnet localhost 11211尝试连接到127.0.0.1…localhost。转义字符是“^ ]”。set B 0 0 22BANGALORE|BANGALORE|IN存储
  5. 使用MySQL查询test.city表来验证你插入的数据存储。

    MySQL的&#62;SELECT * FROM test.city;--------- ----------- ----------- --------- ------- ------ -------- | city_id |名字|状态|国|旗帜| CAS |到期| --------- ----------- ----------- --------- ------- ------ -------- | B |班加罗尔|班加罗尔|在| 0 | 3 | 0 | --------- ----------- ----------- --------- ------- ------ --------
  6. 使用MySQL,插入额外的数据进test.city

    MySQL的&#62;INSERT INTO city VALUES ('C','CHENNAI','TAMIL NADU','IN', 0, 0 ,0);MySQL的&#62;INSERT INTO city VALUES ('D','DELHI','DELHI','IN', 0, 0, 0);MySQL的&#62;INSERT INTO city VALUES ('H','HYDERABAD','TELANGANA','IN', 0, 0, 0);MySQL的&#62;INSERT INTO city VALUES ('M','MUMBAI','MAHARASHTRA','IN', 0, 0, 0);
    笔记

    建议您指定一个值0对于旗帜cas_column,和_到期时间_柱如果他们不使用领域

  7. 使用Telnet,问题memcachedget命令来检索你插入使用MySQL数据。

    get H| H 0值22hyderabad泰| inend

配置InnoDB Memcached插件

传统memcached配置选项可以在MySQL的配置文件或指定的mysqld启动字符串,在参数编码daemon_memcached_option配置参数memcached配置选项生效时,插件的加载,这发生在每次启动MySQL服务器。

例如,使memcached侦听端口11222代替默认的端口11211,指定-p11222作为一个论点daemon_memcached_option配置选项:

mysqld .... --daemon_memcached_option="-p11222"

其他memcached选项可以被编码在daemon_memcached_option字符串例如,您可以指定要减少同时连接的最大数目的选择,换一个键/值对的最大内存大小,或启用调试的错误日志信息,等等。

也有具体的配置选项daemon_memcached插件。这些包括:

  • daemon_memcached_engine_lib_name:指定共享库的实现InnoDBmemcached插件默认设置是innodb_engine.so

  • daemon_memcached_engine_lib_path:路径的目录包含共享库的实现InnoDBmemcached插件。默认是空的茶叶,茶叶representing a插件目录。

  • daemon_memcached_r_batch_size:定义批量提交读取操作的大小(得到)。它specifies the number ofmemcached读操作之后,犯罪发生.daemon_memcached_r_batch_size默认设置为1,每得到请求访问最近提交的数据在InnoDB表格,数据是否是通过更新memcached或通过SQL。当该值大于1,读操作的计数器每get呼叫。一flush_all调用读写计数器重置

  • daemon_memcached_w_batch_size:定义批量提交大小写操作(配置replace追加prepend增加decr,等等)daemon_memcached_w_batch_size设置为1默认所以没有未提交的数据丢失在停电的情况下,因此,对基础表的访问最新数据的SQL查询。当该值大于1,写操作的计数器每添加set增加decr,和删除呼叫。一flush_all调用读写计数器重置

默认情况下,你不需要修改daemon_memcached_engine_lib_namedaemon_memcached_engine_lib_path。你可以配置这些选项,如果,例如,你想使用一个不同的存储引擎memcached(如NDBmemcached发动机)

daemon_memcached插件配置参数可以在MySQL的配置文件,或在一个指定的mysqld启动字符串。他们把效果当你加载daemon_memcached插件

当更改daemon_memcached插件配置,加载插件应用更改。这样做,发出以下声明:

MySQL的&#62;UNINSTALL PLUGIN daemon_memcached;MySQL的&#62;INSTALL PLUGIN daemon_memcached soname "libmemcached.so";

配置设置,所需的表格,数据保存时,插件启动。

有关启用和禁用插件的更多信息,参见第5.6.1,“安装和卸载插件”

15.19.4 InnoDB Memcached多得到和范围查询支持

这个daemon_memcached插件支持多个GET操作(取多个键/值对的在一个单一的memcached查询和范围查询)

多去操作

在一次取多个键/值对的能力memcached查询提高了读取性能通过减少客户端和服务器之间的通信流量。为InnoDB,这意味着更少的交易和公开表操作。

下面的示例演示多得到支持。该示例使用test.city表中描述的创建一个新的表和列映射

mysql> USE test;
mysql> SELECT * FROM test.city;
+---------+-----------+-------------+---------+-------+------+--------+
| city_id | name      | state       | country | flags | cas  | expiry |
+---------+-----------+-------------+---------+-------+------+--------+
| B       | BANGALORE | BANGALORE   | IN      |     0 |    1 |      0 |
| C       | CHENNAI   | TAMIL NADU  | IN      |     0 |    0 |      0 |
| D       | DELHI     | DELHI       | IN      |     0 |    0 |      0 |
| H       | HYDERABAD | TELANGANA   | IN      |     0 |    0 |      0 |
| M       | MUMBAI    | MAHARASHTRA | IN      |     0 |    0 |      0 |
+---------+-----------+-------------+---------+-------+------+--------+

运行get命令从检索所有值城市表结果是一个键/值对的顺序返回。

telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get B C D H M
VALUE B 0 22
BANGALORE|BANGALORE|IN
VALUE C 0 21
CHENNAI|TAMIL NADU|IN
VALUE D 0 14
DELHI|DELHI|IN
VALUE H 0 22
HYDERABAD|TELANGANA|IN
VALUE M 0 21
MUMBAI|MAHARASHTRA|IN
END

当检索多个值在一个单一的get命令,你可以切换表(使用@ @containers.name符号)来检索第一个重要的价值,但你不能切换表为后续的钥匙。举个例子,这个例子在表开关是有效的:

get @@aaa.AA BB值“8 12hello @aaa.aa,hellovalue BB 10 16goodbye,goodbyeend

尝试转换表,又在同一个get命令从一个不同的表中检索键值不支持。

范围查询

范围查询,该daemon_memcached插件支持以下比较运算符:<><=>=。操作者必须在前面加上一个@符号当一个范围查询发现多个键/值对的匹配,结果是在一个键/值对的顺序返回。

下面的示例演示支持范围查询。本实例使用test.city表中描述的创建一个新的表和列映射

mysql> SELECT * FROM test.city;
+---------+-----------+-------------+---------+-------+------+--------+
| city_id | name      | state       | country | flags | cas  | expiry |
+---------+-----------+-------------+---------+-------+------+--------+
| B       | BANGALORE | BANGALORE   | IN      |     0 |    1 |      0 |
| C       | CHENNAI   | TAMIL NADU  | IN      |     0 |    0 |      0 |
| D       | DELHI     | DELHI       | IN      |     0 |    0 |      0 |
| H       | HYDERABAD | TELANGANA   | IN      |     0 |    0 |      0 |
| M       | MUMBAI    | MAHARASHTRA | IN      |     0 |    0 |      0 |
+---------+-----------+-------------+---------+-------+------+--------+

打开一个Telnet会话:

telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

让所有值大于B,进入得到“&#62; B

get @>B
VALUE C 0 21
CHENNAI|TAMIL NADU|IN
VALUE D 0 14
DELHI|DELHI|IN
VALUE H 0 22
HYDERABAD|TELANGANA|IN
VALUE M 0 21
MUMBAI|MAHARASHTRA|IN
END

让所有值小于M,进入get @<M

get @<M
VALUE B 0 22
BANGALORE|BANGALORE|IN
VALUE C 0 21
CHENNAI|TAMIL NADU|IN
VALUE D 0 14
DELHI|DELHI|IN
VALUE H 0 22
HYDERABAD|TELANGANA|IN
END

让所有值小于和包括M,进入get @<=M

get @<=M
VALUE B 0 22
BANGALORE|BANGALORE|IN
VALUE C 0 21
CHENNAI|TAMIL NADU|IN
VALUE D 0 14
DELHI|DELHI|IN
VALUE H 0 22
HYDERABAD|TELANGANA|IN
VALUE M 0 21
MUMBAI|MAHARASHTRA|IN

得到的值大于B但小于M,进入get @>B@<M

get @>B@<MC值的0 21chennai |泰米尔纳德邦|价值0 14delhi |德里|至H 0 22hyderabad |特|时尚

一个最大的两个比较运算符可以被解析,一个是“不足”(@<)或“小于或等于”(@<=)的运营商,和其他任何一个大于(@>)或“大于或等于”(@>=)算子。任何额外的运营商是关键的一部分。例如,如果你的问题get与三大运营商的命令,第三接线员(@ &#62; C)作为关键的一部分,和get值小于命令搜索M和大于B@>C

get @<M@>B@>CC值的0 21chennai |泰米尔纳德邦|价值0 14delhi |德里|至H 0 22hyderabad | |在特

对于InnoDB Memcached插件15.19.5安全注意事项

注意安全

查阅本节之前部署daemon_memcached在生产服务器上的插件,甚至在测试服务器如果MySQL实例包含敏感数据。

因为memcached默认不使用身份验证机制,以及可选的SASL认证不是传统的数据库管理系统的安全措施有力,只保留非敏感数据在MySQL实例使用daemon_memcached插件,和墙下使用此配置,从潜在的入侵者的任何服务器。不允许memcached从Internet访问这些服务器;只允许在防火墙内部,最好从一个子网的会员可以限制。

密码保护Memcached使用SASL

SASL提供支持的能力来保护你的MySQL数据库来自未经身份验证的访问memcached客户本节说明如何启用SASL的daemon_memcached插件这个步骤是进行启用SASL一传统几乎相同memcached服务器

该代表简单身份验证和安全层,增加了基于连接的协议认证支持标准。memcached增加1.4.3版本SASL支持。

SASL认证只支持二进制协议。

memcached客户只能够访问InnoDB表,登记在innodb_memcache.containers表即使一个DBA可以在表的地方访问限制,获得通过memcached应用程序无法控制。为此,SASL提供支持访问控制InnoDB与表daemon_memcached插件

以下部分展示了如何建立、启用和测试SASL启用daemon_memcached插件

建筑使用InnoDB Memcached插件SASL

默认情况下,启用一个SASLdaemon_memcached插件是不包含在MySQL释放包,因为一个SASL启用daemon_memcached插件需要建设memcached与SASL库。使SASL支持,下载MySQL源和重建daemon_memcached下载后的SASL库插件:

  1. 安装该开发工具库。例如,在使用Ubuntu,apt-get获得图书馆:

    sudo apt-get -f install libsasl2-2 sasl2-bin libsasl2-2 libsasl2-dev libsasl2-modules
    
  2. 建立daemon_memcached插件的共享库SASL能力增加ENABLE_MEMCACHED_SASL=1你的CMake选项memcached还提供了简单的明文密码支持,这有利于测试。使简单的明文密码支持,指定ENABLE_MEMCACHED_SASL_PWDB=1CMake选项

    总之,添加以下三CMake备选办法:

    cmake ... -DWITH_INNODB_MEMCACHED=1 -DENABLE_MEMCACHED_SASL=1 -DENABLE_MEMCACHED_SASL_PWDB=1
    
  3. 安装daemon_memcached插件,如第15.19.3,设置innodb memcached插件”

  4. 配置用户名和密码文件。(本例使用memcached简单的明文密码的支持。)

    1. 在一个文件中,创建一个用户命名testname定义的密码testpasswd

      echo "testname:testpasswd:::::::" >/home/jy/memcached-sasl-db
      
      
    2. 配置MEMCACHED_SASL_PWDB环境变量的通知memcached用户名称和密码的文件。

      export MEMCACHED_SASL_PWDB=/home/jy/memcached-sasl-db
      
    3. 通知memcached一个明文密码的使用:

      echo "mech_list: plain" > /home/jy/work2/msasl/clients/memcached.confexport SASL_CONF_PATH=/home/jy/work2/msasl/clients
  5. 使用MySQL服务器重新启动SASLmemcached-S选项中的编码daemon_memcached_option配置参数:

    mysqld ... --daemon_memcached_option="-S"
  6. 测试设置,使用SASL启用客户端等SASL -启用libmemcached

    memcp --servers=localhost:11211 --binary  --username=testname
      --password=password myfile.txt
    
    memcat --servers=localhost:11211 --binary --username=testname
      --password=password myfile.txt
    

    如果你指定了一个错误的用户名或密码,操作拒绝与memcache error AUTHENTICATION FAILURE消息在这种情况下,检查组在明文密码memcached SASL分贝文件验证您提供的凭据是正确的。

有测试SASL认证与其他方法memcached,但上述方法是最简单的。

15.19.6写InnoDB Memcached插件的应用

通常情况下,写作中的应用InnoDBmemcached插件涉及某种程度的改写或改编现有的代码,使用MySQL或memcached应用程序接口

  • daemon_memcached插件,取代传统memcached低功率的机器上运行的服务器,你有相同数量的memcached服务器的MySQL服务器,有大量的磁盘存储和内存在较高功率的机器上运行。你可以利用一些现有的代码,与memcachedAPI,但是可能需要的由于不同的服务器配置是适应。

  • 存储的数据通过daemon_memcached插件进入VARCHARTEXT,或BLOB列,必须转化为数值运算。你可以在应用程序端执行转换,或使用(CAST)函数在查询

  • 来自一个数据库的背景,你可以用通用的SQL表有很多列。表访问memcached代码可能只有几个甚至一个单柱保持数据的值。

  • 你会适应你的应用程序,执行单排查询,插入,更新,或删除部分,提高代码的关键部分的性能。两查询(读)和DML(写)操作可以大大加快时,通过InnoDBmemcached接口绩效改进为写一般大于性能改进的读取,所以你可能会专注于适应代码执行记录或记录在网站互动的选择。

下面更详细地探讨这些问题。

15.19.6.1适应现有的MySQL InnoDB Memcached插件架构

考虑这些方面memcached应用时,调整现有的MySQL架构或应用程序使用daemon_memcached插件:

  • memcached钥匙不能包含空格或换行符,因为这些字符作为分隔符的ASCII协议。如果您使用的是包含空格或哈希查找的值,变换成价值没有空间之前使用它们作为键调用add()set()get(),等等。尽管在理论上,这些人物都是在程序中使用二进制协议,密钥允许,你应该限制使用密钥来保证与范围广泛的客户端兼容性的特点。

  • 如果有一个短暂的数字主键柱在InnoDB表,用它作为一种独特的查找键memcached通过将整数字符串值。如果memcached服务器用于多个应用程序,或一个以上InnoDB表,考虑修改的名义保证,它是独一无二的。例如,在表名,或数据库名称和表名称,数值之前。

    笔记

    这个daemon_memcached插件支持插入和读取映射InnoDB表中有一个INTEGER定义为主键

  • 你不能使用一个分区表数据的查询或存储使用memcached

  • 这个memcached协议通过数值约为字符串。在底层存储数值InnoDB表,实现计数器可用于SQL等功能Sum()AVG()的,例如:

    • 使用VARCHAR有足够的字符列持有最大的预期数所有数字(和额外的字符是否适合正负号、小数点,或两者都有)。

    • 在任何查询执行使用列值的算法,使用CAST()函数将该值从字符串,整数,或其他一些数字类型。例如:

      #字母条目作为zero.select投回来(C2为无符号整数)从demo_test;#自会有0个数值,不能取消它们。#测试字符串值,发现都是整数的,平均只有those.select AVG(CAST(C2为无符号整数))从demo_test C2之间“0”和“9999999999”;#观点让你隐藏的查询的复杂性。结果已经转换;#无需重复转换函数和WHERE子句中每个time.create视图数作为选择C1键,铸造(C2为无符号整数)值从demo_test C2之间的“0”和“9999999999”;选择和(Val)数;
      笔记

      在结果集的任何字母的值被转换为0的电话CAST()。当使用等功能的AVG(),这取决于结果集中的行数,包括WHERE子句过滤掉非数字值

  • 如果InnoDB列作为键能值超过250字节,哈希值小于250字节。

  • 使用现有的表daemon_memcached插件,定义在它的入口innodb_memcache.containers表使表默认为所有memcached请求,指定一个值default姓名列,然后重新启动MySQL服务器使改变生效。如果您使用多台不同类memcached数据,在建立多个条目innodb_memcache.containers姓名您选择的值,然后发出memcached在形式上的要求get @@name集@ @name在应用程序中指定要用于后续的表memcached请求

    对于使用非预定义的表格实例test.demo_test表,看例15,“用你自己的表与InnoDB Memcached应用”。所需的表格布局,看第15.19.8,“InnoDB Memcached插件内”

  • 使用多个InnoDB表列值memcached键/值对指定列的名称,用逗号、分号、空格隔开,或在管道的特点value_columns场的innodb_memcache.containers入境的InnoDB表例如,指定COL1,COL2,col3col1|col2|col3value_columns

    将该列的值到使用管道字符作为分隔符一个字符串通过之前的字符串memcachedadd配置电话.字符串是解压后自动进入正确的列。每个get调用返回一个字符串包含的列值,也由管字符分隔。你可以打开值使用适当的应用程序语言的语法。

例15使用自己的表与InnoDB Memcached应用

这个例子展示了如何使用自己的表与一个Python应用程序使用memcached对数据的操作

该示例假定daemon_memcached插件安装说明第15.19.3,设置innodb memcached插件”。它还假定你的系统配置来运行一个Python脚本使用python-memcache模块

  1. 创建multicol包括人口、面积表存储的国家信息,与驾驶员侧的数据(“R”权利和'L'For left).

    MySQL的&#62;USE test;MySQL的&#62;CREATE TABLE `multicol` (`country` varchar(128) NOT NULL DEFAULT '',`population` varchar(10) DEFAULT NULL,`area_sq_km` varchar(9) DEFAULT NULL,`drive_side` varchar(1) DEFAULT NULL,`c3` int(11) DEFAULT NULL,`c4` bigint(20) unsigned DEFAULT NULL,`c5` int(11) DEFAULT NULL,PRIMARY KEY (`country`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  2. 插入一条记录到innodb_memcache.containers表,daemon_memcached插件可以访问multicol

    MySQL的&#62;INSERT INTO innodb_memcache.containers(name,db_schema,db_table,key_columns,value_columns,flags,cas_column,expire_time_column,unique_idx_name_on_key)VALUES('bbb','test','multicol','country','population,area_sq_km,drive_side','c3','c4','c5','PRIMARY');MySQL的&#62;COMMIT;
    • 这个innodb_memcache.containers记录的多色列于表name价值“BBB”,这是表标识符

      笔记

      如果一个单InnoDB表用于所有memcached应用程序的name值可设定默认避免使用@@符号转换表

    • 这个db_schema栏目设置测试,这是数据库的名称,multicol表驻留

    • 这个db_table栏目设置多色,它的名字是InnoDB

    • key_columns是一套独特的国家专栏这个country列定义为在主键多色表定义

    • 而不是一个单一的InnoDB表列包含复合数据值,数据分为三列的表格中(人口area_sq_km,和drive_side)。容纳多个值的列,用逗号分隔的列表中指定的列value_columns场。在定义的列value_columns现场使用时,存储或检索值的列。

    • 值为flagsexpire _时,和cas_column字段中使用基于价值观demo.test示例表。这些领域通常是不显着的应用程序使用daemon_memcached因为MySQL插件保持数据同步,无需担心数据到期或过期。

    • 这个unique_idx_name_on_key字段设置为首要,指的是在独特的定义主要指标country列在多色

  3. Python应用复制到一个文件。在这个例子中,该示例脚本复制到一个文件名为multicol.py

    样品的Python应用将数据插入到multicol表中的所有密钥数据,演示如何访问InnoDB表通过daemon_memcached插件

    import sys, osimport memcachedef connect_to_memcached():  memc = memcache.Client(['127.0.0.1:11211'], debug=0);  print "Connected to memcached."  return memcdef banner(message):  print  print "=" * len(message)  print message  print "=" * len(message)country_data = [("Canada","34820000","9984670","R"),("USA","314242000","9826675","R"),("Ireland","6399152","84421","L"),("UK","62262000","243610","L"),("Mexico","113910608","1972550","R"),("Denmark","5543453","43094","R"),("Norway","5002942","385252","R"),("UAE","8264070","83600","R"),("India","1210193422","3287263","L"),("China","1347350000","9640821","R"),]def switch_table(memc,table):  key = "@@" + table  print "Switching default table to '" + table + "' by issuing GET for '" + key + "'."  result = memc.get(key)def insert_country_data(memc):  banner("Inserting initial data via memcached interface")  for item in country_data:    country = item[0]    population = item[1]    area = item[2]    drive_side = item[3]    key = country    value = "|".join([population,area,drive_side])    print "Key = " + key    print "Value = " + value    if memc.add(key,value):      print "Added new key, value pair."    else:      print "Updating value for existing key."      memc.set(key,value)def query_country_data(memc):  banner("Retrieving data for all keys (country names)")  for item in country_data:    key = item[0]    result = memc.get(key)    print "Here is the result retrieved from the database for key " + key + ":"    print result    (m_population, m_area, m_drive_side) = result.split("|")    print "Unpacked population value: " + m_population    print "Unpacked area value      : " + m_area    print "Unpacked drive side value: " + m_drive_sideif __name__ == '__main__':  memc = connect_to_memcached()  switch_table(memc,"bbb")  insert_country_data(memc)  query_country_data(memc)  sys.exit(0)

    Python应用笔记:

    • 没有数据库的权限运行应用程序所需的数据操作,因为执行memcached接口唯一需要的信息端口号在本地系统上memcached恶魔听

    • 确保应用程序使用multicol表的switch_table()函数被调用时,它执行一个虚拟get配置要求使用@@符号。这个姓名在要求值bbb,这是多色表中定义的标识符innodb_memcache.containers.name

      一个更具描述性的name值可以用在现实世界的应用。这个例子只是说明了一个表标识符指定而不是表名得到@ @…请求

    • 本函数用于插入和查询数据演示如何将一个Python数据结构为管分离值发送数据到MySQLadd配置的要求,以及如何拆管分离的返回值get请求这种额外的处理,只需在映射一个memcached多个MySQL表列值。

  4. 运行Python应用。

    shell> python multicol.py
    

    如果成功,该示例应用程序返回的输出:

    Connected to memcached.
    Switching default table to 'bbb' by issuing GET for '@@bbb'.
    
    ==============================================
    Inserting initial data via memcached interface
    ==============================================
    Key = Canada
    Value = 34820000|9984670|R
    Added new key, value pair.
    Key = USA
    Value = 314242000|9826675|R
    Added new key, value pair.
    Key = Ireland
    Value = 6399152|84421|L
    Added new key, value pair.
    Key = UK
    Value = 62262000|243610|L
    Added new key, value pair.
    Key = Mexico
    Value = 113910608|1972550|R
    Added new key, value pair.
    Key = Denmark
    Value = 5543453|43094|R
    Added new key, value pair.
    Key = Norway
    Value = 5002942|385252|R
    Added new key, value pair.
    Key = UAE
    Value = 8264070|83600|R
    Added new key, value pair.
    Key = India
    Value = 1210193422|3287263|L
    Added new key, value pair.
    Key = China
    Value = 1347350000|9640821|R
    Added new key, value pair.
    
    ============================================
    Retrieving data for all keys (country names)
    ============================================
    Here is the result retrieved from the database for key Canada:
    34820000|9984670|R
    Unpacked population value: 34820000
    Unpacked area value      : 9984670
    Unpacked drive side value: R
    Here is the result retrieved from the database for key USA:
    314242000|9826675|R
    Unpacked population value: 314242000
    Unpacked area value      : 9826675
    Unpacked drive side value: R
    Here is the result retrieved from the database for key Ireland:
    6399152|84421|L
    Unpacked population value: 6399152
    Unpacked area value      : 84421
    Unpacked drive side value: L
    Here is the result retrieved from the database for key UK:
    62262000|243610|L
    Unpacked population value: 62262000
    Unpacked area value      : 243610
    Unpacked drive side value: L
    Here is the result retrieved from the database for key Mexico:
    113910608|1972550|R
    Unpacked population value: 113910608
    Unpacked area value      : 1972550
    Unpacked drive side value: R
    Here is the result retrieved from the database for key Denmark:
    5543453|43094|R
    Unpacked population value: 5543453
    Unpacked area value      : 43094
    Unpacked drive side value: R
    Here is the result retrieved from the database for key Norway:
    5002942|385252|R
    Unpacked population value: 5002942
    Unpacked area value      : 385252
    Unpacked drive side value: R
    Here is the result retrieved from the database for key UAE:
    8264070|83600|R
    Unpacked population value: 8264070
    Unpacked area value      : 83600
    Unpacked drive side value: R
    Here is the result retrieved from the database for key India:
    1210193422|3287263|L
    Unpacked population value: 1210193422
    Unpacked area value      : 3287263
    Unpacked drive side value: L
    Here is the result retrieved from the database for key China:
    1347350000|9640821|R
    Unpacked population value: 1347350000
    Unpacked area value      : 9640821
    Unpacked drive side value: R
    
  5. 查询innodb_memcache.containers表观你插入的早期记录多色表第一个记录的样本输入demo_test表,在初始创建daemon_memcached插件的设置。第二记录是你插入的入口multicol

    MySQL的&#62;SELECT * FROM innodb_memcache.containers\G*************************** 1。行***************************名称:AAA db_schema:测试db_table:demo_test key_columns:C1 C2 C3 value_columns:国旗:cas_column:C4 expire_time_column:c5unique_idx_name_on_key:主要*************************** 2。行***************************名称:BBB db_schema:测试db_table:多色key_columns:国家value_columns:人口、area_sq_km,drive_side标志:C3 C4 cas_column:expire_time_column:c5unique_idx_name_on_key:初级
  6. 查询multicol表观的Python应用插入数据。该数据可用于MySQL查询这说明,同样的数据可以使用SQL或通过应用程序访问(使用适当的MySQL连接器或API

    mysql> SELECT * FROM test.multicol;
    +---------+------------+------------+------------+------+------+------+
    | country | population | area_sq_km | drive_side | c3   | c4   | c5   |
    +---------+------------+------------+------------+------+------+------+
    | Canada  | 34820000   | 9984670    | R          |    0 |   11 |    0 |
    | China   | 1347350000 | 9640821    | R          |    0 |   20 |    0 |
    | Denmark | 5543453    | 43094      | R          |    0 |   16 |    0 |
    | India   | 1210193422 | 3287263    | L          |    0 |   19 |    0 |
    | Ireland | 6399152    | 84421      | L          |    0 |   13 |    0 |
    | Mexico  | 113910608  | 1972550    | R          |    0 |   15 |    0 |
    | Norway  | 5002942    | 385252     | R          |    0 |   17 |    0 |
    | UAE     | 8264070    | 83600      | R          |    0 |   18 |    0 |
    | UK      | 62262000   | 243610     | L          |    0 |   14 |    0 |
    | USA     | 314242000  | 9826675    | R          |    0 |   12 |    0 |
    +---------+------------+------------+------------+------+------+------+
    
    笔记

    总是允许足够的尺寸保持必要的数字、小数点、符号、前导零,所以当定义的长度,作为数字列。太长值字符串列如VARCHAR通过删除一些字符截断,从而产生无意义的数字值。

  7. 可选地,运行在报告类型查询InnoDB那商店的表memcached数据

    你可以通过SQL查询生成报表,进行计算和测试的任何列,不只是country键列。(因为下面的例子使用的数据来自少数几个国家,数字只是为了说明的目的。)下面的查询返回的国家里人们靠右行驶的平均人口,和国家的名字开始的平均尺寸U

    mysql> SELECT AVG(population) FROM multicol WHERE drive_side = 'R';
    +-------------------+
    | avg(population)   |
    +-------------------+
    | 261304724.7142857 |
    +-------------------+
    
    mysql> SELECT SUM(area_sq_km) FROM multicol WHERE country LIKE 'U%';
    +-----------------+
    | sum(area_sq_km) |
    +-----------------+
    |        10153885 |
    +-----------------+
    

    因为populationarea_sq_km列存储字符数据而不是强类型的数字数据、功能等AVG()Sum()通过将每个值一个数。这种方法不工作运营商如<&#62;,例如,当比较的基于字符的值,9 > 1000,这是不希望的一个条款,如人口倒序。最准确的分型治疗,进行反对的意见,铸造数字列到适当类型的查询。这种技术可以让你的问题简单SELECT *从数据库的查询应用,同时确保铸造、过滤和排序是正确的。下面的示例显示一个视图,可以查询到人口降序找到排名前三位的国家,反映在最新数据的结果多色表,并与人口和面积的数字为数字处理:

    mysql> CREATE VIEW populous_countries AS
           SELECT
           country,
           cast(population as unsigned integer) population,
           cast(area_sq_km as unsigned integer) area_sq_km,
           drive_side FROM multicol
           ORDER BY CAST(population as unsigned integer) DESC
           LIMIT 3;
    
    mysql> SELECT * FROM populous_countries;
    +---------+------------+------------+------------+
    | country | population | area_sq_km | drive_side |
    +---------+------------+------------+------------+
    | China   | 1347350000 |    9640821 | R          |
    | India   | 1210193422 |    3287263 | L          |
    | USA     |  314242000 |    9826675 | R          |
    +---------+------------+------------+------------+
    
    mysql> DESC populous_countries;
    +------------+---------------------+------+-----+---------+-------+
    | Field      | Type                | Null | Key | Default | Extra |
    +------------+---------------------+------+-----+---------+-------+
    | country    | varchar(128)        | NO   |     |         |       |
    | population | bigint(10) unsigned | YES  |     | NULL    |       |
    | area_sq_km | int(9) unsigned     | YES  |     | NULL    |       |
    | drive_side | varchar(1)          | YES  |     | NULL    |       |
    +------------+---------------------+------+-----+---------+-------+
    

15.19.6.2采用Memcached应用InnoDB Memcached插件

考虑到这些方面,MySQL和InnoDB现有的表时,自适应memcached应用程序使用daemon_memcached插件:

  • 如果有关键值比几个字节长,它可能是更有效地使用数字自动递增列为主键InnoDB表,并创建一个独特的次要指标在列中包含的memcached核心价值观。这是因为InnoDB表现最好的大型插入如果主键值的排列顺序添加(因为他们与自动增量值)。主键值都包含在二级指标,占用不必要的空间,如果主键是一个很长的字符串值。

  • 如果你存储几个不同类别的信息使用memcached,考虑设立一个独立的InnoDB对于每种类型的数据表。在定义额外的表标识符innodb_memcache.containers表,并使用@@table_id.key符号来存储和检索不同表中的项目。物理上划分不同类型的信息,允许你调整优化空间利用每个表的特点、性能和可靠性。例如,你可能会使压缩一台拥有博客,而不是一个表保存缩略图。你可以备份一个表比另一个更频繁,因为它认为重要的数据。你可以创建额外的二级指标表经常被用来使用SQL生成报告。

  • 优选的配置使用一套稳定的表定义daemon_memcached插件,并离开桌子的地方永久。变化的innodb_memcache.containers表格生效一次innodb_memcache.containers查询表。在容器的表项进行处理,在启动,并征询意见时无法识别的表标识符(定义containers.name请使用)@ @符号。因此,新的作品,可见只要你使用相关的表标识符,但改变现有的条目需要服务器重启才生效。

  • 当您使用默认的innodb_only缓存策略,调用()set()(增加),等等可以成功但仍然触发调试信息等while expecting 'STORED', got unexpected response 'NOT_STORED。调试信息的出现是因为新的和更新的值是直接发送到InnoDB没有被保存在内存中的缓存表,由于innodb_only缓存策略

15.19.6.3 InnoDB Memcached插件性能调优

因为使用InnoDB结合memcached包括写数据到磁盘,是否立即或稍后,原始性能预计将比使用更慢memcached本身。当使用InnoDBmemcached插件,为优化目标的焦点memcached实现更好的性能比等价的SQL操作的操作。

基准测试表明,查询和DML操作(插入,更新,删除),使用memcached界面比传统的SQL更快。DML操作通常看到一个较大的改进。因此,考虑采用写密集型应用程序的使用memcached界面的第一。也考虑优先改编写密集型应用程序中使用的快速、轻量级的机制,缺乏可靠性。

采用SQL查询

这是最适合于简单的查询类型GET请求那些与一个单一的条款或一组条件的WHERE条款:

SQL:SELECT col FROM tbl WHERE key = 'key_value';memcached:get key_valueSQL:SELECT col FROM tbl WHERE col1 = val1 and col2 = val2 and col3 = val3;memcached:# Since you must always know these 3 values to look up the key,# combine them into a unique string and use that as the key# for all ADD, SET, and GET operations.key_value = val1 + ":" + val2 + ":" + val3get key_valueSQL:SELECT 'key exists!' FROM tbl  WHERE EXISTS (SELECT col1 FROM tbl WHERE KEY = 'key_value') LIMIT 1;memcached:# Test for existence of key by asking for its value and checking if the call succeeds,# ignoring the value itself. For existence checking, you typically only store a very# short value such as "1".get key_value
使用系统内存

为了获得最佳性能,部署daemon_memcached在配置为典型的数据库服务器机器插件,在系统RAM的大部分是专门的InnoDB缓冲池,通过innodb_buffer_pool_size配置选项。对于多字节的缓冲池系统,考虑提高价值innodb_buffer_pool_instances当大多数操作包括最大吞吐量已经缓存在内存中的数据。

减少冗余I/O

InnoDB有一个数量的设置,让你选择可靠性高的平衡,在崩溃的情况下,和大量的I/O工作负载高写在头顶。例如,考虑设置innodb_doublewriteinnodb_flush_log_at_trx_commit。不同的测量性能innodb_flush_method设置

其他的方法来降低或调整I/O表操作,看第8.5.8,“优化InnoDB的磁盘I / O”

减少交易费用

默认值为1daemon_memcached_r_batch_sizedaemon_memcached_w_batch_size用于存储或更新的数据结果和安全性最高的可靠性。

根据应用程序的类型,你可以增加一个或两个这些设置来减少频繁的开销犯罪运营在一个繁忙的系统,你可能会增加daemon_memcached_r_batch_size,我知道通过SQL数据的变化可能成为可见的memcached立即(即到N更多得到处理操作)。在数据处理时,每一个写操作必须可靠地存储,离开daemon_memcached_w_batch_size设置。增加设置时,处理大量的更新仅用于统计分析,在失去最后的N在碰撞中更新是一个可接受的风险。

例如,想象一个系统监控交通路口繁忙的大桥,大约100000辆汽车每天记录数据。如果应用程序有不同类型的车辆进行交通模式,改变daemon_memcached_w_batch_size100降低I/O开销的提交操作99%。在停电的情况下,最多100的记录丢失,这可能是一个可以接受的误差。如果应用程序执行自动收费每辆车,你可以设置daemon_memcached_w_batch_size确保每个收费记录立即保存到磁盘。

因为路上InnoDB组织memcached磁盘上的关键值,如果你有大量的键来创建,它可以更快的应用程序中的关键值和数据项进行排序add他们排序,而不是创建任意阶的钥匙。

这个memslap命令,这是规则的一部分memcached但不包括与分布daemon_memcached插件,可以为不同的配置是有用的基准。它也可以被用来生成样本的键/值对来使用您自己的基准。看到libmemcached命令行实用工具详情

15.19.6.4控制交易行为的InnoDB Memcached插件

不同于传统的memcached,的daemon_memcached插件可以让你控制耐久性产生的数据值通过调用添加set增加,等等。默认情况下,通过书面资料memcached接口存储到磁盘,并调用get从磁盘返回最新值。虽然默认不提供最好的原材料的性能,它仍然是比较快的SQL接口InnoDB

当你获得的经验使用daemon_memcached插件,你可以考虑放宽对非关键性数据类的设置,在一个中断事件失去一些更新的危险值,或者返回,稍微过时的数据。

频率的提交

耐久性和性能之间的权衡是原频率如何新建和更改的数据坚信的。如果数据是至关重要的,是应承诺立即使它在崩溃或断电的情况下是安全的。如果数据不太重要,如柜台,碰撞或测井数据,你能失去的复位后,你可能会选择更高的吞吐量,可以少犯。

当一个memcached操作插入、更新或删除数据的基础InnoDB表的变化可能会致力于InnoDB表(如果瞬间daemon_memcached_w_batch_size=1)或一段时间后(如果daemon_memcached_w_batch_size值大于1)。在任何情况下,不能被回滚。如果你增加价值daemon_memcached_w_batch_size为了避免在繁忙时间高I/O开销,有可能变得稀少时,减少工作量。作为一项安全措施,即通过一个后台线程自动变化memcachedAPI定期。间隔控制的innodb_api_bk_commit_interval配置选项,其中有一个默认设置

当一个memcached在基础操作插入或更新数据InnoDB表,更改的数据到其他立即可见memcached因为新的价值要求保留在内存缓存中,即使没有对MySQL侧犯。

事务隔离

当一个memcached操作如get增加原因查询或DML的基本操作InnoDB表,你可以控制操作是否看到最新的数据写入到表中,唯一的数据已提交,或其他变化的交易隔离级别。使用innodb_api_trx_level配置选项来控制此功能。数值指定此选项对应的隔离级别,如REPEATABLE READ。看到的描述innodb_api_trx_level有关其他信息设置选项。

严格的隔离级别,确保数据可以检索不回滚或突然发生变化,导致后续的查询返回不同的值。然而,严格的隔离级别,需要更大的锁定开销,从而导致等。对NoSQL的风格的应用程序,不使用长期交易,你通常可以使用默认的隔离级别或切换到一个不太严格的隔离级别。

禁用行锁memcached DML操作

这个innodb_api_disable_rowlock选项可以用来禁用行锁时memcached请求通过daemon_memcached插件导致DML操作。默认情况下,innodb_api_disable_rowlock是集OFF这意味着memcached请求行锁get配置操作。当innodb_api_disable_rowlock是集打开(放)memcached请求而不是行锁表锁

这个innodb_api_disable_rowlock选项不动。它必须在启动时指定的mysqld在MySQL的配置文件或命令行输入。

allowing或disallowing DDL

默认情况下,您可以执行DDL等操作ALTER TABLE我们的桌子used by thedaemon_memcached插件为了避免潜在的经济放缓时,这些表用于高通量应用,禁用DDL操作对这些表的使innodb_api_enable_mdl在启动。这个选项是不适当的时候访问同一个表通过memcached和SQL,因为那块CREATE INDEX桌子上的报表,可以运行报表查询是重要的。

数据存储在磁盘上,在内存中,或两者

这个innodb_memcache.cache_policies表指定是否通过书面数据存储memcached接口的磁盘(innodb_only,默认);只能在记忆中,与传统的memcachedcache-only(或两者);缓存

caching设置,如果memcached无法在内存中找到一把钥匙,它搜索的价值InnoDB表返回的值得到电话下caching设置可以过时,如果值是硬盘上的更新InnoDB表但尚未过期的内存缓存。

缓存策略可以独立设置get配置(包括incr12),delete,和脸红运营

例如,您可能允许get配置操作查询或更新一个表,memcached在同一时间内存缓存(使用caching设置),同时使删除flush,或只对内存中的复制(使用只有一个设置)。这样,删除或冲洗项目到期从缓存中的项目,以及最新的值被返回的InnoDB表下次请求项

MySQL的&#62;SELECT * FROM innodb_memcache.cache_policies;-------------- ------------- ------------- --------------- -------------- | policy_name | get_policy | set_policy | delete_policy | flush_policy | -------------- ------------- ------------- --------------- -------------- | cache_policy | innodb_only | innodb_only | innodb_only | innodb_only | -------------- ------------- ------------- --------------- -------------- MySQL &#62;UPDATE innodb_memcache.cache_policies SET set_policy = 'caching'WHERE policy_name = 'cache_policy';

innodb_memcache.cache_policies价值只是在启动时读取。在本表中价值观的变化,卸载并重新安装daemon_memcached插件使更改生效

mysql> UNINSTALL PLUGIN daemon_memcached;

mysql> INSTALL PLUGIN daemon_memcached soname "libmemcached.so";

15.19.6.5适应DML语句来缓存操作

基准测试表明,daemon_memcached插件加速DML操作(插入,更新,删除)超过它加速查询。因此,考虑聚焦初步发展努力写密集型应用程序是I/O密集型,并寻找机会使用MySQL的daemon_memcached新写密集型应用插件

单排的DML语句的语句变成最简单的类型memcached运营插入成为add更新成为set增加decr,和删除成为delete。这些操作是保证只影响一行时发出的通过memcached接口,因为key是独特的内表

在下面的SQL实例,t1是指用于表memcached操作,基于配置的innodb_memcache.containers钥匙指列列在key_columns,和瓦尔指列列在value_columns

插入T1(键,值(Val)some_keysome_value);SELECT val FROM t1 WHERE key =some_key;UPDATE t1 SET val =new_valueWHERE key =some_key;UPDATE t1 SET val = val + x WHERE key =some_key;DELETE FROM t1 WHERE key =some_key

以下TRUNCATE TABLEDELETE报表,删除表中的所有行,对应于flush_all操作,在t1配置表memcached操作,如前面的例子

TRUNCATE TABLE t1;
DELETE FROM t1;

15.19.6.6执行DML和DDL语句在底层InnoDB表

你可以访问底层InnoDB表(这是test.demo _试验默认情况下)通过标准的SQL接口。然而,有一些限制:

  • 当查询一个表,也是通过memcached界面,记住memcached操作可以配置为将周期性的而不是每次写操作。这种行为是由daemon_memcached_w_batch_size选项如果此选项设置为一个值大于,使用READ UNCOMMITTED查询发现,刚插入的行。

    MySQL的&#62;SET SESSSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;MySQL的&#62;SELECT * FROM demo_test;””””””””””。| CX | CY | C1 C2作为| CZ | | | CB | C3与C4 C5 | | | |””””””””””。| | |零零零零| A11 | | 123456789 | | 10 | |零零(3 |空|”-----------””””””””
  • 当修改一个表使用SQL,也通过memcached界面,您可以配置memcached行动开始一个新的交易周期而不是每一个读操作。这种行为是由daemon_memcached_r_batch_size选项如果此选项设置为一个值大于,使用SQL表的更改立即可见的不memcached运营

  • 这个InnoDB表是(意向共享)或IX(意图独占)锁定在一个事务中的所有操作。如果你增加daemon_memcached_r_batch_sizedaemon_memcached_w_batch_size基本上从他们的默认值,桌子是最有可能锁定之间的每个操作,防止DDLstatements on the表。

15.19.7 InnoDB Memcached插件和复制

因为daemon_memcached插件支持MySQL二进制日志是一个制造,updates主服务器通过memcached接口可以被复制备份,平衡型阅读工作量,和高可用性。全部memcached命令的二进制日志支持。

你不需要设置daemon_memcached插件从服务器。这种结构的主要优点是增加写上主人的吞吐量。的复制机制的速度不受影响。

下面的部分显示如何使用二进制日志功能时使用daemon_memcached使用MySQL复制插件。假定您已完成安装了第15.19.3,设置innodb memcached插件”

使InnoDB Memcached二进制日志

  1. 使用daemon_memcached与MySQL的插件二进制日志,使innodb_api_enable_binlog配置选项主服务器。此选项只能设置在服务器启动。你还必须使MySQL二进制日志在主服务器上使用--log-bin选项你可以在MySQL的配置文件中添加这些选项,或在mysqld命令行

    mysqld ... --log-bin -–innodb_api_enable_binlog=1
    
  2. 配置主、从服务器,如第17.1.2,“建立复制二进制日志文件的位置

  3. 使用mysqldump创建一个主数据快照,快照和同步到从服务器。

    master shell> mysqldump --all-databases --lock-all-tables > dbdump.db
    slave shell> mysql < dbdump.db
    
  4. 在主服务器上,问题SHOW MASTER STATUS获得硕士双对数坐标

    MySQL的&#62;SHOW MASTER STATUS;
  5. 在从服务器,使用CHANGE MASTER TO语句设置一个从服务器,使用主二进制对数坐标。

    MySQL的&#62;CHANGE MASTER TOMASTER_HOST='localhost',MASTER_USER='root',MASTER_PASSWORD='',MASTER_PORT = 13000,MASTER_LOG_FILE='0.000001,MASTER_LOG_POS=114;
  6. 开始的奴隶

    mysql> START SLAVE;
    

    如果错误日志打印输出类似下面的奴隶,准备复制。

    2013-09-24T13:04:38.639684Z 49 [Note] Slave I/O thread: connected to
    master 'root@localhost:13000', replication started in log '0.000001'
    at position 114
    

测试InnoDB Memcached复制配置

这个例子演示了如何测试InnoDBmemcached复制配置使用memcached和Telnet的插入、更新和删除数据。MySQL客户端验证的结果对主从服务器。

该示例使用demo_test表,这是由_ memcached _ config.sql InnoDB配置脚本的初始安装过程中daemon_memcached插件这个demo_test表包含一个记录

  1. 使用set命令插入一个关键记录test1一个标志值,10,到期价值1,CAS的价值之和,在value oft1

    telnet 127.0.0.1 11211尝试连接到127.0.0.1…127.0.0.1.escape字符是^ ]”。set test1 10 0 1t1存储
  2. 在主服务器上,检查记录插入demo_test表假设demo_test表格是以前没有修改的,应该是有两个记录。一个关键的记录AA,并记录您刚刚插入,一个关键test1。这个c1柱图的关键,C2列的值的c3柱标志的价值,C4柱的CAS值,和c5柱的过期时间。过期时间设置为0,因为它是使用。

    MySQL的&#62;SELECT * FROM test.demo_test;------- -------------- ------ ------ ------ | C1 C2 C3 C4 | | | | C5 | ------- -------------- ------ ------ ------ | AA |你好,你好| 8 | 0 | 0 | | test1 | T1 | 10 | 1 | 0 | ------- -------------- ------ ------ ------
  3. 检查相同的记录复制到从服务器。

    mysql> SELECT * FROM test.demo_test;
    +-------+--------------+------+------+------+
    | c1    | c2           | c3   | c4   | c5   |
    +-------+--------------+------+------+------+
    | AA    | HELLO, HELLO |    8 |    0 |    0 |
    | test1 | t1           |   10 |    1 |    0 |
    +-------+--------------+------+------+------+
    
  4. 使用set命令来更新值的关键

    telnet 127.0.0.1 11211
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    set test1 10 0 2
    new
    STORED
    

    更新被复制到从服务器(注意,cas价值也更新)

    MySQL的&#62;SELECT * FROM test.demo_test;------- -------------- ------ ------ ------ | C1 C2 C3 C4 | | | | C5 | ------- -------------- ------ ------ ------ | AA |你好,你好| 8 | 0 | 0 | | test1 |新| 10 | 2 | 0 | ------- -------------- ------ ------ ------
  5. 删除test1记录使用删除命令

    telnet 127.0.0.1 11211
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    delete test1
    DELETED
    

    delete操作复制到奴隶的test1在奴隶的记录也被删除。

    mysql> SELECT * FROM test.demo_test;
    +----+--------------+------+------+------+
    | c1 | c2           | c3   | c4   | c5   |
    +----+--------------+------+------+------+
    | AA | HELLO, HELLO |    8 |    0 |    0 |
    +----+--------------+------+------+------+
    
  6. 删除所有行的表的使用flush_all命令

    telnet 127.0.0.1 11211尝试连接到127.0.0.1…127.0.0.1.escape字符是^ ]”。flush_all好啊
    MySQL的&#62;SELECT * FROM test.demo_test;空集合(0秒)
  7. 远程登录到主服务器并输入两个新记录。

    telnet 127.0.0.1 11211
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'
    set test2 10 0 4
    again
    STORED
    set test3 10 0 5
    again1
    STORED
    
  8. 确认两记录被复制到从服务器。

    mysql> SELECT * FROM test.demo_test;
    +-------+--------------+------+------+------+
    | c1    | c2           | c3   | c4   | c5   |
    +-------+--------------+------+------+------+
    | test2 | again        |   10 |    4 |    0 |
    | test3 | again1       |   10 |    5 |    0 |
    +-------+--------------+------+------+------+
    
  9. 删除所有行的表的使用flush_all命令

    telnet 127.0.0.1 11211尝试连接到127.0.0.1…127.0.0.1.escape字符是^ ]”。flush_all好啊
  10. 检查以确保flush_all手术是在从服务器复制。

    MySQL的&#62;SELECT * FROM test.demo_test;空集合(0秒)

InnoDB Memcached二进制日志记录

二进制日志格式:

  • memcached操作映射到DML报表(类似于插入,删除,更新)。由于没有实际的SQL语句被MySQL服务器处理,所有memcached命令(除flush_all)使用基于行的复制(RBR)测井,它独立于任何服务器binlog_format设置

  • 这个memcachedflush_all命令映射到TRUNCATE TABLE在MySQL 5.7和更早的命令。自DDL命令只能使用基于语句的日志,flush_all命令是通过发送一个复制TRUNCATE TABLE声明。在MySQL 8及以后,flush_all映射到DELETE但仍然是通过发送一个复制TRUNCATE TABLE声明

交易

15.19.8 InnoDB Memcached插件内部

对于InnoDB InnoDB Memcached插件API

这个InnoDBmemcached引擎访问InnoDB通过InnoDB原料药,其中大部分是直接采用嵌入式InnoDBInnoDBAPI函数传递给InnoDBmemcached发动机作为回调函数InnoDBAPI函数访问InnoDB表直接,大多为DML操作的除外TRUNCATE TABLE

memcached命令的实现InnoDBmemcached应用程序接口下表概述了如何memcached命令映射到DML或DDL操作。

表15.22 memcached命令及相关的DML或DDL操作

memcached命令DML或DDL操作
get读取指令
set搜索后INSERT更新(取决于是否存在的关键)
add搜索后INSERT更新
replace搜索后UPDATE
append搜索后UPDATE(将数据追加到之前的结果更新
prepend搜索后UPDATE(前置数据结果之前更新
incr搜索后UPDATE
decr搜索后UPDATE
delete搜索其次DELETE
flush_allTRUNCATE TABLE(DDL)

InnoDB Memcached插件配置表

本节所用的表格daemon_memcached插件这个cache_policies表,config_options表,并容器表格是由innodb_memcached_config.sql在配置脚本_ memcache InnoDB数据库

mysql> USE innodb_memcache;
Database changed
mysql> SHOW TABLES;
+---------------------------+
| Tables_in_innodb_memcache |
+---------------------------+
| cache_policies            |
| config_options            |
| containers                |
+---------------------------+

cache_policies表

这个cache_policies表定义了缓存策略InnoDBmemcached安装。您可以指定单独的政策得到set删除,和flush操作,在一个单一的缓存策略。所有操作的默认设置InnoDB _ only

  • innodb_only使用InnoDB作为数据存储

  • cache-only:使用memcached发动机作为数据存储

  • caching:使用InnoDBmemcached发动机作为数据存储。在这种情况下,如果memcached无法在内存中找到一把钥匙,它搜索的价值InnoDB

  • disable:禁用缓存

表15.23 cache_policies柱

专栏描述
policy_namename of the缓存策略。默认缓存策略的名字是cache_policy
get_policy缓存策略去操作。有效值为innodb_only唯一的隐藏caching,或禁用。默认设置是innodb_only
set_policy设置操作的缓存策略。有效值为innodb_only唯一的隐藏caching,或禁用。默认设置是innodb_only
delete_policy缓存策略的删除操作。有效值为innodb_only唯一的隐藏caching,或禁用。默认设置是innodb_only
flush_policy冲洗操作的缓存策略。有效值为innodb_only唯一的隐藏caching,或禁用。默认设置是innodb_only

_选项配置表

这个config_options表存储memcached相关的设置,可以在运行时使用SQL更改。支持的配置选项separator_ delimiter _图表

表15.24 config_options柱

专栏描述
Name名字的memcached相关的配置选项。下面的配置选项的支持config_options
  • separator:用一长串成不同的值,当有多个单独的值value_columns定义.默认情况下,该separator是一个|人物例如,如果你定义col1, col2作为值的列,和你定义|作为分隔符,可以发出以下memcached命令插入值col1COL2,分别是:

    set keyx 10 0 19
    valuecolx|valuecoly
    

    valuecol1x存储在2valuecoly存储在COL2

  • table_map_delimiter:字符分离模式名称和表名称,当你使用@ @符号在键的名称来访问一个特定的表的关键。例如,@@t1.some_keyt2.some @ @ _ keyhave the same key值,但不同的是存储在表。

Value分配到的价值memcached相关的配置选项

容器表

这个containers表是最重要的三个配置表。每个InnoDB表是用来存储memcached值必须在一个条目containers表进入提供了一个映射关系InnoDB表列和容器的表列,这是需要memcached工作InnoDB

这个containers表包含的默认条目test.demo _试验表,这是由innodb_memcached_config.sql配置剧本to use thedaemon_memcached用你自己的插件InnoDB表,您必须创建在一个条目容器

表15.25集装箱列

专栏描述
name给容器的名称。如果一个InnoDB表格是叫不上名字的使用要求@ @的符号,daemon_memcached插件使用InnoDB表一containers.name价值默认。如果没有这样的条目,在第一项containers表,按字母顺序排列的姓名(上行),决定默认InnoDB
db_schema数据库的名称,InnoDB表驻留。这是一个必需的价值。
db_table的名字InnoDB表中存储memcached价值。这是一种需要的价值。
key_columns在列InnoDB表包含查找关键值memcached运营这是一个必需的价值。
value_columns这个InnoDB表列(一个或多个)商店memcached数据多个列可以使用指定的分隔符指定innodb_memcached.config_options表默认情况下,分离器管道符(|)。指定多个列,与他们单独定义的分隔符。例如:col1|col2|col3。这是一个必需的价值。
flags这个InnoDB表列作为标志(即存储和检索的主要价值随着用户自定义的数字值)为memcached。一个标志值可以作为一个说明一些操作柱(如incr如果在)memcached值映射到多个列,这样的操作是在一个指定的列进行。例如,如果你有映射value_columnsInnoDB表列,只想在一个列进行增量操作,使用flags列指定列。如果你不使用旗帜柱,设置值0表明它是无用的
cas_column这个InnoDB表列存储比较并交换(CAS)值。这个例_柱值的方式有关memcached哈希存储到不同的服务器和缓存数据的请求。因为InnoDBmemcached插件是一个紧密集成memcached守护进程,并在内存缓存机制是由MySQL和处理InnoDB缓冲池这列,很少需要。如果你不使用这个栏目,设定值0表明它是无用的
expire_time_column这个InnoDBexpiration table column,存储的值。《_到期时间_柱值的方式有关memcached哈希存储到不同的服务器和缓存数据的请求。因为InnoDBmemcached插件是一个紧密集成memcached守护进程,并在内存缓存机制是由MySQL和处理InnoDB缓冲池这列,很少需要。如果你不使用这个栏目,设定值0表明柱闲置。最大的到期时间定义为_ max32 int或2147483647秒(约68年)。
unique_idx_name_on_key对键列的索引的名称。它必须是一个唯一索引。它可以是primary key二级指标。优选的是,所使用的主键InnoDB表使用主键查询,避免使用辅助索引时进行。你不能让一个覆盖指标memcached查找;InnoDB返回一个错误如果你试图定义一个复合次级指数超过两键和值的列。

容器的表列的约束
  • 你必须提供一个值db_schema_ DB NAMEkey_columnsvalue_columnsunique_idx_name_on_key。指定flags例_柱,和expire_time_column如果他们不使用。如果不这样做可能会导致安装失败。

  • key_columns最大限制为:memcached关键是250个字,这是强制执行的memcached。映射的键必须是非空CHARVARCHAR类型

  • value_columns:必须被映射到一个CHARVARCHAR,或BLOB专栏没有长度限制的值可以为空。

  • cas_column:the中国科学院价值是一个64位的整数。它必须被映射到一个BIGINT至少8个字节。如果你不使用这个栏目,设定值表明它是无用的

  • expiration_time_column:必须映射到一个INTEGER至少4个字节。到期时间为Unix时间是一个32位的整数(秒数自1月1日,1970年,作为一个32位值),或数秒,从当前的时间。对于后者,秒数不得超过60*60×24×30(30天的秒数)。如果客户端发送的数量较大,服务器认为这是一个真正的Unix时间而不是从当前时间偏移。如果你不使用这个栏目,设定值表明它是无用的

  • flags:必须被映射到一个INTEGER至少32位可空。如果你不使用这个栏目,设定值表明它是无用的

在插件加载时执行列约束是预先检查。如果发现不匹配,插件没有加载。

多值列映射
  • 在插件初始化,当InnoDBmemcached配置信息中定义的containers表,每个映射的列定义containers.value_columns对映射验证InnoDB桌子。多重InnoDB表中的列映射,有检查确保每一列的存在是正确的类型。

  • 在运行时,为memcached插入操作,如果有更多的限定值比映射的列数,只有映射值的数目了。例如,如果有六个映射的列,并提供了七个分隔的值,只有前六个分隔的值是。第七个分隔的值被忽略。

  • 如果有较少的限定值比未映射的列,列设置为null。如果未填列不能设置为空值,插入操作失败。

  • 如果一个表比映射值多列,外列不影响结果。

的demo_test示例表

这个innodb_memcached_config.sql配置脚本创建一个demo_test表中test数据库,可用于验证InnoDBmemcached插件安装后立即

这个innodb_memcached_config.sql配置脚本也创造了一项demo_test表中innodb_memcache.containers

MySQL的&#62;SELECT * FROM innodb_memcache.containers\G*************************** 1。行***************************名称:AAA db_schema:测试db_table:demo_test key_columns:C1 C2 C3 value_columns:国旗:cas_column:C4 expire_time_column:c5unique_idx_name_on_key:primarymysql &#62;SELECT * FROM test.demo_test;---- ------------------ ------ ------ ------ | C1 C2 C3 C4 | | | | C5 | ---- ------------------ ------ ------ ------ | AA |你好,你好| 8 | 0 | 0 | ---- ------------------ ------ ------ ------

15.19.9排除InnoDB Memcached插件

本节描述的问题,你可能会遇到在使用InnoDBmemcached插件

  • 如果在MySQL错误日志遇到以下错误你,服务器可能无法启动:

    未能打开文件设置rlimit。尝试运行的根或要求较小的maxconns价值。

    错误消息是从memcached守护进程。一个解决办法是提高对打开的文件数量限制的操作系统。检查和增加打开文件限制不同的操作系统的命令。这个例子表明,Linux和OS X的命令:

    # Linux
    shell> ulimit -n
    1024
    shell> ulimit -n 4096
    shell> ulimit -n
    4096
    
    # OS X
    shell> ulimit -n
    256
    shell> ulimit -n 4096
    shell> ulimit -n
    4096
    

    另一个方法是减少对允许的并发连接数memcached守护进程。在这样做时,编码-cmemcached选项中的daemon_memcached_option在MySQL的配置文件的配置参数。这个C选项的默认值为1024。

    [mysqld]
    ...
    loose-daemon_memcached_option='-c 64'
    
  • 要解决问题,memcached守护进程是无法存储或检索InnoDB表格数据,编码- VVVmemcached选项中的daemon_memcached_option在MySQL的配置文件的配置参数。检查MySQL错误日志输出相关的调试memcached运营

    [mysqld]
    ...
    loose-daemon_memcached_option='-vvv'
    
  • 如果指定抱柱memcached价值观是错误的数据类型,如数值类型而不是字符串类型,试图存储键/值对失败没有特定的错误代码或消息。

  • 如果daemon_memcached插件使MySQL服务器启动的问题,你可以暂时禁用daemon_memcached插件在排除下加入这行[mysqld]在MySQL的配置文件组:

    daemon_memcached=OFF

    例如,如果你运行INSTALL PLUGIN语句之前运行_ memcached _ config.sql InnoDB配置脚本建立必要的数据库和表,服务器可能会崩溃,无法启动。服务器也可以失败,如果你错误地配置项的开始innodb_memcache.containers

    卸载memcached一个MySQL实例插件,发表如下声明:

    mysql> UNINSTALL PLUGIN daemon_memcached;
    
  • 如果你运行MySQL的多个实例在同一台机器上的daemon_memcached插件可以在每一个例子中,使用daemon_memcached_option配置参数指定一个独特的memcached每个端口daemon_memcached插件

  • 如果一个SQL语句不能找到InnoDB表或表中没有找到数据,但memcachedAPI调用检索需要的数据,你可能会丢失的入口InnoDB表中innodb_memcache.containers表,或者你可能没有切换到正确的InnoDB通过发放表得到set要求使用@ @table_id符号。这个问题也可以如果你改变在现有项目发生innodb_memcache.containers无需重新启动MySQL服务器之后表。自由存储机制是足够灵活的,你的要求来存储或检索多个列的值,如col1|col2|col3仍然可以工作,即使守护进程使用test.demo _试验Table which stors values in a single Column .

  • 当定义你自己InnoDB与使用表daemon_memcached插件,并在表的列定义为NOT NULL值,确保供不为空当插入列的表记录到innodb_memcache.containers表如果INSERT声明为innodb_memcache.containers记录包含较少的限定值比有未映射的列,列设置为NULL。试图插入一个无效的值为NOT NULL柱的原因INSERT失败,这可能只是变得明显之后你重新初始化daemon_memcached插件将更改应用到innodb_memcache.containers

  • 如果cas_column_到期时间_柱田野里的innodb_memcached.containers表格设置无效的,返回下列错误尝试加载时memcached插件:

    InnoDB_Memcached: column 6 in the entry for config table 'containers' in
    database 'innodb_memcache' has an invalid NULL value.
    

    这个memcached拒绝使用插件NULL例_柱expire_time_column专栏把这些列的值当列未使用

  • 的长度memcached键和值的增加,你可能会遇到的大小和长度的限制。

    • 当钥匙超过250字节,memcached操作返回一个错误。这是当前的一个固定的范围内memcached

    • InnoDB桌上的限制可能是如果值超过768字节大小的遭遇,3072字节大小,或一半的innodb_page_size价值。这些限制主要适用于如果你想创建一个在值列运行生成报表的查询,使用SQL索引列。看到第15.8.1.7”限制,InnoDB表”详情

    • 对关键值组合的最大大小为1 MB。

  • 如果你分享的配置文件在不同版本的MySQL服务器,采用最新的配置选项的daemon_memcached插件可以在旧版本造成的启动错误。为了避免兼容性问题,使用释放选项名称前缀。例如,使用loose-daemon_memcached_option='-c 64'而不是daemon_memcached_option='-c 64'

  • 没有限制或检查来验证字符集设置。memcached存储和检索的字节数的键和值,因此是不敏感的字符集。然而,你必须确保memcached客户端和MySQL表使用相同的字符集。

  • memcached连接被禁止访问包含索引虚拟列表。访问索引虚拟列需要对服务器的回调,但memcached连接不能访问服务器端代码。

15.20 InnoDB故障排除

以下的一般准则适用于故障排除InnoDB问题:

  • 当一个操作失败或者你怀疑一个bug,看MySQL服务器错误日志(见5.4.2部分,“错误日志”第三,“服务器错误代码和消息”提供了一些常见的故障排除信息InnoDB特定的错误,你可能会遇到的。

  • 如果失败是关系到一个死锁,运行的innodb_print_all_deadlocks选项启用,每个细节都印僵局MySQL服务器的错误日志。有关死锁,看第15.5.5,“会”Deadlocks

  • 如果问题是相关的InnoDB数据字典,看到第15.20.3,“排除InnoDB数据字典操作”

  • 排除故障时,通常最好是从命令提示符运行MySQL服务器,而不是通过mysqld_safe或者是一个Windows服务。你能看到什么mysqld打印到控制台,等有更好的把握,是怎么回事。在Windows中,开始mysqld--console选择直接输出到控制台窗口。

  • 使InnoDB监视器获得关于问题的信息(见15.16节,“InnoDB监视器”)。如果问题是性能相关的,或你的服务器似乎是挂了,你应该使标准监控打印的内部状态信息InnoDB。如果问题是锁,使锁监视器。如果问题是表的创建、表空间或数据字典的操作,请参阅InnoDB信息架构系统表检查的内容InnoDB内部数据字典

    InnoDB暂时使标准InnoDB在下列条件下输出监视:

    • 一个长的信号灯等

    • InnoDB找不到缓冲池中的空闲块

    • 对缓冲池的67%是由锁堆或自适应哈希索引占用

  • 如果你怀疑一个表损坏,运行CHECK TABLE在那张桌子上

15.20.1 InnoDB I/O问题的故障排除

故障排除步骤InnoDBI/O问题取决于当问题发生时:对MySQL服务器启动时,或在正常操作时一个DML或DDL语句失败,由于在文件系统级的问题。

初始化的问题

如果事情出错时InnoDB试图初始化表空间或日志文件,删除了所有的文件InnoDB所有的ibdata文件和所有ib_logfile文件如果你已经创建了一些InnoDB表,同时删除任何鸡传染性法氏囊病从MySQL数据库目录文件。然后尝试InnoDB数据库创建了。最简单的故障排除,从命令提示符启动MySQL服务器,你知道发生了什么。

运行时存在的问题

如果InnoDB打印操作系统错误文件的操作过程中,通常的问题有以下解决方案:

  • 确保InnoDB数据文件和目录InnoDB日志目录存在

  • 确保mysqld要在这些目录创建文件的访问权限。

  • 确保mysqld可以读取正确的my.cnfmy.ini选择文件,以便它从您指定的选项。

  • 请确定磁盘未满,你不能超过磁盘配额。

  • 确保你指定的名称的子目录和数据文件不冲突。

  • Doubleecheck The Sntax of theinnodb_data_home_dirinnodb_data_file_path的值。特别是,任何马克斯中的价值innodb_data_file_path期权是一种硬限制,超过限制导致致命错误。

15.20.2迫使InnoDB恢复

探讨数据库页的腐败,你可能会把你从数据库表SELECT ... INTO OUTFILE。通常,大多数获得的数据是完整的。严重的腐败会导致SELECT * FROMtbl_name陈述或InnoDB后台操作崩溃或断言,甚至造成InnoDB前滚恢复崩溃。在这种情况下,你可以使用innodb_force_recovery选择力InnoDB存储引擎启动,防止后台操作运行,这样你可以把你的表。例如,您可以添加下面一行的[mysqld]在重新启动服务器之前,您选择文件段:

[mysqld]innodb_force_recovery = 1
警告

只有设置innodb_force_recovery一个大的值在急救情况比0,这样你就可以开始InnoDB和转储你的表。在这样做之前,确保你有你需要重新创建该数据库的备份副本。4或更大的值可以永久损坏的数据文件。只使用一个innodb_force_recovery4或更高的生产服务器实例后,你已经成功地测试了设置在一个单独的数据库的物理复制设置。当强迫InnoDB恢复,你应该总是开始innodb_force_recovery=1只有增加值增量,是必要的。

innodb_force_recovery默认值是0(正常启动无强制回收)。允许非零的值innodb_force_recovery1到6。一个更大的价值,包括小值的功能。例如,一个价值3包括所有的功能值1和2。

如果你能把你的表一innodb_force_recovery三或更少的价值,那么你是相对安全的,只有在腐败的个人页面的一些数据丢失。一个值或更多的被认为是危险的因为数据文件可以永久损坏。一个价值60是激烈因为数据库页是一个过时的状态离开,这反过来又可能会引入更多的腐败B树和其他数据库结构

作为一种安全措施,InnoDB防止INSERTUPDATE,或DELETE操作时innodb_force_recovery大于0。一个innodb_force_recovery4或更高的地方设置InnoDB在只读模式

  • 1srv_force_ignore_corrupt

    让服务器运行即使它检测到一个腐败网页。试图让SELECT * FROM tbl_name在腐败指数记录和页面跳转,这有助于在倾销表。

  • 2srv_force_no_background

    防止主线程和任何清除线程从运行。如果事故发生在净化操作,这阻碍了它的回收价值。

  • 3srv_force_no_trx_undo

    不执行事务回滚之后崩溃恢复

  • 4srv_force_no_ibuf_merge

    防止插入缓冲合并操作。他们是否会导致崩溃,不做。不计算表统计。这个值可以永久损坏的数据文件。使用此值后,会删除并重新创建所有的次要指标。套装InnoDB为只读

  • 5srv_force_no_undo_log_scan

    不看UNDO日志启动数据库时:InnoDB甚至将不完全交易的承诺。这个值可以永久损坏的数据文件。套装InnoDB为只读

  • 6_ SRV _队不_ _我日志

    不做重做日志文件辊与恢复了。这个值可以永久损坏的数据文件。离开一个过时的数据库页,这反过来可能会引入更多的腐败为B-树和其他数据库结构。套装InnoDB为只读

你可以SELECT从表甩掉他们。一个innodb_force_recovery3或更少,你可以值CREATEDROP TABLE也支持一个innodb_force_recovery大于3的值DROP TABLE是不允许的innodb_force_recovery大于4的值

如果你知道一个给定的表是回滚造成的,你可以将它。如果你遇到一个失控的回滚由失败的导入或引起ALTER TABLE,你可以杀死mysqld过程和集innodb_force_recovery使数据库不回滚,然后DROP桌子是造成失控的回滚。

如果表数据中的腐败使你倾倒整个表的内容,查询与ORDER BY primary_key DESC条款可能损坏的部分后,把桌子的部分。

如果一个高innodb_force_recovery值必须开始InnoDB,有可能损坏的数据结构可能导致复杂的查询(查询WHERE顺序,或其他条款)失败。在这种情况下,你可能只能够运行的基本SELECT * FROM t查询

15.20.3 InnoDB数据字典操作故障

关于表的定义信息存储在InnoDB数据字典。如果你将数据文件,数据字典可以不一致。

如果一个数据字典的腐败或一致性问题阻止你开始InnoDB,看到第15.20.2,迫使InnoDB恢复”有关手动恢复信息

无法打开数据文件

innodb_file_per_table启用(默认),下面的消息可能会出现在启动时如果文件表表格文件.ibd文件)丢失:

[错误] InnoDB:在文件操作数2操作系统错误。[错误] InnoDB:这个错误是系统找不到指定的路径。[错误]:不能为只读方式打开数据文件设置:&#39;。/测试/ T1。IBD的操作系统错误:71 [警告] InnoDB表空间:忽略`试验/T1 `因为它无法打开。

对这些邮件地址的问题DROP TABLE语句删除数据丢失的表从数据字典。

恢复孤立文件每桌IBD文件

本程序介绍了如何恢复孤儿文件表.ibd文件到另一个MySQL实例。你可能在SYSTEM表空间丢失或不可恢复的,要恢复使用本程序美洲开发银行在一个新的MySQL实例文件备份。

程序不支持一般的表空间.ibd文件

程序假定你只有.ibd文件备份,你恢复到最初创建的孤儿MySQL版本相同美洲开发银行文件,并.idb文件备份是干净的。看到第15.8.1.3,“移动或复制InnoDB表”有关创建干净的备份信息。

表空间复制限制概述第15.7.6,“每表表空间文件复制到另一个实例”适用于本程序

  1. 在新的MySQL实例,在一个同名的数据库重新创建表。

    mysql> CREATE DATABASE sakila;
    
    mysql> USE sakila;
    
    mysql> CREATE TABLE actor (
             actor_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
             first_name VARCHAR(45) NOT NULL,
             last_name VARCHAR(45) NOT NULL,
             last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
             PRIMARY KEY  (actor_id),
             KEY idx_actor_last_name (last_name)
           )ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
  2. 丢弃新创建的表的表空间。

    mysql> ALTER TABLE sakila.actor DISCARD TABLESPACE;
    
  3. 复制的孤儿.idb从你的备份目录到新的数据库目录文件。

    内核&#62;cp /backup_directory/actor.ibd path/to/mysql-5.7/data/sakila/
  4. 确保.ibdhas the necessary文件的授权文件。

  5. 进口的孤儿.ibd文件警告说明InnoDB将导入的文件没有模式验证。

    mysql> ALTER TABLE sakila.actor IMPORT TABLESPACE; SHOW WARNINGS;    
    Query OK, 0 rows affected, 1 warning (0.15 sec)
    
    Warning | 1810 | InnoDB: IO Read error: (2, No such file or directory)
    Error opening './sakila/actor.cfg', will attempt to import
    without schema verification
  6. 查询表的验证.ibd文件被成功恢复

    MySQL的&#62;SELECT COUNT(*) FROM sakila.actor;---------- |计数(*)| ---------- | 200 | ----------

15.20.4 InnoDB错误处理

以下项目描述InnoDB执行错误处理InnoDB有时只回滚语句失败,其他时候回滚整个事务。

  • 如果您运行的文件空间中的一个表空间,MySQLTable is full错误的发生InnoDB回滚的SQL语句

  • 一个交易死锁起因InnoDB回滚整个交易。重试整个交易时

    锁等待超时的原因InnoDB回到只有单个语句,等待锁遇到超时。(有整个事务回滚,启动服务器与--innodb_rollback_on_timeout选择。)重新声明如果使用当前的行为,或者整个交易如果使用--innodb_rollback_on_timeout

    死锁和锁等待超时是在繁忙的服务器正常可能知道他们可能发生和处理应用程序所必需的重试。你可以使他们不太可能做尽可能少的工作的第一个变化之间的数据交易和提交过程中,所以锁持有尽可能短的时间和尽可能多的行。有时分不同的交易之间的工作可能是实际和有用的。

    当一个事务回滚发生死锁和锁等待超时,取消在交易报表的影响。但如果开始交易声明START TRANSACTIONBEGIN语句回滚不取消声明。进一步的SQL语句成为交易的一部分,直到发生COMMITROLLBACK,或一些SQL语句引起的隐式提交。

  • 重复键错误回滚的SQL语句,如果您未指定IGNORE在你的陈述中选择

  • row too long error回滚的SQL语句

  • 其他的误差主要是由代码MySQL层检测(以上InnoDB存储引擎的水平),和他们滚回相应的SQL语句。锁不回滚一个SQL语句释放。

在隐式回滚,以及明确的执行期间ROLLBACKSQL语句,SHOW PROCESSLIST显示器滚回去State为相关连接柱