MYSQL 的 MyISAM 和 InnoDB 的困惑

本文介绍如何通过更改MySQL的存储引擎从MyISAM到InnoDB来解决JPA生成数据表时无法创建外键索引的问题。同时对比了MyISAM与InnoDB在事务支持、并发控制、性能等方面的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天用JPA生成数据表,虽然在Entity上已经配置好了一对多和多对一的关系,总是奇怪不能生成外键索引。

后来发现是MySQL的 storage engine 的问题。

默认的MyISAM是不支持外键的。

只有改成 InnoDB才支持外键

修改方法,找到 my.ini(在Linux中是my.cnf)在里面添加或修改(如果有的话)


default-storage-engine = InnoDB

附:

MyISAM和InnoDB的区别

存储引擎各自的一些特点

上面提到的四种存储引擎都有各自适用的环境,这取决于它们独有的一些特征。主要体现在性能、事务、并发控制、参照完整性、缓存、 故障恢复,备份及回存等几个方面


目前比较普及的存储引擎是MyISAM和InnoDB.而MyISAM又是绝大部分Web应用的首选。MyISAM与InnoDB的主要的不同点在于性能和事务控制上。

MyISAM是早期ISAM(Indexed Sequential Access Method,我现在用的MySQL5.0已经不支持ISAM了)的扩展实现,ISAM被设计为适合处理读频率远大于写频率这样一种情况,因此ISAM以及后来的MyISAM都没有考虑对事物的支持,排除了TPM,不需要事务记录,ISAM的查询效率相当可观,而且内存占用很少。MyISAM在继承了这类优点的同时,与时俱进的提供了大量实用的新特性和相关工具。例如考虑到并发控制,提供了表级锁,虽然MyISAM本身不支持容错,但可以通过myisamchk进行故障恢复。而且由于MyISAM是每张表使用各自独立的存储文件(MYD数据文件和MYI索引文件),使得备份及恢复十分方便(拷贝覆盖即可),而且还支持在线恢复。

所以如果你的应用是不需要事务,处理的只是基本的CRUD操作,那么MyISAM是不二选择

InnoDB被设计成适用于高并发读写的情况.使用MVCC(Multi-Version Concurrency Control)以及行级锁来提供遵从ACID的事务支持。InnoDB支持外键参照完整性,具备故障恢复能力。另外 InnoDB的性能其实还是不错的,特别是在处理大数据量的情况下,用官方的话说就是: InnoDB的CPU效率是其他基于磁盘的关系数据库存储引擎所不能比的。不过InnoDB的备份恢复要麻烦一点,除非你使用了4.1以后版本提供的Mulit-tablespace支持,因为InnoDB和MyISAM不同,他的数据文件并不是独立对应于每张表的。而是使用的共享表空间,简单的拷贝覆盖方法对他不适用,必须在停掉MYSQL后对进行数据恢复。使用Per-Table Tablespacesd,使其每张表对应一个独立的表空间文件,则情况要简单很多。

一般来说,如果需要事务支持,并且有较高的并发读写频率,InnoDB是不错的选择。要是并发读写频率不高的话,其实可以考虑BDB,但由于在MySQL5.1及其以后版本中,将不再提供BDB支持。这个选项也就没有了

<think>嗯,用户问的是MySQLMySQL Server的区别。首先,我需要确认这两个术语到底指的是什么。可能用户是刚接触数据库,所以容易混淆这两个词。通常来说,MySQL应该是指整个数据库管理系统,而MySQL Server可能指的是服务器端的组件。但有时候这两个术语会被混用,所以我得仔细理清楚。 首先,MySQL本身是一个开源的关系型数据库管理系统,由Oracle公司维护。它包括客户端工具、服务器端、存储引擎等等。而MySQL Server具体来说,可能指的是服务器端的进程,也就是mysqld,它负责处理数据存储、查询处理、用户连接这些后端任务。 接下来,我需要考虑用户可能的背景。他们可能刚开始学习数据库,或者在设置环境时遇到了这两个术语。用户可能不太清楚安装MySQL时,哪些部分是服务器,哪些是客户端。比如,安装MySQL通常会同时安装服务器客户端工具,但用户可能没有意识到这点。 然后,用户的问题可能源于配置数据库时的困惑,比如在连接数据库时,需要指定服务器地址,这时候MySQL Server就是那个运行在服务器上的实例。而MySQL作为整体,包括了命令行客户端、Workbench等工具。 还要注意区分术语的使用场景。有时候文档或者社区中可能会用MySQL来指代整个系统,而MySQL Server特指服务端。需要确认这一点,避免给出错误的信息。 可能存在的混淆点还包括,用户可能认为MySQL Server是一个完全不同的产品,而实际上它是MySQL的一部分。需要明确说明两者的包含关系,以及各自的功能模块。 另外,使用类比可能会有帮助,比如将MySQL比作一辆汽车,而MySQL Server是引擎部分,客户端是方向盘油门等控制部件。这样用户更容易理解两者的关系。 最后,确保回答简洁明了,避免使用过多技术术语,同时覆盖核心区别:MySQL是整体系统,Server是其中的服务端组件,负责数据处理存储,而客户端用于交互。</think>MySQL **MySQL Server** 通常是同一技术栈的不同组成部分,但在具体语境中可能有细微区别: --- ### **1. MySQL(广义概念)** - **定义**:MySQL 是一个开源的关系型数据库管理系统(RDBMS),由 Oracle 公司维护。 - **包含内容**: - **MySQL Server**(核心服务端,即 `mysqld` 进程) - 客户端工具(如 `mysql` 命令行客户端、`mysqldump` 备份工具等) - 管理工具(如 MySQL Workbench) - 存储引擎(如 InnoDBMyISAM) - 编程接口(如 Connector/J、Connector/Python 等) -- ### **2. MySQL Server(核心服务端)** - **定义**:特指 MySQL 数据库的服务器端程序(`mysqld`),负责处理数据存储、查询执行、用户连接等核心功能。 - **核心职责**: - 管理数据库文件(存储、索引、事务等) - 处理客户端连接请求(如来自应用程序或命令行工具的请求) - 执行 SQL 语句(查询、更新、删除等) - 管理用户权限安全性 -- ### **关键区别** | **对比项** | **MySQL** | **MySQL Server** | |--| | 范围 | 整个数据库生态系统(服务端 + 客户端 + 工具) | 仅服务端程序(`mysqld`) | | 用途 | 泛指整个数据库技术 | 特指运行在服务器上的数据库引擎 | | 安装包 | 包含服务端、客户端工具 | 仅服务端(可能与其他组件捆绑安装) | --- ### **类比理解** - **MySQL** 类似于“一辆汽车”,包含发动机、方向盘、车轮等所有部件。 - **MySQL Server** 类似于“汽车的发动机”,是驱动整个系统的核心。 --- ### **实际场景** - 当你安装 MySQL 时(如通过 `apt-get install mysql-server`),默认会安装 **MySQL Server** 必要的客户端工具。 - 应用程序通过客户端工具(如 JDBC、Python Connector)连接到 **MySQL Server**,执行数据库操作。 希望这个解释能帮你理清概念! 😊
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值