• MySQL(2) Explain


    1、概念
    使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈

    2、使用
    在 select 语句之前增加 explain 关键字 ,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL
    在explain 语句后马上执行一条show warnings语句,会展示mysql对上面这条sql优化后的
    语句,通过这个我们可以大概了解mysql给我们sql语句做的一些优化,但是不一定能执行

    3、explain中列的含义
    (1)id
    id是select的编号,值越大执行优先级越高,如果相同,则从上往下执行,null最后执行
    (2)select_type
    simple 简单查询
    primary 复杂查询中最外层的select
    subquery 包含在select 中的子查询,不在from之后
    derived 包含在from后面的子查询,mysql会将结果放在一个临时表(派生表)
    (3)table
    查询的表名称
    (4)partitions
    如果查询是基于分区表的话,会展示查询将要访问的分区
    (5)type
    访问的类型
    1、NULL:比如select min(id) from table; 就是null,意思就是在优化阶段已经查询出来结果,不需要去真正执行所以比 select id from table order by id limit 1 快
    2、system   是const的一个特例,衍生表中匹配的数据只有一条
    3、const   mysql会将查询的条件优化为一个常量,用于primary key 或unique key的所在列与常数比较
    表中只有一个匹配行,读取一次
    4、eq_ref primary key 或 unique key 索引的所有部分被连接使用,最多只返回一条符合条件的记录
    5、ref    相比eq_ref ,不使用唯一索引,不止于关联查询
    6、range  使用索引但是条件是一个范围
    7、index  使用全索引查询,一般覆盖索引
    8、all    全表扫描

    (6)possible_keys
    可能用到的索引
    (7)key
    实际用到的索引
    (8)key_len
    用到索引里使用的字节数
    key_len计算规则如下:
    字符串,char(n)和varchar(n),5.0.3以后版本中,n均代表字符数,而不是字节数,如果是utf-8,一个数字
    或字母占1个字节,一个汉字占3个字节
    char(n):如果存汉字长度就是 3n 字节
    varchar(n):如果存汉字则长度是 3n + 2 字节,加的2字节用来存储字符串长度,因为
    varchar是变长字符串
    数值类型
    tinyint:1字节
    smallint:2字节
    int:4字节
    bigint:8字节
    时间类型
    date:3字节
    timestamp:4字节
    datetime:8字节
    如果字段允许为 NULL,需要1字节记录是否为 NULL
    索引最大长度是768字节,当字符串过长时,mysql会做一个类似左前缀索引的处理,将前半部分的字符提取出来做索
    引。
    (9)ref
    key列记录的索引中,表查询值所用到到列或者常量
    (10)rows
    预估读取的行数,不是结果集中的行数
    (11)filtered
    该列是一个百分比的值,rows * filtered/100 可以估算出将要和 explain 中前一个表进行连接的行数(前一个表指
    explain 中的id值比当前表id值小的表)。
    (12)Extra
    Using index
    使用了覆盖索引
    Using where
    使用了where语句处理结果
    Using index condition
    where 条件中使用了索引,但是不是覆盖索引
    Using temporary
    使用了临时表
    Using filesort
    使用了外部排序,有可能是文件排序,如果数据量比较大,可能会磁盘排序
    Select tables optimized away
    使用某些聚合函数比如 max min

    索引注意事项
    1、遵循最左前缀原则
    2、不要对索引列做函数操作
    3、尽量覆盖索引
    4、!=、 <>、 not in、 not exists、is null、 is not null 可能无法使用索引导致全表扫表
    5、比较类型要匹配,防止隐式转换
    6、or 或 in 不一定走索引
    7、区分度低的字段不一定走索引
    8、范围查询放后面,有时候可以优化为等值查询
    9、like可以用覆盖索引优化
     

  • 相关阅读:
    每日分享html之2个加载、2个button、1个鼠标定向
    Sementic Kernel 案例之网梯科技在线教育
    torchvision详细介绍
    李沐:机器学习者进阶学习建议
    Go语言入门【4】循环语句
    C++6种基础线程的应用
    牛客网Day1
    Gitlab-内嵌数据库迁移到外部postgresql实例
    探索技术之上科技伦理,阿里巴巴成立科技伦理治理委员会
    JavaWeb — Servlet — 剩余内容+JSP
  • 原文地址:https://blog.csdn.net/qq_35285375/article/details/132946674