1.数据库设计的必要性:
数据库设计的三大范式:
1NF: 所有的域都应该是原子性的 (字段值不可再分 eg:详细地址分为省市区等多列,应该定义省市区三个字段,而不是详细地址字段)
2NF:所有的非主键字段必须与主键字段相关;不能与主键的部分相关(联合主键) -> 一张表描述一类事务
3NF:非主键字段必须与主键直接相关,而不能间接相关。 -> 依赖不能传递
扩展:
模糊查询影响查询效率
有时候为了性能需要违反三大范式(虽然增加了冗余,但是提升了性能)
2.E-R图
1) 数据库设计几大阶段
需求分析阶段
概念设计阶段
逻辑设计阶段
物理设计阶段
数据库实施阶段
运行和维护阶段
2) E-R图
菱形:表示实体与实体之间的联系
矩形:实体
连线:实体与实体之间的对应关系 1对多 多对多
3) 数据库表设计
一对一:
方式一:外键添加唯一约束
方式二:主键作为外键
一对多或者多对一:
在多的一方添加外键
多对多:
创建一张关系表(两个字段都是外键),并设置联合主键(保证实体完整性)
3.数据库优化: 可使用explain查看修改SQL
-
先筛选在join
-
join 优于子查询(sql层级越深效率越低)
-
order by (io瓶颈,CPU占用)
-
尽量走索引(索引失效状况)
-
尽量不要使用select * (避免全列扫描)
具体使用:在查询时,不要使用select *
*是通配符,使用了他,会查询该表所有的字段,然后继续剩余操作。
误区:
查询是以记录为单位,查询一个字段,或者两个字段,没什么区别,查询较少的字段不一定不多的性能好。
count(*),count(1)统计记录数 count(pk)统计字段数
含义不同,但是结果一致。
count(1)和count(pk)不是在所有的情况下都优于count(*)的
索引失效的状况:
1.索引列不能使用null,not null,!=,<> 即否定比较
2.索引列不要参与计算 四则运算,substr等 例如索引列sal: sal/10>100可以替换成sal >100*10
3.索引列不要使用
包含
namel ike ‘%L%’ 尽量不要使用模糊查询,会导致全表扫面4.不要使用
or
(使用union 与union all替换,union all不会去重,所以性能比union好些)