[译文] MySQL 中的 InnoDB 是什么?包含示例和性能调优技巧的教程

2024年 6月 30日 53.3k 0

有许多强大的MySQL 存储引擎可供我们使用,而 InnoDB 无疑是最受欢迎的存储引擎之一。它高度可靠和高效,因此它成为5.5以后所有MySQL版本的默认存储引擎也就不足为奇了。让我们更仔细地看看它的优点和特点。

内容目录

  1. MySQL 中的 InnoDB 是什么?
  2. InnoDB 集群
  3. 创建 InnoDB 表
  4. InnoDB 服务器变量和性能调优技巧
  5. 处理 InnoDB 中最常见的错误
  6. 使用 InnoDB 和 dbForge Studio for MySQL 获得最高性能

MySQL 中的 InnoDB 是什么?

现在我们想确定 MySQL InnoDB 存储引擎的特殊之处。以下是它的主要优点:

InnoDB 基于 ACID,支持提交和回滚操作。此外,它不太可能崩溃,因此用户的数据仍然受到保护。

  • 由于行级锁定,多用户性能成为可能。
  • 由于 InnoDB 表有效地组织数据,因此优化了基于主键的查询。每个 InnoDB 表中都有一个称为聚集索引的主键索引。此索引排列数据以减少主键查询的 I/O。
  • MySQL InnoDB 支持外键约束,可以实现和维护数据完整性。

InnoDB 也可以与 MariaDB 服务器一起使用。在这种情况下,InnoDB 提供外键、XA 事务和带有保存点的事务。

InnoDB 集群

每家公司的政策都以提供最安全、最稳定的数据流为前提。但是如何才能实现和保证呢?答案在于 MySQL InnoDB Cluster,它为 MySQL 提供了一个方便的解决方案。在 AdminAPI 和 MySQL Shell 的参与下,您可以轻松管理多个 MySQL 服务器实例以作为单个 InnoDB Cluster 工作。

MySQL InnoDB Cluster 的组件包括以下内容:

  • MySQL 路由器(安全路由到数据库节点)
  • MySQL 组复制(多个相互复制的数据库服务器)
  • MySQL Shell(MySQL 的配置工具,有助于启用具有容错功能的拓扑)

看看它是如何在单个 InnoDB 集群中协同工作的:

[译文] MySQL 中的 InnoDB 是什么?包含示例和性能调优技巧的教程-1

创建 InnoDB 表

为了创建 InnoDB 表,您只需在 CREATE TABLE 语句中指定。例如:ENGINE = InnoDB

CREATE TABLE Emp ( EmpID SMALLINT UNSIGNED NOT NULL , YearBorn YEAR NOT NULL , CityBorn VARCHAR ( 40 ) NOT NULL DEFAULT 'Unknown' ) ENGINE = INNODB ;

InnoDB 服务器变量和性能调优技巧
以下是可用的 InnoDB 服务器变量列表,这些变量有助于加速和优化 MySQL 数据库和 InnoDB 存储引擎之间的性能和交互:

  • innodb_flush_log_at_trx_commit
  • innodb_buffer_pool_size
  • innodb_buffer_pool_instances
  • innodb_file_per_table
  • innodb_force_recovery
  • innodb_lock_wait_timeout
  • innodb_large_prefix
  • innodb_flush_method
  • innodb_thread_concurrency
  • innodb_log_buffer_size
  • innodb_io_capacity
  • innodb_strict_mode
  • innodb_autoinc_lock_mode
  • innodb_read_io_threads
  • innodb_data_file_path

innodb_flush_log_at_trx_commit

此命令的基本语法是. 它配置事务刷新到重做日志的频率。–innodb-flush-log-at-trx-commit=#

innodb_buffer_pool_size

此命令的基本语法是. InnoDB 缓冲池是一个内存域,InnoDB 存储引擎在其中缓存其表和索引数据。默认值为 134217728 字节 (128MB)。CPU 架构定义了最大值,在 32 位系统上等于 4294967295 (232-1),在 64 位系统上等于 18446744073709551615 (264-1)。–innodb-buffer-pool-size=#

innodb_buffer_pool_instances

此命令的基本语法是. 它表示 InnoDB 缓冲池必须包含的区域数量。对于数 GB 范围内的缓冲池,将整个缓冲池划分为多个单独的实例可以提高并发性。–innodb-buffer-pool-instances=#

innodb_file_per_table

此命令的基本语法是. 启用该变量后,默认情况下会在每个表的文件表空间中生成表。如果禁用,则在系统表空间中生成表。–innodb-file-per-table[={OFF|ON}]

innodb_force_recovery

此命令的基本语法是. 它是一种崩溃恢复模式,通常用于解决问题。允许的值范围为 0 到 6。–innodb-force-recovery=#

innodb_lock_wait_timeout

此命令的基本语法是. 默认持续时间为 50 秒。之后,InnoDB 事务被中断。如果超过时间限制,会报如下错误:–innodb-lock-wait-timeout=#

ERROR 1205 ( HY000 ):超过锁定等待超时;尝试重新启动事务

在这种情况下,仅回滚语句。如果要回滚整个事务,请使用该命令。–innodb-rollback-on-timeout

innodb_large_prefix

此命令的基本语法是. 如果启用此选项,则对于行格式为 DYNAMIC 或 COMPRESSED 的 InnoDB 表,允许使用超过 767 字节(最多 3072 字节)的索引键前缀。对于行格式为 REDUNDANT 或 COMPACT 的表,此命令不会影响允许的索引键前缀长度。–innodb-large-prefix[={OFF|ON}]

innodb_flush_method

使用该命令指定将用于将数据刷新到 InnoDB 文件的方法。请注意,I/O 吞吐量可能会受到影响。–innodb-flush-method=value

innodb_thread_concurrency

此命令的基本语法是. 它定义了 InnoDB 允许的最大线程数。无限并发由值 0 定义,默认设置。–innodb-thread-concurrency=#

innodb_log_buffer_size

此命令的基本语法是. 这是尚未提交的事务的缓冲区大小。如果您使用大字段(如 BLOB 或 TEXT),则应更改此参数的值。–innodb-log-buffer-size=#

innodb_io_capacity

此命令的基本语法是. 它指定了 InnoDB 后台操作可访问的每秒 I/O 事务数 (IOPS)。–innodb-io-capacity=#

innodb_strict_mode

此命令的基本语法是. 严格模式起到了屏蔽不同 SQL 语句序列和操作模式的各种意外结果的作用。当启用 innodb_strict_mode 时,InnoDB 会针对特定条件发出错误。–innodb-strict-mode[={OFF|ON}]

innodb_autoinc_lock_mode

此命令的基本语法是. 自动递增值在锁定模式下生成。允许的值为 0、1 或 2(分别用于传统、连续或交错锁定模式)。默认设置为 1(连续)。–innodb-autoinc-lock-mode=#

innodb_read_io_threads

使用该命令定义 InnoDB 文件 I/O 流的数量。–innodb-read-io-threads=#

innodb_data_file_path

此命令的基本语法是. 它指定有关 InnoDB 系统表空间数据文件的信息。如果尚未定义 innodb_data_file_path 的值,则默认生成单个自动扩展数据文件。该数据文件名为ibdata1,大小约为12MB。–innodb-data-file-path=file_name

数据文件的完整语法如下:它由文件名、文件大小、自动扩展属性和最大属性组成。
file_name:file_size[:autoextend[:max:max_file_size]]

要获取更多详细信息,请参阅InnoDB 启动选项和系统变量。

请注意:在执行你的操作时,确保 InnoDB 没有使用它自己的内存而不是操作系统的内存是很重要的。在这种情况下,您将看到 InnoDB 内存堆被禁用的通知,并会显示错误。可以通过将 innodb_use_sys_malloc 的值设置为 ON 或 1 而不是 0 来解决。

处理 InnoDB 中最常见的错误

InnoDB 中错误的处理并不总是与指定的 SQL 标准相同。例如,SQL 语句中的错误必须导致所述语句的回滚。对于 InnoDB,在某些情况下,失败的语句会被回滚;在其他情况下,整个事务会回滚。

  • 表空间空间不足会导致错误,并且 SQL 语句会回滚。Table is full
  • 除非在所述语句中指定了 IGNORE 选项,否则重复键错误会导致语句回滚。
  • 锁等待超时导致正在等待锁但面临超时的语句回滚。
  • 该错误还会回滚相应的语句。row too long
  • 事务死锁会导致整个事务回滚,之后应重试。
  • 其他错误一般由 MySQL 代码层检测到,从而导致相关语句回滚。

原文地址:https://blog.devart.com/what-is-innodb-in-mysql.html

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论