MySql常见问题描述
1 数据库的三范式是什么
第一范式:列不可再分
第二范式:行可以唯一区分,主键约束
第三范式:表的非主属性不能依赖与其他表的非主属性 外键约束
且三大范式是一级一级依赖的,第二范式建立在第一范式上,第三范式建立第一第二范式上。
2 数据库的事务
什么是事务?: 多条sql语句,要么全部成功,要么全部失败。
数据库事务特性ACID:原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)、持久性(Durabiliy)。
原子性Atomic:组成一个事务的多个数据库操作是一个不可分割的原子单元,只有所有操作都成功,整个事务才会提交。任何一个操作失败,已经执行的任何操作都必须撤销,让数据库返回初始状态。
一致性:事务操作成功后,数据库所处的状态和它的业务规则是一致的。即数据不会被破坏。如A转账100元给B,不管操作是否成功,A和B的账户总额是不变的。
隔离性:在并发数据操作时,不同的事务拥有各自的数据空间,它们的操作不会对彼此产生干扰
持久性:一旦事务提交成功,事务中的所有操作都必须持久化到数据库中。
3、索引问题
主键索引(PRIMARY) 数据列不允许重复,不允许为NULL,一个表只能有一个主键。
唯一索引(UNIQUE)数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。
普通索引(INDEX)
全文索引(FULLTEXT)
4 SQL优化
查询语句中不要使用select *
尽量减少子查询,使用关联查询(left join,right join,inner join)替代
减少使用IN或者NOT IN ,使用exists,not exists或者关联查询语句替代
or 的查询尽量用 union或者union all 代替(在确认没有重复数据或者不用剔除重复数据时,union all会更好)
应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0。
5 大表如何优化
限定数据的范围,务必禁止不带任何限制数据范围条件的查询语句。比如:我们当用户在查询订单历史的时候,我们可以读/写分离
垂直分区
水平分区