美文网首页
mysql 索引优化

mysql 索引优化

作者: 爱学习的代代 | 来源:发表于2019-02-19 15:53 被阅读0次

    Q1: mysql 的三范式

    1. 记录的属性是原子性的,不可再分
    image.png

    我们发现此时的成绩一栏是可以进行拆分的,可以拆分为科目+分数,不符合范式1,修改后:


    image.png
    1. 记录的属性不可有部分依赖,前提是存在联合主键索引;一般不用联合的主键索引,而是用唯一的主键。
    image.png

    如果我们用学生和班级建立联合索引,则属性科目仅仅与学生有关,而与科目无关,产生了部分依赖。修改为添加为自增主键

    image.png
    1. 属性不依赖其他非主属性
      上面我们明显可以看到成绩依赖于科目,而跟主键没有什么关系,所以我们可以请科目及成绩进行拆分
    student.png score.png

    Q2:正确的使用索引

    1.前置模糊搜索,数据库引擎会放弃索引,进行全表扫描,而后置查询可以正常使用索引:
    应用场景:web端的模糊检索

    image.png
    image.png
    1. 【待考证】负向条件查询不可使用索引:也要看数据范围的哈(> 和 < 要看数据范围)
      !=、<>、not in、not exists、not like


      image.png
    image.png
    image.png
    image.png
    image.png
    1. 强制类型转换会导致全表扫描
      `s_mobile` varchar(20) NOT NULL DEFAULT '0' COMMENT '手机号',
    image.png

    使用字符串类型查询就可以使用索引

    image.png
    1. 联合索引最左原则
      (a) 建联合索引的时候,区分度最高的字段在最左边。
      (b) 如果建立了(a, b)联合索引,就不必再单独建立 a 索引。同理,如果建立了(a,b,c)联合索引,就不必再单独建立 a、(a,b) 索引。
      (c) 存在非等号和等号混合判断条件时,在建索引时,请把等号条件的列前置。如:where a>? and b=?,那么即使 a 的区分度更高,也必须把 b 放在索引的最前列。
      (d) 最左侧查询需求,并不是指 SQL 语句的 where 顺序要和联合索引一致。
    1. 建立索引的列不允许为NULL,一般指定空字符串,或默认数值

    6.如果明确知道只有一条结果返回,limit 1 能够提高效率

    相关文章

      网友评论

          本文标题:mysql 索引优化

          本文链接:https://www.haomeiwen.com/subject/jkgzeqtx.html