MySQL引擎
1、引擎分类
1.1 InnoDB
是系统的默认引擎,是一个事务型的存储引擎,有行级锁定和外键约束。
1.2 MyISAM
没有提供对数据库事务的支持,也不支持行级锁和外键,因此当INSERT(插入)或UPDATE(更新)数据时即写操作需要锁定整个表,效率便会低一些。
1.3 Archive
档案存储引擎只支持INSERT和SELECT操作,适合日志和数据采集类应用,占空间小。
1.4 Blackhole
不保存数据;
1.5 CSV
可以将普通的CSV文件作为MySQL表处理,但不支持索引;
可以作为一种数据交换的机制,非常有用。
1.6 Memory、Merge、Federated(略)
2、InnoDB和MyISAM的对比
MyISAM | InnoDB | |
外键 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
行/表锁 |
表锁,即使操作一条记录也会锁住整个表,不适合高并发操作 |
行锁,操作时只锁一行,不对其他行有影响,适合高并发的操作 |
缓存 | 只缓存索引,不缓存真实数据 | 不仅缓存索引还缓存真实数据,对内存要求较高,而且内存大小队性能有决定性影响 |
关注 | 节省资源、消耗少,简单业务 | 并发写、事务、更大资源 |
3、事务(Transaction)
3.1 为什么需要事务?
为保持数据的一致性。
例如A给B转1000,这是一个操作,数据库层面A会执行 -1000,B也要执行+1000;两个sql操作一个没成功就会让数据变得异常,会导致后续的一系列问题。
3.2 事务的ACID原则
原子性(atomicity):
一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性(consistency):
在事务开始之前和事务结束之后数据库中数据的完整性没有被破坏,(比如:A向B转账,不可能A扣了钱,B却没有收到);
隔离性(isolation):
一个事务的执行不被其他事务影响;
持久性(durability):
事务一旦提交,无论系统发生什么问题,结果都不会被影响;
4、为什么InnoDB必须有主键,并且推荐使用整型的自增主键
因为InnoDB的底层数据结构是B+Tree,必须需要一个主键才可以组织起来(主键值去做节点数据,表数据存储在叶子节点)。如果表没有设置主键,则Mysql会自动的帮你找到一个合适的唯一索引作为主键,若找不到符合条件唯一索引条件的字段时,会生成类似于ROW_ID的虚拟列充当该InnoDB表的主键;
整型的存储比字段类型要小,对比效率是高于其他数据结构的,字符串等。
自增的话每次新增的索引就是有序的,只需要在最右边的数据中插入新的数据即可。插入的时候效率更高。