MySQL篇01-为什么MySQL默认引擎为Innodb
✅前言
在学学习MySQL时同学们可能会有疑问,MySQL引擎是什么东西?这些引擎有什么用途和区别?我要怎么选择这些引擎?接下来我将让大家明白为什么innodb是默认引擎。
✅引擎分类
| 引擎 | 特点 |
|---|---|
| InnoDB | ACID事物,行极锁,外键,崩溃恢复 |
| MyISAM | 全文索引,扫描效率高,表记锁定,压缩存储 |
| Memory | 基于内存存储,数据易丢失 |
✅引擎对比
📍InnoDB和MyISAM
对于这两个引擎我们都可能会用到,只不过使用的场景不同,innodb一般用于多查询的表,
Myisam一般用于多增改的表。
innodb支持事物管理,而Myisam则不支持事物管理。这是一个很重要的因素,试想一下一个人在银行进行存钱,他刚把钱存入机器,但是银行系统出现了bug,导致他的账户上的资金没有变化。这是一个很严重的问题,所以我们需要事物管理来接解决这个问题。
而且innodb的索引设计和锁结构都要优于Myisam,再加上现在技术的不断发展innodb的增改删操作速度也不断加快,导致Myisam的优势再度变小,最终在Mysql5.5版本后innodb成为了默认引擎。
📍InnoDB和Memory
对于Memory而言是基于内存存储的引擎,这使得Memory查询速度十分迅速就像坐火箭一样。但是他有个致命弱点就是就是数据不会持久化。MySQL 服务重启后,所有数据都将丢失。我们数据库是保存数据的地方,如果连数据都会丢失,那还要数据库干嘛,直接用txt文件存不更方便,反正都可能会丢失。而且对于Memory这样快查询的特点,我们有跟好的选择——Redis。也就是因为种种原因导致Memory在开发中基本很少使用
✅ InnoDB引擎的优点
📌1.支持事务
- InnoDB 支持 ACID(原子性、一致性、隔离性、持久性)事务,这意味着它能够保证数据库操作的完整性,即使在发生系统崩溃或其他异常情况下。事务支持使得数据的操作变得更加可靠。
原子性:要么全部成功,要么全部失败。一致性:事务完成后,数据库总是处于一致的状态。隔离性:事务之间相互独立,不会互相影响。持久性:事务一旦提交,其结果是永久保存的。
- 📌2.支持外键约束
- InnoDB 支持 外键约束,这允许在数据库表之间建立关系,确保数据的完整性和一致性。外键约束能够确保:
外键列的值在引用表中必须存在。防止删除或更新父表中的行时破坏子表的数据完整性。其他存储引擎(如 MyISAM)不支持外键,因此对于需要建立关系型数据模型的应用,InnoDB 是更好的选择。
- InnoDB 支持 外键约束,这允许在数据库表之间建立关系,确保数据的完整性和一致性。外键约束能够确保:
- 📌 3.行级锁定
- InnoDB 支持 行级锁定(而不是表级锁定),这意味着它可以在多个并发操作之间提供更细粒度的锁定,从而提高数据库的并发性能。当多个用户同时更新不同的行时,InnoDB 只会锁定被修改的行,而不会锁定整个表,从而提高了并发性。
这种行级锁定在高并发的环境下尤其重要,可以大大减少锁竞争,提高效率。
- InnoDB 支持 行级锁定(而不是表级锁定),这意味着它可以在多个并发操作之间提供更细粒度的锁定,从而提高数据库的并发性能。当多个用户同时更新不同的行时,InnoDB 只会锁定被修改的行,而不会锁定整个表,从而提高了并发性。
- 📌4.崩溃回复能力
- InnoDB 使用了 日志文件 和 重做日志,它能够在数据库崩溃后进行数据恢复。这意味着即使在系统异常关闭或崩溃后,InnoDB 也能确保数据的完整性和一致性,不会丢失已提交的事务。
这对于需要高可用性的系统非常重要。
- InnoDB 使用了 日志文件 和 重做日志,它能够在数据库崩溃后进行数据恢复。这意味着即使在系统异常关闭或崩溃后,InnoDB 也能确保数据的完整性和一致性,不会丢失已提交的事务。
- 📌5.索引性能优化
- InnoDB 提供了 B+ 树索引(适用于主键、唯一索引和普通索引),这使得它在查询性能上非常强大,尤其是对于需要高效检索的查询场景。它还能自动为索引创建和更新最优执行计划,以提高查询性能。
- 📌6.支持大数据量
- InnoDB 设计上支持非常大的表和数据量,并且能在处理大量数据时保持较好的性能。它能够优化存储空间和查询效率,适合需要存储大量数据的应用。
✅实例演示
📌创建表并使用InnoDB引擎
createtableuser(idintprimarykeyauto_increment,usernamevarchar(30)notnull,emailvarchar(100)notnull,ageint)engine=innodb;createtableorders(idINTPRIMARYKEYAUTO_INCREMENT,user_idINTNOTNULL,order_dateDATETIMEDEFAULTCURRENT_TIMESTAMP,totalDECIMAL(10,2)NOTNULL)engine=innodb;📌在创建表的 ‘)’ 后添加engine关键词即可指定这个表所依赖的引擎
使用事务像表中添加数据
BEGINTRANSACTION;INSERTINTOusers(username,email,age)VALUES('张三','zhangsan@example.com',25);INSERTINTOorders(user_id,order_date,total)VALUES(LAST_INSERT_ID(),NOW(),199.99);-- 如果一切顺利,提交事务COMMIT;如果在向users添加完数据后,系统异常orders没有添加数据,则事务回滚users中的数据也添加失败
📌插入数据并处理错误
BEGINTRANSACTION;BEGINTRYINSERTINTOproducts(product_name,price)VALUES('新产品',50.00);-- 这里做一些可能会失败的操作,例如违反唯一约束INSERTINTOproducts(product_name,price)VALUES('新产品',50.00);-- 可能会引发唯一约束错误COMMIT;-- 如果没有错误,提交事务ENDTRYBEGINCATCHROLLBACK;-- 如果发生错误,回滚事务-- 你可以选择打印错误消息PRINT'事务回滚: '+ERROR_MESSAGE();ENDCATCH;🎯总结
在MySQL5.5后成为默认引擎原因如下
| 原因 | 解释 |
|---|---|
| ✅支持事务 | 保证数据库操作的完整性 |
| ✅行级锁定 | 减少锁竞争,提高效率 |
| ✅崩溃恢复 | 在系统崩溃后也能找会数据 |
| ✅支持和社区支持 | Oracle 主导 MySQL 后推进企业级增强 |
| ✅支持大数据量 | 适合需要存储大量数据的应用 |
