Q1: mysql 的三范式
image.png
- 记录的属性是原子性的,不可再分
我们发现此时的成绩一栏是可以进行拆分的,可以拆分为科目+分数,不符合范式1,修改后:
image.png
image.png
- 记录的属性不可有部分依赖,前提是存在联合主键索引;一般不用联合的主键索引,而是用唯一的主键。
如果我们用学生和班级建立联合索引,则属性科目仅仅与学生有关,而与科目无关,产生了部分依赖。修改为添加为自增主键
student.png score.png
- 属性不依赖其他非主属性
上面我们明显可以看到成绩依赖于科目,而跟主键没有什么关系,所以我们可以请科目及成绩进行拆分
Q2:正确的使用索引
image.png1.前置模糊搜索,数据库引擎会放弃索引,进行全表扫描,而后置查询可以正常使用索引:
应用场景:web端的模糊检索
image.png
image.png
【待考证】负向条件查询不可使用索引:也要看数据范围的哈(> 和 < 要看数据范围)
!=、<>、not in、not exists、not like
image.png
image.png
image.png
image.png
image.png
- 强制类型转换会导致全表扫描
`s_mobile` varchar(20) NOT NULL DEFAULT '0' COMMENT '手机号',
使用字符串类型查询就可以使用索引
- 联合索引最左原则
(a) 建联合索引的时候,区分度最高的字段在最左边。
(b) 如果建立了(a, b)联合索引,就不必再单独建立 a 索引。同理,如果建立了(a,b,c)联合索引,就不必再单独建立 a、(a,b) 索引。
(c) 存在非等号和等号混合判断条件时,在建索引时,请把等号条件的列前置。如:where a>? and b=?,那么即使 a 的区分度更高,也必须把 b 放在索引的最前列。
(d) 最左侧查询需求,并不是指 SQL 语句的 where 顺序要和联合索引一致。
- 建立索引的列不允许为NULL,一般指定空字符串,或默认数值
6.如果明确知道只有一条结果返回,limit 1 能够提高效率
网友评论