mysql-innoDB概述

本文内容基于MySQL5.7

定义

InnoDB是一种兼顾了高可靠性和高性能的通用存储引擎。在MySQL 5.7中,InnoDB是默认的MySQL存储引擎。除非您配置了其他默认存储引擎,否则发出CREATE TABLE不带ENGINE= 子句的语句将创建一个InnoDB表。

优点

它的DML操作遵循 ACID模型,并 具有具有 提交,回滚和 崩溃恢复 功能的事务, 以保护用户数据

行级锁定和Oracle风格的一致读取可提高多用户并发性和性能。

InnoDB表格将您的数据排列在磁盘上以基于主键优化查询 。每个 InnoDB表都有一个称为聚集索引的主键索引,该索引 组织数据以最小化主键查找的I / O。

维护数据 完整性, InnoDB支持 FOREIGN KEY约束。使用外键检查插入,更新和删除操作,以确保它们不会导致不同表之间的不一致

如果服务器由于硬件或软件问题而崩溃,无论当时数据库中发生了什么,重新启动数据库后都无需执行任何特殊操作。InnoDB 崩溃恢复会 自动完成崩溃之前已提交的所有更改,并撤消正在处理但尚未提交的所有更改。只需重新启动,然后从上次中断的地方继续即可。

该InnoDB存储引擎维护它自己的 缓冲池,在主内存缓存表和索引数据作为数据被访问。经常使用的数据直接从内存中处理。此缓存适用于多种类型的信息,并可以加快处理速度。在专用数据库服务器上,通常将多达80%的物理内存分配给缓冲池。

如果将相关数据拆分到不同的表中,则可以设置 强制 引用完整性的外键。更新或删除数据,并自动更新或删除其他表中的相关数据。尝试将数据插入到辅助表中,而在主表中没有相应的数据,那么不良数据将自动被踢出。

如果数据在磁盘或内存中损坏,则 校验和机制会在使用前提醒您注意虚假数据。

当为每个表设计具有适当主键列的数据库时 ,涉及这些列的操作会自动进行优化。在WHERE 子句,ORDER BY子句, GROUP BY 子句和联接操作中引用主键列非常快速 。

插入,更新和删除通过称为更改缓冲的自动机制进行了优化。InnoDB不仅允许对同一表的并发读写访问,而且还缓存更改的数据以简化磁盘I / O。

性能收益不仅限于具有长时间运行的查询的巨型表。当从表中一遍又一遍地访问相同的行时,称为“ 自适应哈希索引”的功能 将使这些查找变得更快,就像它们是从哈希表中出来一样。

您可以压缩表和关联的索引。

您可以创建和删除索引,而对性能和可用性的影响要小得多。

截断 每表文件表 空间非常快,并且可以释放磁盘空间供操作系统重用,而不是释放只能重用的系统表空间中的空间InnoDB。

BLOB使用DYNAMIC行格式, 对于长文本字段,表数据的存储布局更为有效 。

您可以通过查询INFORMATION_SCHEMA 表来监视存储引擎的内部工作情况 。

您可以通过查询性能架构表来监视存储引擎的性能详细信息 。

您可以自由地将InnoDB表与其他MySQL存储引擎中的表混合使用,即使在同一条语句中也是如此。例如,您可以使用 联接操作在单个查询中合并来自InnoDB和 MEMORY表的数据。

InnoDB 设计用于处理大量数据时的CPU效率和最佳性能。

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

功能

B树索引 是
备份/时间点恢复(在服务器中而不是在存储引擎中实现。) 是
聚集索引 是
压缩数据 是
资料快取 是
加密数据 是(通过加密功能在服务器中实现;在MySQL 5.7和更高版本中,支持静态数据表空间加密。)
外键支持 是
全文搜索索引 是(MySQL 5.6和更高版本提供InnoDB对FULLTEXT索引的支持。)
地理空间数据类型支持 是
地理空间索引支持 是(MySQL 5.7和更高版本提供InnoDB对地理空间索引的支持。)
索引缓存 是
锁定粒度 行
MVCC 是
复制支持(在服务器中而不是在存储引擎中实现。) 是
储存限制 64TB
交易次数 是
更新数据字典的统计信息 是

最佳实践

使用查询频率最高的一个或多个列为每个表 指定一个主键, 如果没有明显的主键,则指定一个 自动增量值。

使用联接时,无论是基于多个表中相同的ID值,还是从多个表中提取数据。为了提高连接性能,请在连接列上定义 外键,并在每个表中使用相同的数据类型声明这些列。添加外键可确保对引用的列进行索引,从而可以提高性能。外键还将删除或更新传播到所有受影响的表,并且如果父表中不存在相应的ID,则可以防止在子表中插入数据。

关闭自动提交。每秒提交数百次会限制性能(受存储设备的写入速度限制)。

分组组相关的DML 操作成 交易,通过包围他们START TRANSACTION和 COMMIT报表。虽然你不想过于频繁地提交,你也不想发出的巨大的批次 INSERT, UPDATE或 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。

查询默认存储引擎
SELECT * FROM INFORMATION_SCHEMA.ENGINES;

MySQL服务器选项文件部分中default-storage-engine=innodb 定义的服务器 ,来确定数据库服务器或应用程序是否可以正常使用[mysqld]。

ACID模型

原子性

ACID模型 的原子性方面主要涉及InnoDB 事务。相关的MySQL功能包括:
自动提交设置。
COMMIT 声明。
ROLLBACK 声明。
INFORMATION_SCHEMA 表中的 操作数据。

一致性

ACID模型 的一致性方面主要涉及内部InnoDB处理,以防止数据崩溃。相关的MySQL功能包括:
InnoDB doublewrite缓冲区。
InnoDB 崩溃恢复。

隔离

ACID模型 的隔离方面主要涉及InnoDB 事务,尤其是适用于每个事务的隔离级别。相关的MySQL功能包括:
自动提交设置。
SET ISOLATION LEVEL 声明。
InnoDB 锁定 的底层细节。在性能调整期间,您可以通过INFORMATION_SCHEMA表格查看这些详细信息 。

持久性

ACID模型 的持久性方面涉及与特定硬件配置交互的MySQL软件功能。由于取决于您的CPU,网络和存储设备的功能的可能性很多,因此为具体的准则提供最复杂的方面。(这些准则可能采取购买“ 新硬件 ”的形式 。)相关的MySQL功能包括:

InnoDB doublewrite buffer,由innodb_doublewrite 配置选项打开和关闭 。
配置选项 innodb_flush_log_at_trx_commit。
配置选项 sync_binlog。
配置选项 innodb_file_per_table。
存储设备(例如磁盘驱动器,SSD或RAID阵列)中的写缓冲区。
存储设备中由电池支持的缓存。
用来运行MySQL的操作系统,特别是它对fsync()系统调用的支持。
不间断电源(UPS)保护运行MySQL服务器并存储MySQL数据的所有计算机服务器和存储设备的电源。
您的备份策略,例如备份的频率和类型以及备份保留期。
对于分布式或托管数据应用程序,MySQL服务器的硬件所在的数据中心的特定特性,以及数据中心之间的网络连接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章