事务
- a原子性,要么全部,成功不成功就全部回滚
- c一致性,事务执行前与事务执行后保持一致
- i隔离性,单独事务数据不串,多个事务并发时,每个事务隔离
- d持久性,事务成功被提交,就算遇见其他问题,事务处理的数据,是永久有效的
事务隔离
- mysql事务的默认隔离是重复读
- 未提交读-- 事务 还未完全提交成功,提交部分中止,就已经读到数据,出现脏读
- 提交读-- 多个事务不能同时来,一个事务要等另一个事务完成提交后才能读取数据
- 重复读--事务在开启读取数据的时候,不能修改操作数据
- 系列化--是事务隔离的最高级别,事务串化性执行数据,可以避免脏读,幻读,重复读,但是这种隔离效率低下,很耗数据库性能,不推荐使用
事务并发可能遇见的问题
- 脏读--一个事务 处理过程中读取了另外一个未提交事务的数据
- 幻读--一般是insert操作
- 不可重复读--一般是update操作,事务读的过程中被另外一个事务update
mysql引擎
myisam
不支持事务,不支持外键,只支持表级锁,优点是查询速度速度快,主要用于insert,select操作比较多的表
支持3种不同的存储格式,分别是:静态表;动态表;压缩表
innodb
支持事务,支持行级锁,行级锁可大大提升并发时候事务处理的速度,提供了具有提交、回滚和崩溃恢复能力的事务安全,查询速度慢
原博地址:https://github.com/xianyunyh/PHP-Interview/blob/master/Mysql/%E5%AD%98%E5%82%A8%E5%BC%95%E6%93%8E.md
数据库优化
-- 查询sql优化,少用子查询,尽量join;少用like;分页查询limit;需要什么字段查什么字段,少用select *;拆分大的insert.delete;
-- 善用索引,在group by ,orderby,where, on这些字段建索引,加快查询速度;在数据类型小的字段加索引;
-- 表结构的数据类型选择,多用not null,尽量避免null数据;根据数据选择最适用的数据类型;使用合理的定长数据类型,固定长度的会节约资源,查询的时候快一点,多使用char.enum,而不是varchar
-- 使用命令分析:explain分析sql,查看数据库慢查询速度 show status like 'slow_queries','connections','com_select','uptime',
-- 分库分区分表,主从哭,读写分离
分表:垂直分表,针对表列数比较多的表,将常用与不常用的字段列分开,数据大的独立出来
水平分表, 表结构一致,可以通过加日期后缀来存储不同时期的数据,服务端使用数据的时候,通过当前业务情况来操作使用那张表。也可以通过数据的不同类型分表,按板块结构分表