MySQL进阶——索引简介及SQL性能分析

一、索引分类

        1、在MySQL 数据库,将索引的具体类型主要分为以下几类:主键索引、唯一索引、常规索引、全文索引。

        2、InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种

         聚集索引选取规则:

        a、如果存在主键,主键索引就是聚集索引。

        b、如果不存在主键,将使用第一个唯一索引作为聚集索引。

        c、如果两者都没有,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。

        聚集索引和二级索引的具体结构如下:

        a、聚集索引的叶子节点下挂的是这一行的数据。

        b、二级索引的叶子节点下挂的是该字段值对应的主键值。

        接下来,我们来分析一下,当我们执行如下的SQL语句时,具体的查找过程是什么样子的。

        具体过程如下:

        a、由于是根据name字段进行查询,所以先根据name='Arm'到name字段的二级索引中进行匹配查找。但是在二级索引中只能查找到 Arm 对应的主键值10。

        b、由于查询返回的数据是*,所以此时,还需要根据主键值10,到聚集索引中查找10对应的记录,最终找到10对应的行row。

        c、最终拿到这一行的数据,直接返回即可。

        回表查询:这种先到二级索引中查找数据,找到主键值,然后再到聚集索引中根据主键值,获取数据的方式,就称之为回表查询。

二、索引语法

1、创建索引

        CREATE   [ UNIQUE | FULLTEXT ]   INDEX    index_name   ON   table_name(index_col_name,...);

2、查看索引

        SHOW   INDEX   FROM   table_name;

3、删除索引

        DROP   INDEX   index_name   ON   table_name;

三、SQL性能分析

1、SQL执行频率

        MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次:

        -- session 是查看当前会话;

        -- global 是查看全局数据;

        SHOW   GLOBAL   STATUS   LIKE   'Com_______';(7个下划线)

        通过上述指令,我们可以查看到当前数据库到底是以查询为主,还是以增删改为主,从而为数据库优化提供参考依据。 如果是以增删改为主,我们可以考虑不对其进行索引的优化。 如果是以查询为主,那么就要考虑对数据库的索引进行优化了。

2、慢查询日志

        慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。

        MySQL的慢查询日志默认没有开启,我们可以查看一下系统变量 slow_query_log。

        使用命令:show variables like 'slow_query_log';

        

        若显示value为OFF,就需要手动开启,配置文件(/etc/my.cnf);

        # 开启MySQL慢查询日志开关

        slow_query_log=1

        long_query_time=2    设置慢日志的时间为2秒;

        配置完后,重启MySQL服务器:

        systemctl   restart   mysql

        这时会生成对应慢日志文件:/usr/local/mysql/var/lnmp-inner-test-slow.log

 3、profile详情

        show profiles 能够在做SQL优化时帮助我们了解时间都耗费到哪里去了。通过have_profiling参数,能够看到当前MySQL是否支持profile操作:

        SELECT    @@have_profiling;

        

        

        可以看到,当前MySQL是支持 profile操作的,但是开关是关闭的。可以通过set语句在session/global级别开启profiling;

        set    profiling = 1;

        执行一系列的业务SQL的操作,然后通过如下指令查看指令的执行耗时:

        -- 查看每一条SQL的耗时基本情况

        show   profiles;

        -- 查看指定query_id的SQL语句各个阶段的耗时情况

        show   profile   for    query   query_id;

        --  查看指定query_id的SQL语句cpu使用情况

        show   profile   cpu   for    query   query_id;

        

 

 4、explain

        EXPLAIN 或者 DESC命令获取 MySQL 如何执行 SELECT 语句的信息,包括在 SELECT 语句执行过程中表如何连接和连接的顺序。

        语法:

        -- 直接在select语句之前加上关键字 explain / desc
        EXPLAIN SELECT 字段列表 FROM 表名 WHERE 条件 ;

        Explain 执行计划中各个字段的含义: ​​​​​​​

 

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心平浪静BO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值