一、定义
数据库管理系统DBMS使用数据引擎进行创建、查询、更新和删除数据,mysql的核心是存储引擎;一个数据库上支持不同的数据存储引擎,不同的存储引擎提供了不同的存储机制、索引技巧等还有自己特定的功能;同时一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求。
二、存储引擎的分类
1.INNODB存储引擎,支持事务处理,支持外键,支持崩溃修复和更新,删除、
如果需要对事务的完整性要求高,并且要实现并发控制,选择这个
2.MyISAM,拥有较高的插入查询速度,但是不支持事务,如果表主要是用于插入新纪录、读出记录,适用应用的完整性、并发性要求比较低;
3. MEMEMORY,将表中的数据存储到内存中而不是磁盘内,这个特性是个双刃剑,所以一方面数据的处理速度很快,另一方面它安全性不高,并且只能使用在相对较小的数据库表;
功能对比:
三、如何查看当前数据库管理系统支持什么类型的存储引擎?
mysql> show engines;
Support字段:yes表示支持的存储引擎,default表示默认使用的引擎;
四、如何选择存储引擎?
如果要提供提交、回滚、崩溃恢复能力的事物安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个好的选择;
如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率
如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎;MySQL中使用该引擎作为临时表,存放查询的中间结果;
如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的,Archive非常适合存储归档数据,如记录日志信息可以使用Archive
🌈总结:
使用哪一种引擎需要灵活选择,一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求,使用合适的存储引擎,将会提高整个数据库的性能
五、如何指定引擎
1.先查看数据库支持的引擎类型
mysql> show engines;
2.创建表的时候进行引擎的指定
mysql>create table student1(
id int,
name varchar(50))
engine=innodb;
3.对表的引擎进行修改
mysql>alter table student2 engine=innodb
六、MySQL事务
• 事务处理用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行(原子性)
• 事务用来管理 insert,update,delete/drop 语句等操纵语句
一般来说,事务必须满足4个条件(ACID):
原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)
原子性:一个事务中的所有操作,要么全部完后,要么全部不完成,如果执行中发生错误,会被回滚到原始化状态;
一致性:保障数据的完整性
隔离性:数据库可以同时并发好几个事务,隔离性可以防止多个事务并发导致数据不一致,保证互不影响
持久性:事务处理结束后,对数据的修改是永久的,系统故障也不会丢失
七、MySQL事务
场景:查询统计和备份数据时,需要先加锁,这样可以让我们对数据进行统计查询和备份时候,没有新的数据产生,用来保证数据的准确性;
分类:
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
案例:
有一个订单表orders,其中记录有订单的总金额total,同时还有一个订单明细表order_detail,其中记录有订单每一产品的金额小计subtotal,假设我们需要检查这两个表的金额合计是否相等,可能就需要执行如下两条SQL:
SELECT SUM(total) FROM orders;
SELECT SUM(subtotal) FROM order_detail;
这时,如果不先给这两个表加锁,就可能产生错误的结果,因为第一条语句执行过程中order_detail表可能已经发生了改变。因此,正确的方法应该是:
LOCK tables orders read local,order_detail read local;
SELECT SUM(total) FROM orders;
SELECT SUM(subtotal) FROM order_detail;
Unlock tables;
上面的例子在LOCK TABLES时加了‘local’选项,其作用就是在满足MyISAM表并发插入条件的情况下,允许其他用户在表尾插入记录
八、外键
在实际开发的项目中,一个健壮数据库中的数据一定有很好的参照完整性。
外键是指引用另外一个表中的一列或多列数据,被引用的列应该具有主键约束或者唯一性约束。外键用来建立和加强两个表数据之间的连接。
案例:学生档案和成绩单两张表,如果成绩单中有张三的成绩,学生档案中张三的档案却被删除了,这样就会产生垃圾数据或者错误数据。为了保证数据的完整性,将两张表之间的数据建立关系,因此就需要在成绩表中添加外键约束。