Q1: mysql 的三范式
- 记录的属性是原子性的,不可再分
![](https://img.haomeiwen.com/i1189654/3e330c3c4195c64e.png)
我们发现此时的成绩一栏是可以进行拆分的,可以拆分为科目+分数,不符合范式1,修改后:
![](https://img.haomeiwen.com/i1189654/581418548c50dfdc.png)
- 记录的属性不可有部分依赖,前提是存在联合主键索引;一般不用联合的主键索引,而是用唯一的主键。
![](https://img.haomeiwen.com/i1189654/7d3eee083e80dfd4.png)
如果我们用学生和班级建立联合索引,则属性科目仅仅与学生有关,而与科目无关,产生了部分依赖。修改为添加为自增主键
![](https://img.haomeiwen.com/i1189654/14fabbbc8fe202a4.png)
- 属性不依赖其他非主属性
上面我们明显可以看到成绩依赖于科目,而跟主键没有什么关系,所以我们可以请科目及成绩进行拆分
![](https://img.haomeiwen.com/i1189654/bd08e1ec08fc5c20.png)
![](https://img.haomeiwen.com/i1189654/9fd72a462900f3e7.png)
Q2:正确的使用索引
1.前置模糊搜索,数据库引擎会放弃索引,进行全表扫描,而后置查询可以正常使用索引:
应用场景:web端的模糊检索
![](https://img.haomeiwen.com/i1189654/8f2cec605bb6dcff.png)
![](https://img.haomeiwen.com/i1189654/7b3f489133f9b381.png)
【待考证】负向条件查询不可使用索引:也要看数据范围的哈(> 和 < 要看数据范围)
!=、<>、not in、not exists、not like
image.png
![](https://img.haomeiwen.com/i1189654/19c0c9b567912d32.png)
![](https://img.haomeiwen.com/i1189654/5c51b18f2e1b08df.png)
![](https://img.haomeiwen.com/i1189654/21f7afb17225c7f5.png)
![](https://img.haomeiwen.com/i1189654/47feaa24151c674f.png)
- 强制类型转换会导致全表扫描
`s_mobile` varchar(20) NOT NULL DEFAULT '0' COMMENT '手机号',
![](https://img.haomeiwen.com/i1189654/ffa1fc7955e892eb.png)
使用字符串类型查询就可以使用索引
![](https://img.haomeiwen.com/i1189654/989ed87c39c2e73b.png)
- 联合索引最左原则
(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 能够提高效率
网友评论