事务的特性:ACID(原子性、一致性、隔离性、持久性)
MyISAM和InnoDB的比较
- MyISAM
- 不支持事务
- 不支持外键
- 不支持行锁,默认为表锁
- InnoDB
- 支持事务操作
- 支持表锁和行锁,利用索引查询是使用行锁
MyISAM:如果应用程序通常以检索为主,只有少量的插入、更新和删除操作,并且对事物的完整性、并发程度不是很高的话,通常建议选择 MyISAM 存储引擎。
InnoDB:如果使用到外键、需要并发程度较高,数据一致性要求较高,那么通常选择 InnoDB 引擎,一般互联网大厂对并发和数据完整性要求较高,所以一般都使用 InnoDB 存储引擎。
事务会造成:脏读、重复读、幻读
事务的隔离机制:
- 读取未提交(Read Uncommited)
- 读取已提交(Read Commited)、解决脏读数据
- 可重复读(Repeatable Read)(数据库默认隔离机制)、解决脏读、重复读
- 串行化(Serializable)、最高的隔离机制、解决脏读、重复读、幻读
数据库索引
普通索引、主键索引、唯一索引、联合索引
聚簇索引:将整行记录放在节点上(主键索引、唯一索引)
非聚簇索引:将索引列记录及主键放在节点上(普通索引、联合索引)
索引失效原因:(最左匹配原则)
- 在索引列上做任何操作(计算、函数、(自动 or 手动)类型转换)
- 在索引列上做范围查询会到时后面索引失效
- 使用不等于(!= 或者<>)的时候 的时候
- 字段的 is not null 和 和 is null
- like 前后模糊匹配(%XXXX不走索引,前面未知,无法进行匹配)
- 使用or可能会到时失效
在优化关联查询时,只有在被驱动表上建立索引才有效!
left join 时,左侧的为驱动表,右侧为被驱动表!
inner join 时,mysql 会自己帮你把小结果集的表选为驱动表。
子查询尽量不要放在被驱动表,有可能使用不到索引;
left join时,尽量让实体表作为被驱动表。