什么是MySQL存储引擎?( 二 )


当一个事务在某行上获得共享锁,而另一个事务需要相同的锁类型时,立即授予;但是,如果第二个事务在同一行上请求排他锁,它将不得不等待 。
如果第一个事务持有该行的排他锁,则第二个事务将不得不等待该锁被释放以获得共享锁或排他锁 。
外键支持外键是一个非常重要的特性,因为它们可用于基于表之间的逻辑关系来强制执行数据完整性 。想象一下,我们的数据库中有三个表(假设它被称为“testdb”):一个user包含现有用户的job表,一个注册所有可用作业的user_job表,以及一个用于表示用户和用户之间存在的多对多关系的表 。作业(一个用户可以有多个作业,多个作业可以与同一个用户关联) 。
该user_job表就是所谓的连接表或关联表,因为它的唯一目的是表示用户-工作关联 。该表有两列,一个叫user_id和其他job id 。表中会存在两个外键约束,强制执行以下规则:user_id列中的值只能引用表id列中的值,列中的user值job_id必须引用表id列中的现有值job.
这将强制执行完整性,因为仅允许现有用户和作业的 ID 存在于关联表中 。删除涉及表中一个或多个关联的用户或作业user_job也是不允许的,除非为相应的外键设置了CASCADE DELETE规则 。在这种情况下,当删除用户或作业时,它们所涉及的关系也将被删除 。
我的ISAMMyISAM 曾经是默认的 MySQL 存储引擎,但已被 InnoDB 取代 。使用此引擎时,数据锁定发生在表级别,因此执行操作时锁定的数据更多 。
与 InnoDB 不同,MyISAM 不支持事务回滚和提交,因此必须手动执行回滚 。MyISAM 和 InnoDB 之间的另一个很大区别是前者不支持外键 。MyISAM 更简单,并且在对有限数据集进行读取密集型操作时可能具有优势(有争议) 。
在表上使用 MyISAM 时,会设置一个标志,指示该表是否需要修复,例如在突然关闭之后 。稍后可以使用适当的工具执行表修复 。
检查特定表使用的存储引擎如何知道特定表使用了什么存储引擎?我们所要做的就是发出一个简单的查询 。
例如,要知道user我们在前面的例子中提到的表使用了什么存储引擎,我们将运行:
mysql> SHOW TABLE STATUS WHERE name = 'user' G;注意上面的查询我们使用了G,为了让查询结果垂直显示,优化空间 。执行查询后,我们将获得以下结果:
*************************** 1. row ***************************Name: userEngine: InnoDBVersion: 10Row_format: DynamicRows: 0 Avg_row_length: 0Data_length: 16384Max_data_length: 0Index_length: 0Data_free: 0 Auto_increment: NULLCreate_time: 2021-12-27 09:38:16Update_time: NULLCheck_time: NULLCollation: utf8mb4_0900_ai_ciChecksum: NULL Create_options:Comment:1 row in set (0.00 sec)在这种情况下,通过查看“Engine”列中存储的值,我们可以清楚地看到该表使用的是“InnoDB”引擎 。获取相同信息的另一种方法是INFORMATION_SCHEMA.TABLES直接查询表:
mysql> SELECT ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'user' AND TABLE_SCHEMA = 'testdb';上面的查询将只返回表使用的引擎:
+--------+| ENGINE |+--------+| InnoDB |+--------+如果我们稍微更改查询,我们可以获得数据库中所有表名的列表以及它们使用的引擎:
mysql> SELECT TABLE_NAME, ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'testdb';设置和更改表使用的存储引擎如果我们要为一个表设置一个特定的存储引擎,我们可以在创建时指定它 。例如,假设我们正在创建job表,并且出于某种原因我们想要使用 MyISAM 存储引擎 。我们将发出以下 SQL 查询:
mysql> CREATE TABLE testdb.job ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20) NOT NULL ) ENGINE = MyISAM;【什么是MySQL存储引擎?】相反,如果我们想要更改用于已存在表的存储引擎,我们只需要使用ALTERSQL 语句 。假设我们要将上一个示例中创建的“job”表所使用的存储引擎更改为 InnoDB;我们会运行:
mysql> ALTER TABLE testdb.job ENGINE = InnoDB;结论在本教程中,我们学习了什么是数据库存储引擎,并且我们看到了两个最常用的 MySQL 引擎的主要特性:InnoDB 和 MyISAM 。
我们看到了如何检查哪些引擎可用、哪些引擎用于表以及如何使用 SQL 查询设置和修改表引擎 。




推荐阅读