1.三范式
1nf: 单列属性不可再分
2nf: 每个字段依赖于全部主键而非部分主键(对于非组合主键来说, 主要满足1nf就满足2nf)
3nf: 消除传递依赖, 非主键以外的字段要互不依赖
2.视图
视图不存数据, 数据还是存在表里, 只是方便程序员, 不提高查询效率
3.drop、delete与truncate
drop和truncate都是ddl, 不能回滚, drop删表结构, truncate只删数据
drop是dml, 可回滚
速度上drop> truncate > delete
4.索引是什么
加快数据库的检索速度, 降低了插入、删除、修改等维护任务的速度(要更新索引), 要占空间
经常select, 而且数据量大 => 建索引
经常update, insert, delete, 数据量小 => 不建索引
- 唯一索引:唯一索引不允许两行具有相同的索引值
- 主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的,并且不能为空
- 聚集索引(Clustered):表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个
- 非聚集索引(Non-clustered):非聚集索引指定表的逻辑顺序。数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针。可以有多个,小于249个
5.事务的ACID
原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
4个隔离级别:
- Serializable【可避免脏读,不可重复读,虚读】
- Repeatable read【可避免脏读,不可重复读】
- Read committed【可避免脏读】
- Read uncommitted【级别最低,什么都避免不了】
脏读:一个事务读取到另外一个事务未提交的数据
不可重复读:一个事务读取到另外一个事务已经提交的数据,也就是说一个事务可以看到其他事务所做的修改
6. select* 和limit
为什么select*慢
1.经常会有一些不需要的字段
2.用select*如果表的schema改了数据会乱
InnoDB为什么limit的offset大了之后, 效率会很低
因为InnoDB如果通过二级索引(辅助索引)去查找, 会先找到主键, 再根据主键索引查找数据行, 多一步找主键的过程;
如何优化limit的速度:
因为select先找主键, 再找数据, 所以优化方法就是, 在查询的时候, 使用inner join来找到主键, 然后再用limit, 这样就不用找主键了
mysql> select a.* from member as a inner join (select id from member where gender=1 limit 300000,1) as b on a.id=b.id;