1. 存储引擎的概念
存储引擎是MYSQL数据库的组件,负责执行时间的数据I/O操作(数据的存储和提取),工作在文件系统之上,数据库的数据会先传到存储引擎,再按照存储引擎的存储格式保存到文件系统。
(常用的存储引擎: InnoDB MyISAM)
2. MyISAM 与 InnoDB 的区别
MyISAM : 不支持事务、外键约束,只支持表级锁定,适合单独的查询和插入的操作,读写会相互阻塞,支持全文索引,硬件资源占用较小,数据文件和索引文件是分开存储的。(存储成三个文件:表结构文件 .frm 数据文件.MYD 索引文件 .MYI)
使用场景:适用于不需要事务支持,单独的查询或插入数据的业务场景。
InnoDB : 支持事务,外键约束,支持行级锁定(在全表扫描时仍然会表级锁定),读写并发能力较好,支持全文索引(5.5版本之后),缓存能力较好可以减少磁盘IO压力,数据文件也是索引文件。(存储成两个文件:表结构文件 .frm 数据文件 .ibd)
使用场景:适用于需要事务的支持,一致性要求较高,数据会频繁更新,读写并发高的业务场景。
3. 查看表的存储引擎
show create table 表名
show table status [from 库名] where name ='表名' \G
show engines 查看当前当前系统支持的存储引擎
alter table 表名 engine=InnoDB/MYISAM 针对已存在的表修改存储引擎
create table 表名 (....) engine=InnoDB/MyISAM; 新建表时指定存储引擎
修改表的默认存储结构
vim /etc/my.cnf
[mysqld]
default-storage-engine=InnoDB/MyISAM 设置新建表的默认存储引擎。
4. 死锁的概念
死锁是指两个或多个事务在同一个资源上相互占用,并请求对方的锁定资源,从而导致恶性循环的现象。
5. 如何避免死锁?
1. 设置事务超时等待时间 innodb_lock_wait_timrout
2. 设置开启死锁检测 innodb_dead lock_detect
3. 使用更合理的业务逻辑
4. 尽量保持事务简短
5. 为表添加合理的索引,减少死锁发生的概率
6. 如果业务允许,可以降低隔离级别,比如采用提交读
7. 建议开发人员在读多写少的场景下使用乐观锁机制。