MySQL 的存储引擎是数据库管理系统中用于存储、处理和检索数据的核心服务和组件。不同的存储引擎提供了不同的数据类型支持、存储机制、索引技术、锁定水平以及其他性能特性。选择合适的存储引擎对于优化数据库性能、提高资源利用率和支持特定的数据库操作非常关键。
MySQL 中常见的存储引擎:
InnoDB 现在是 MySQL 默认的存储引擎,支持事务、行级锁定和外键
InnoDB 是 MySQL 默认的事务型存储引擎,支持 ACID(原子性、一致性、隔离性、持久性)事务处理,行级锁定和外键。
优点
缺点
InnoDB 的设计目标是提供一种能够处理大量数据的高性能、高可靠性的存储引擎。对于大多数需要高并发和事务支持的应用程序来说,InnoDB 的优点远远超过其缺点。然而,对于一些特定的应用场景,比如只读数据或对事务支持要求不高的情况,其他存储引擎可能会是更好的选择。
MyISAM 是 MySQL 中一种较早的默认存储引擎,虽然在新版本中被 InnoDB 所取代,但它仍然广泛用于一些特定场景下。MyISAM 基于早期的 ISAM 类型并进行了扩展,它支持全文索引、压缩、空间函数等特性。以下是 MyISAM 存储引擎的主要优点和缺点:
优点
缺点
尽管 MyISAM 有其局限性,特别是在事务支持和数据完整性方面,但它在处理大量读操作、需要全文索引的场景以及资源受限的环境中仍然是一个有价值的选择。对于静态数据的存储或简单的Web应用,MyISAM 可以提供优秀的性能和高效的空间使用。然而,对于需要高并发写操作或事务支持的现代数据库应用,InnoDB 或其他更先进的存储引擎可能是更好的选择。
Memory 存储引擎(以前称为 HEAP),在 MySQL 中提供了数据存储在内存中的能力,主要用于提高数据访问的速度。由于数据和索引都在 RAM 中,这使得 Memory 引擎特别适合于需要快速读写访问的临时数据存储场景。不过,由于存储在内存中的数据在数据库重启后会丢失,所以它主要用于那些不需要持久存储数据的场合。以下是 Memory 存储引擎的主要优点和缺点:
优点
缺点
尽管 Memory 存储引擎在数据持久性和存储能力方面有其限制,但它在需要高速数据访问和处理的特定场景下仍然非常有用。例如,它可以用于缓存那些不经常改变但频繁读取的数据,或者用作存储临时计算结果的临时表。在这些情况下,Memory 存储引擎可以提供显著的性能优势。然而,对于需要长期存储或事务一致性保证的应用,其他存储引擎(如 InnoDB)将是更好的选择。
CSV 存储引擎在 MySQL 中提供了一种独特的数据存储方式,使得表数据以逗号分隔值(CSV)格式存储。这种格式的主要优势在于数据可以很容易地在不同的程序和应用之间进行交换,例如表格处理软件(如 Microsoft Excel)和文本编辑器。CSV 存储引擎将每一行数据存储为一个 CSV 文件的一行,而表的元数据(如列定义)则存储在与表同名的 .frm
文件中。以下是 CSV 存储引擎的主要优点和缺点:
优点
缺点
尽管 CSV 存储引擎在性能和功能方面有一定的限制,但它在数据共享和简化数据交换过程中扮演了重要的角色。对于需要频繁导入导出数据到其他应用程序的场景,或者在数据分析和报告过程中需要与非数据库用户共享数据的情况,CSV 存储引擎是一个非常有用的工具。然而,对于需要高性能查询、数据完整性保护或事务支持的应用,其他存储引擎(如 InnoDB)将是更合适的选择。
ARCHIVE 存储引擎在 MySQL 中提供了一种高度专门化的数据存储方式,旨在为大量数据提供高效的存储解决方案,尤其是对于那些只需要插入和查询操作的历史或归档数据。ARCHIVE 引擎使用行级压缩技术来优化存储空间的使用,非常适合存储日志文件、审计信息等类型的数据。以下是 ARCHIVE 存储引擎的主要优点和缺点:
优点
缺点
UPDATE
和 DELETE
操作,这意味着一旦数据被写入,就无法被修改或删除。DELETE
和 UPDATE
操作,如果需要删除或更正数据,必须重建整个表。尽管有其局限性,ARCHIVE 存储引擎在特定场景下非常有用,尤其是对于需要高效压缩存储大量只读数据的应用。它特别适合用于日志数据的存储、长期历史记录的保留,或任何需要长时间存储但不频繁查询的数据集。对于这些应用场景,ARCHIVE 提供了一种节省空间且成本效益高的解决方案。然而,对于需要频繁读写操作、数据修改或高速查询的应用,其他存储引擎,如 InnoDB,可能更加合适。
BLACKHOLE 存储引擎在 MySQL 中提供了一种非常特殊的数据存储方式。顾名思义,BLACKHOLE 就像一个黑洞,它接收数据的写操作(如 INSERT、UPDATE、DELETE),但不会实际存储任何数据,查询总是返回空结果。这个存储引擎通常用于特定的应用场景,比如在复制配置中过滤数据或者测试。以下是 BLACKHOLE 存储引擎的主要优点和缺点:
优点
缺点
BLACKHOLE 存储引擎的设计初衷并非用于常规的数据存储需求,而是为了满足特定的技术和操作需求。在实际应用中,它可以作为一种工具来辅助实现数据流的控制、性能测试或特定的数据处理流程。然而,对于需要持久存储、数据检索和事务支持的应用场景,其他存储引擎如 InnoDB 或 MyISAM 会是更合适的选择。
在 MySQL 中建立任何一张数据表,在其数据目录对应的数据库目录下都有对应表的 .frm
文件,.frm
文件是用来保存每个数据表的元数据(meta)信息,包括表结构的定义等,与数据库存储引擎无关,也就是任何存储引擎的数据表都必须有 .frm
文件,命名方式为 数据表名 .frm
,如 user.frm
。
查看 MySQL 数据保存在哪里:
show variables like 'data%';
MyISAM 物理文件结构为:
.frm
文件:与表相关的元数据信息都存放在 frm 文件,包括表结构的定义信息等.MYD
(MYData) 文件:MyISAM 存储引擎专用,用于存储 MyISAM 表的数据.MYI
(MYIndex)文件:MyISAM 存储引擎专用,用于存储 MyISAM 表的索引相关信息InnoDB 物理文件结构为:
.frm
文件:与表相关的元数据信息都存放在 frm
文件,包括表结构的定义信息等.ibd
文件或 .ibdata
文件: 这两种文件都是存放 InnoDB 数据的文件,之所以有两种文件形式存放 InnoDB 的数据,是因为 InnoDB 的数据存储方式能够通过配置来决定是使用共享表空间存放存储数据,还是用独享表空间存放存储数据。.ibd
文件,并且每个表一个 .ibd
文件.ibdata
文件,所有表共同使用一个 .ibdata
文件(或多个,可自己配置)-- 查看支持的存储引擎show engines;-- 查看默认存储引擎show variables like '%storage_engine%';--查看具体某一个表所使用的存储引擎,这个默认存储引擎被修改了!show create table <table_name>;--准确查看某个数据库中的某一表所使用的存储引擎show table status like '%table_name%'show table status from database where name="%table_name%"
-- 建表时指定存储引擎。默认的就是 INNODB,不需要设置create table t1 (i int) engine = InnoDB;create table t2 (i int) engine = CSV;create table t3 (i int) engine = MEMORY;-- 修改存储引擎alter table %table_name% engine = InnoDB;-- 修改默认存储引擎,也可以在配置文件 my.cnf 中修改默认引擎set default_storage_engine=NDBCLUSTER;
默认情况下,每当 CREATE TABLE
或 ALTER TABLE
不能使用默认存储引擎时,都会生成一个警告。为了防止在所需的引擎不可用时出现令人困惑的意外行为,可以启用 NO_ENGINE_SUBSTITUTION SQL
模式。如果所需的引擎不可用,则此设置将产生错误而不是警告,并且不会创建或更改表