20240229-mysql
MySQL的锁: 1.共享锁:多个事务可以共享,用于读取数据不修改。 2.排他锁:针对写操作,只能有一个事务能获取 3.行锁:针对某一行进行上锁,提高并发性能,MySQL中innodb默认行级锁 4.表锁:锁住整个表,性能低 5.自增锁:保证自增列的唯一 6.意向锁:协调行级锁和表锁之间关系,指示一个事务将要在哪个表中进行怎样的操作
数据库三大范式: 1.字段是最小单元,不可再进行分割、且不会重复,体现原子性。 2.在1的基础上,有一个主键,其他非主属性全部依赖主键 3.在2的基础上,非主属性之间不能有依赖传递关系
MySQL索引在结构上分:聚集索引,非聚集索引。 聚集索引的顺序和索引顺序一致,也可以叫主键索引,由数据库自己创建。 非聚集索引:顺序不一样
在应用上分为: 普通索引:没什么限制,就是为了提高查询速度 唯一索引:不能重复,可以为null值 主键索引:也叫聚集索引上面讲了 组合索引:可以多个列一起,遵守从左匹配规则 全文索引:MyISAM引擎特有,char,varchar,text才能用 索引的优点:变得更快 索引的缺点:占空间,创建索引也要时间
索引设计原则: 1.查询条件字段做索引 2.排序字段,group分组字段,union联合字段,distinct去重字段建索引 3.限制索引数目 4.小表不建议加索引 5.尽量使用数据量少的索引 6.删除不再使用的索引
索引的数据结构:Hash和B+树
MyISAM 和 InnoDB 的区别? 1.InnoDB支持事务,支持外键,是聚集索引,不保存表总行数(因为事务原因不保存表行数),可以表锁,行锁。必须有唯一索引(如主键)如果没有会生成一个隐藏列来当 2.MyISAM都不支持,是非聚集索引,保存了总行数,只有表锁,可以不用主键
InnoDB 的四大特性? 插入缓冲insert buffer) 二次写(double write) 自适应哈希索引(ahi) 预读(read ahead)
InnoDB 为何推荐使用自增主键? 因为这样B+树会很舒服
如何选择存储引擎? 默认使用 InnoDB,MyISAM 适用以插入为主的程序,比如博客系统、新闻门户。
数据库事务:要么成功,要么失败全部回滚。 四大特性ACID: 原子性:事务已是最小执行单元,不可拆分,只有成功和失败 隔离性:事务之间互不影响 一致性:事务前后数据保持一致 持久性:事务提交了,数据改变了是持久的
并发问题:脏读,不可重复读、幻读
事务隔离级别:读未提交,读已提交,可重复读,串行化
索引失效情况: 1.使用 or 2.like % 无效,like 前缀无% 后缀有% 索引有效 3.联合索引 4.MySQL自动优化 5.not <> !=