2 mysql索引优化分析
image.png
我们发现此时的成绩一栏是可以进行拆分的,可以拆分为科目+分数,不符合范式1,修改后:
image.png
记录的属性不可有部分
Q1: mysql 的三范式记录的属性是原子性的,不可再分 image.png 我们发现此时的成绩一栏是可以进行拆分的,可以拆分为科目+分数,不符合范式1,修改后: image.png 记录的属性不可有部分依赖,前提是存在联合主键索引;一般不用联合的主键索引,而是用唯一的主键。 image.png 如果我们用学生和班级建立联合索引mysql 模糊搜索 优化,则属性科目仅仅与学生有关,而与科目无关,产生了部分依赖。修改为添加为自增主键 image.png 属性不依赖其他非主属性 上面我们明显可以看到成绩依赖于科目,而跟主键没有什么关系,所以我们可以请科目及成绩进行拆分 student.png score.png Q2:正确的使用索引 1.前置模糊搜索,数据库引擎会放弃索引,进行全表扫描,而后置查询可以正常使用索引: 应用场景: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 '手机号', image.png 使用字符串类型查询就可以使用索引 image.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 能够提高效率 (编辑:上海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |