MySQL存储引擎——针对实习面试
目录
- MySQL支持哪些存储引擎?
- MySQL存储引擎架构了解嘛?
- MyISAM和InnoDB有什么区别?
- MyISAM和InnoDB如何选择?
- 如何查看表的存储引擎?
- 如何修改表的存储引擎?
MySQL支持哪些存储引擎?
MySQL支持多种存储引擎,包括InnoDB、MyISAM、MEMORY、ARCHIVE、BLACKHOLE、FEDERATED、NDB Cluster等。
其中,InnoDB是默认的存储引擎(在所有引擎中只有它是事务性存储引擎),从MySQL 5.5.5版本开始,MySQL之前用的是MyISAM。
MySQL存储引擎架构了解嘛?
MySQL的存储引擎架构是基于插件式的,这意味着MySQL核心服务器与存储引擎之间通过定义良好的接口进行通信。这种架构允许不同的存储引擎与MySQL服务器一起工作,而无需对核心服务器代码进行修改。以下是MySQL存储引擎架构的一些关键点(了解就行,主要背上面的文字):
-
插件式架构:
- MySQL的存储引擎作为插件被加载到MySQL服务器中。
- 用户可以根据需要选择不同的存储引擎,例如InnoDB、MyISAM等。
-
接口定义:
- 存储引擎必须实现一组由MySQL定义的手写接口(handler interface),这些接口包括数据的CRUD操作(创建、读取、更新、删除)以及事务处理等。
- 这些接口确保存储引擎能够与MySQL服务器正确交互。
-
数据和索引管理:
- 存储引擎负责管理数据和索引的存储方式。
- InnoDB存储引擎将数据和索引存储在同一个文件中,而MyISAM将数据和索引存储在不同的文件中。
-
事务处理:
- 事务性存储引擎(如InnoDB)提供事务支持,包括事务的开始、提交和回滚。
- 非事务性存储引擎(如MyISAM)不支持事务。
-
锁管理:
- 存储引擎负责实现锁机制,以控制并发访问。
- InnoDB支持行级锁,而MyISAM支持表级锁。
-
崩溃恢复:
- 事务性存储引擎通常具有崩溃恢复机制,以确保数据库在发生故障后能够恢复到一致的状态。
- InnoDB使用redo日志和undo日志来实现这一点。
-
存储格式:
- 存储引擎决定数据的物理存储格式。
- 例如,InnoDB使用B+树作为索引结构,而MyISAM使用B树。
-
内存管理:
- 存储引擎可能有自己的内存缓冲区,用于缓存数据和索引,以提高访问速度。
-
存储引擎的切换:
- 用户可以在创建表或修改表时指定存储引擎。
- 例如,
CREATE TABLE my_table ENGINE=InnoDB;
或ALTER TABLE my_table ENGINE=InnoDB;
。
-
存储引擎的扩展性:
- 用户可以根据自己的需求开发新的存储引擎,并将其作为插件加载到MySQL服务器中。
MySQL的存储引擎架构提供了高度的灵活性和可扩展性,使得MySQL能够适应不同的应用场景和性能需求。
MyISAM和InnoDB有什么区别?
-
事务支持:InnoDB支持事务处理(ACID兼容),而MyISAM不支持
-
锁机制:InnoDB支持行级锁定,而MyISAM只支持表级锁定
-
外键约束:InnoDB支持外键约束,而MyISAM不支持
-
崩溃恢复:InnoDB具有强大的崩溃恢复能力,使用预写式日志(Write-Ahead Logging, WAL)策略来确保数据的持久性,而MyISAM的崩溃恢复能力相对较弱
-
性能特点:MyISAM在读取操作方面通常比InnoDB更快,特别是在读取大量数据时。然而,InnoDB在写入操作、事务处理和并发控制方面表现更优
关键背对照表
MyISAM | InnoDB | |
---|---|---|
事务支持 | 不支持 | 支持 |
锁机制 | 只支持表级锁定 | 支持行级锁定 |
外键约束 | 不支持 | 支持 |
崩溃恢复 | 相对较弱 | 强大,使用预写式日志策略 |
性能特点 | 读取操作更快 | 写入操作、事务处理、并发控制表现更优 |
MyISAM和InnoDB如何选择?
大部分情况下我们都用InnoDB存储引擎(在日常开发的情况下,真的找不到什么情况用MyISAM)
如何查看表的存储引擎?
可以使用以下两种方法查看MySQL中表的存储引擎:
- 使用SQL查询:
SHOW TABLE STATUS FROM database_name LIKE 'table_name';
或
SHOW CREATE TABLE table_name;
- 使用MySQL命令行工具,连接到MySQL服务器后,使用SHOW TABLE STATUS命令来查看所有表的存储引擎
如何修改表的存储引擎?
要修改MySQL中表的存储引擎,可以使用ALTER TABLE语句。
例如,将名为table_name的表的存储引擎修改为InnoDB,可以使用以下命令:
ALTER TABLE table_name ENGINE=InnoDB;