mysql Day05

sql性能分析

  • sql执行频率
show global status like 'Com_______'

  • 慢查询日志

执行时间超过10秒的sql语句

  • profile详情

show profiles帮助我们了解时间都耗费到哪里了

#查看每一条sql的耗时情况
show profiles#查看指定query_id的sql语句各个阶段的耗时情况
show profile for query query_id#查看指定query_id的sql语句cpu的耗时情况
show profile cpu for query query_id
  • explain执行计划
  1. id值相同,执行顺序从上到下
explain select * from emp e, dept d where e.dept_id = d.id;

 

  1. id不同,值越大越先执行

查询选修sql的学生,涉及学生表、课程表、中间表。

先从课程表通过mysql查询课程id

再从中间表通过课程id查询学生id

最后从学生表通过学生id获得行信息

  1. type

表示连接类型,性能由好到差的连接类型为NULL、system、const、eq_ref、ref、range、index、all。

explain select 'A', 这种无聊没意义的语句的type是null

system访问系统表

const  主键、唯一索引查询:select *from emp where id = 1

ref       非唯一性索引查询:select *from emp where name = 'Xiaohong'

  1. possible_key

可能用到的索引

  1. key

用到的索引

  1. key_len

索引字段最大可能长度

  1. row

mysql认为必须要执行查询的行数

  1. filtered

返回结果的行数占需读取行数的百分比

索引使用

索引对效率的提升

针对sn字段创建索引

create index idx_sku_sn on tb_sku(sn);

接下来执行索引的话就很快啦!

select * from tb_sku where sn = '100000000153'

最左前缀法则

  • 索引了多列
  • 查询从索引最左列开始,并且不跳过索引中的列

如果最左侧索引列不存在,则全部失效

如果跳跃某一列,后面的字段索引失效

注意 : 最左前缀法则中指的最左边的列,是指在查询时,联合索引的最左边的字段 ( 即是
第一个字段 ) 必须存在,与我们编写 SQL 时,条件编写的先后顺序无关。

范围查询

  • 索引了多列
  • 范围查询右边的列索引将会失效
  • 在不影响业务的情况下尽量使用>=或<=

索引列运算

  • 不要对有索引的列进行运算,如下对字符串取子串操作索引失效
    explain select * from tb_user where substring(phone,10,2) = '15';

字符串不加引号,索引将会失效

模糊查询

explain select * from tb_user where profession = '软件工程' and age = 31 and status
= '0';
explain select * from tb_user where profession = '软件工程' and age = 31 and status
= 0;
如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。
explain select * from tb_user where profession like '软件%'; -- 走
explain select * from tb_user where profession like '%工程'; -- 不走
explain select * from tb_user where profession like '%工%';  -- 不走

or连接的条件

or分隔开的条件,如果or前面的条件中的列有索引,而后面的条件列中没有索引,那么涉及的索引都不会被用到

explain select * from tb_user where id = 10 or age = 23;

数据分布影响

mysql评估使用索引比扫描全表更慢,则不使用索引

select * from tb_user where phone >= '17799990005'; --全表扫描
select * from tb_user where phone >= '17799990015'; --索引生效
explain select * from tb_user where profession is null;
explain select * from tb_user where profession is not null;

如果把表里的profession全都set为null,那么is null就查选表,is not null就走索引

sql提示

加入人为提示达到优化操作

1). use index : 建议 MySQL 使用哪一个索引完成此次查询(仅仅是建议, mysql 内部还会再次进
行评估)。
explain select * from tb_user use index(idx_user_pro) where profession = '软件工
程';
2). ignore index : 忽略指定的索引。
explain select * from tb_user ignore index(idx_user_pro) where profession = '软件工
程';
3). force index : 强制使用索引。
explain select * from tb_user force index(idx_user_pro) where profession = '软件工
程';

覆盖索引

explain select id, profession from tb_user where profession = '软件工程' and age =
31 and status = '0' ;explain select id, profession,age, status from tb_user where profession = '软件工程'
and age = 31 and status = '0' ;explain select id, profession,age, status, name from tb_user where profession = '软
件工程' and age = 31 and status = '0' ;explain select * from tb_user where profession = '软件工程' and age = 31 and status
= '0';

select id,name,gender from tb_user where name = 'Arm';

需要使用二级索引,name要到聚集索引中根据id查询,也就是需要回表查询,效率比较低

使用select * 很容易出现回表查询的情况

前缀索引

将字符串的一部分前缀建立索引

create index idx_email_5 on tb_user(email(5)); 
可以根据索引的选择性来决定前缀长度,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值, 索引选择性越高则查询效率越高, 唯一索引的选择性是1 ,这是最好的索引选择性,性能也是最好的。
distinct email是求不重复的email字段,选择性是1
select count(distinct email) / count(*) from tb_user ;
select count(distinct substring(email,1,5)) / count(*) from tb_user ;

单列索引和联合索引

  • 单列索引包含一个列
  • 联合索引包含多个列
and 连接的两个字段 phone name 上都是有单列索引的,但是最终mysql 只会选择一个索引,也就是说,只能走一个字段的索引,此时是会回表查询的
推荐使用联合索引!
联合索引也是二级索引,叶子结点是对应行的主键id

 在创建联合索引的时候,需要考虑索引的顺序。

索引设计原则

  1. 数据量超过100w,查询比较频繁的表
  2. 常作为查询条件的字段建立索引
  3. 选择区分度高的索引,尽量选择唯一索引
  4. 字符串类型建立前缀索引
  5. 尽量使用联合索引,注意遵循最左前缀法则
  6. 控制索引的数量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/468053.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kali系统概述、nmap扫描应用、john破解密码、抓包概述、以太网帧结构、抓包应用、wireshark应用、nginx安全加固、Linux系统加固

目录 kali nmap扫描 使用john破解密码 抓包 封装与解封装 网络层数据包结构 TCP头部结构​编辑 UDP头部结构 实施抓包 安全加固 nginx安全 防止缓冲区溢出 Linux加固 kali 实际上它就是一个预安装了很多安全工具的Debian Linux [rootmyhost ~]# kali resetkali …

随机过程及应用学习笔记(一)概率论(概要)

概率是随机的基础&#xff0c;在【概率论&#xff08;概要&#xff09;】这个部分中仅记录学习随机过程及应用的基本定义和结果。 前言 首先&#xff0c;概率论研究的基础是概率空间。概率空间由一个样本空间和一个概率测度组成&#xff0c;样本空间包含了所有可能的结果&…

博主用树莓派绕过 Windows Bitlocker 加密,用时不到一分钟

近日 YouTube 博主 stacksmashing 发现 Bitlocker 存在一个巨大的安全漏洞&#xff0c;他利用价值不到 10 美元的树莓派 Pico 在不到一分钟内成功绕过了该加密。 2 月 7 日消息&#xff0c;微软 Windows 10 和 11 专业版内置的 Bitlocker 加密功能一直被认为是方便易用的安全解…

[FFmpeg学习]从视频中获取图片

从视频中获取图片是一个比较直观的例子&#xff0c;这里从一个基础的例子来查看FFmpeg相关api的使用&#xff0c;从mp4文件中获取一帧图像&#xff0c;保存为jpeg格式图片&#xff0c;mp4文件比较好准备&#xff0c;一般手机录屏文件就是mp4格式。 原理还是比较清楚&#xff0…

计算机网络——09Web-and-HTTP

Web and HTTP 一些术语 Web页&#xff1a;由一些对象组成对象可以是HTML文件、JPEG图像&#xff0c;JAVA小程序&#xff0c;声音剪辑文件等Web页含有一个基本的HTML文件&#xff0c;该基本HTML文件又包含若干对象的引用&#xff08;链接&#xff09;通过URL对每个对象进行引用…

C#,巴都万数列(Padonve Number)的算法与源代码

1 巴都万数列&#xff08;Padovan Sequence&#xff09; 巴都万数列&#xff08;Padovan Sequence&#xff09;是一个整数数列。 首数个值为1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 16, 21, 28, 37 ... 此数列以建筑师理察巴都万命名&#xff0c;他的论文Dom&#xff08;1994年&a…

九、java 继承

文章目录 java 继承3.1 根父类Object3.2 方法重写3.3 继承案例&#xff1a;图形类继承体系3.4 继承的细节3.4.1 构造方法3.4.2 重名与静态绑定3.4.3 重载和重写3.4.4 父子类型转换3.4.5 继承访问权限protected3.4.6 可见性重写3.4.7 防止继承final 3.5 继承是把双刃剑3.5.1 继承…

Android13多媒体框架概览

Android13多媒体框架概览 Android 多媒体框架 Android 多媒体框架旨在为 Java 服务提供可靠的接口。它是一个系统&#xff0c;包括多媒体应用程序、框架、OpenCore 引擎、音频/视频/输入的硬件设备&#xff0c;输出设备以及一些核心动态库&#xff0c;比如 libmedia、libmedi…

【C++初阶】第三站:类和对象(中) -- 类的6个默认成员函数

目录 前言 类的6个默认成员函数 构造函数 概念 特性 析构函数 概念 特性 拷贝构造函数 概念 特征 赋值运算符重载 运算符重载 赋值运算符重载 const成员 const修饰类成员函数 取地址及const取地址操作符重载 本章总结&#xff1a; 前言 有时候我们写好了一个栈&#xff0c;头脑…

Excel

1、Excel的学习路径 2、掌握excel的基础要求 01、保证新版本 02、培养好的数据表格习惯 03、主动性探索 04、多联系 一、函数 二、文本清洗函数 三、常见文本的清洗函数 获取k的位置 FIND("k",P2,1) 从第1个位置开始在位置P2&#xff0c;查询字段k&#x…

【MySQL】索引事务

MySQL索引事务 1. 索引1.1 概念1.2 作用1.3 使用场景1.4 使用1.5 案例 2. 事务2.2 事物的概念2.3 使用 3. 内容重点总结 1. 索引 1.1 概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引&#xff0c; 并指定索引的类…

数列极限

一、数列基础 1. 判断数列an是否有界 判断|an|是否小于等于M 2. 判断数列an是否单调 对所有正整数n&#xff0c;有an1&#xff1e;an&#xff0c;则称的单调递增数列。 对所有正整数n&#xff0c;有an1&#xff1c;an&#xff0c;则称的单调递减数列。 3. 重要数列 二、数列…