存储引擎

存储引擎(或表类型)是 MySQL 核心的一部分,负责处理表上的操作。MySQL 提供多种存储引擎,其中使用最广泛的是 MyISAM 和 InnoDB。这两种存储引擎各有利弊,但 InnoDB 始终是优先选择。MySQL 从 5.5 版本开始使用 InnoDB 作为默认存储引擎。

MySQL 还提供了其他一些存储引擎,它们都有各自的用途。在数据库设计过程中,可以决定哪个表应使用哪个存储引擎。有关 MySQL 5.6 存储引擎的完整列表,请访问 http://dev.mysql.com/doc/refman/5.6/en/storage-engines.html

可以在数据库级别设置一个存储引擎,然后将其用作每个新建表的默认存储引擎。请注意,存储引擎是表的基础,在一个数据库中,不同的表可以有不同的存储引擎。如果我们已经创建了一个表,但想更改它的存储引擎,该怎么办?很简单。假设我们的表名为 pkt_users,其存储引擎为 MyISAM,我们想将其更改为 InnoDB;我们将使用以下 MySQL 命令:

ALTER TABLE pkt_users ENGINE=INNODB;

这将把表的存储引擎值更改为 INNODB

现在,让我们来讨论一下使用最广泛的两种存储引擎之间的区别: MyISAMInnoDB

MyISAM 存储引擎

MyISAM 支持或不支持的功能的简要列表如下:

  • MyISAM 专为提高速度而设计,与 SELECT 语句配合使用效果最佳。

  • 如果表比较静态,也就是说,表中的数据更新/删除频率较低,大多数情况下只能获取,那么 MyISAM 就是该表的最佳选择。

  • MyISAM 支持表级锁定。如果需要对表中的数据执行特定操作,则可以锁定整个表。在锁定期间,不能对该表执行任何操作。如果表的动态性较强,也就是说,如果表中的数据经常变化,这可能会导致性能下降。

  • MyISAM 不支持外键。

  • MyISAM 支持全文检索。

  • MyISAM 不支持事务。因此,不支持 COMMIT 和 ROLLBACK。如果在表上执行查询,就只能执行,不能返回。

  • 支持数据压缩、复制、查询缓存和数据加密。

  • 不支持集群数据库。

InnoDB 存储引擎

InnoDB 支持或不支持的功能的简要列表如下:

  • InnoDB 专为处理大量数据时实现高可靠性和高性能而设计。

  • InnoDB 支持行级锁定。这是一个很好的功能,对性能有很大帮助。它不像 MyISAM 那样锁定整个表,而是只为 SELECT、DELETE 或 UPDATE 操作锁定特定行,在这些操作过程中,可以操作表中的其他数据。

  • InnoDB 支持外键和强制外键约束。

  • 支持事务。支持 COMMIT 和 ROLLBACK,因此可以从特定事务中恢复数据。

  • 支持数据压缩、复制、查询缓存和数据加密。

  • InnoDB 可以在集群环境中使用,但并不完全支持。不过,InnoDB 表可以转换为 NDB 存储引擎,通过将表引擎更改为 NDB,在 MySQL 集群中使用 NDB 存储引擎。

在接下来的章节中,我们将讨论更多与 InnoDB 相关的性能特性。以下配置的值在 my.cnf 文件中设置。

innodb_buffer_pool_size

此设置定义了 InnoDB 数据和加载到内存中的索引应使用多少内存。对于专用 MySQL 服务器,建议值为服务器上安装内存的 50-80%。如果该值设置过高,操作系统和 MySQL 的其他子系统(如事务日志)就没有内存可用了。因此,让我们打开 my.cnf 文件,搜索 innodb_buffer_pool_size,并将其设置在内存推荐值(即 50-80%)之间。

innodb_buffer_pool_instances

这项功能的使用并不广泛。在 64 位系统上,如果 innodb_buffer_pool_size 的值较大,它可以让多个缓冲池实例协同工作,减少内存争用的机会。

计算 innodb_buffer_pool_instances 的值有多种选择。一种方法是每 GB 的 innodb_buffer_pool_size 使用一个实例。因此,如果 innodb_buffer_pool_size 的值是 16 GB,我们就把 innodb_buffer_pool_instances 设为 16。

innodb_log_file_size

innodb_log_file_size 是存储每次查询信息的日志文件的大小。对于专用服务器来说,最大 4 GB 的值是安全的,但如果日志文件太大,崩溃恢复所需的时间可能会增加。因此,最佳做法是将日志文件大小保持在 1 至 4 GB 之间。