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.mzph.cn/news/681700.shtml

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

相关文章

单片机学习笔记---DS18B20温度传感器

目录 DS18B20介绍 模拟温度传感器的基本结构 数字温度传感器的应用 引脚及应用电路 DS18B20的原理图 DS18B20内部结构框图 暂存器内部 单总线介绍 单总线电路规范 单总线时序结构 初始化 发送一位 发送一个字节 接收一位 接收一个字节 DS18B20操作流程 指令介…

基于 Python 深度学习的电影评论情感分析系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

前端JavaScript篇之await 在等待什么呢?async/await 如何捕获异常

目录 await 在等待什么呢&#xff1f;async/await 如何捕获异常 await 在等待什么呢&#xff1f; await 关键字实际上是等待一个表达式的结果&#xff0c;这个表达式的计算结果可以是 Promise 对象或者其他值。如果 await 后面的表达式不是 Promise 对象&#xff0c;那么 awai…

Spring Boot3自定义异常及全局异常捕获

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途。 目录 前置条件 目的 主要步骤 定义自定义异常类 创建全局异常处理器 手动抛出自定义异常 前置条件 已经初始化好一个…

vue 获取 form表格 的值 的方法

vue 获取 form表格 的值 代码 let discountLastMoney this.form.getFieldValue(discountLastMoney)-0

格式化字符串的简单学习

文章目录 Format String格式化字符串函数格式化字符串参数原理 这几天学的少&#xff0c;过完年就一直在走亲戚&#xff08;现在看到肉就犯恶心 Format String 格式化字符串函数可以接受可变数量的参数&#xff0c;并将第一个参数作为格式化字符串&#xff0c;根据其来解析之…

[Python进阶] 识别验证码

11.3 识别验证码 我们再开发某些项目的时候&#xff0c;如果遇到要登录某些网页&#xff0c;那么会经常遇到输入验证码的情况&#xff0c;而每次人工输入验证码的话&#xff0c;比较浪费时间。于是&#xff0c;可以通过调用某些接口进行识别。 11.3.1 调用百度文字识别接口 …

中小学信息学奥赛CSP-J认证 CCF非专业级别软件能力认证-入门组初赛模拟题第一套(阅读程序题)

CCF认证CSP-J入门组模拟测试题 二、阅读程序题 (程序输入不超过数组或字符串定义的范围&#xff1b;除特殊说明外&#xff0c;判断题 1.5分&#xff0c;选择题3分&#xff0c;共计40分) 第一题 1 #include<iostream> 2 using namespace std; 3 int a,b,c; 4 int main…

【C++】内存五大区详解

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Kotlin基本语法1到函数

1.range表达式 fun main() {var age 12.3if (age in 0.0..3.3){println("婴幼儿")}else if (age in 4.0..12.2){println("少儿")}else{println("未知")}/*** in 后面还可以接 list set 都可以*/if (age !in 0.0..3.3){println("婴幼儿&quo…

UE4运用C++和框架开发坦克大战教程笔记(十八)(第55~57集)

UE4运用C和框架开发坦克大战教程笔记&#xff08;十八&#xff09;&#xff08;第55~57集&#xff09; 55. UI 进入退出动画HideOther 面板出现时隐藏其他面板添加面板出现和收起的动画效果编写遮罩管理器前的准备 56. 弹窗进入界面57. UI 显示隐藏与遮罩转移完善遮罩管理器 55…

【C++】static静态关键字

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

C# CAD2016 多边形顶点按方向重新排序

多边形顶点按方向重新排序 初始化多边形顶点集合 outerPoints 创建一个名为 outerPoints 的 List<Point2d>&#xff0c;用于存储多边形的所有顶点坐标。 计算多边形顶点集合的边界框&#xff08;BoundingBox&#xff09; 使用LINQ的Aggregate方法遍历整个outerPoints列表…

【C++】中的 inline 用法

1、引入 inline 关键字的原因 在 c/c 中&#xff0c;为了解决一些频繁调用的小函数大量消耗栈空间&#xff08;栈内存&#xff09;的问题&#xff0c;特别的引入了 inline 修饰符&#xff0c;表示为内联函数。 栈空间就是指放置程序的局部数据&#xff08;也就是函数内数据&a…

SpringBoot+Vue3 完成小红书项目

简介 该项目采用微服务架构&#xff0c;实现了前后端分离的系统设计。在前端&#xff0c;我们选择了 Vue3 配合 TypeScript 和 ElementUi 框架&#xff0c;以提升开发效率和用户体验。而在后端&#xff0c;则是运用 SpringBoot 和 Mybatis-plus 进行开发&#xff0c;保证了系统…

使用word2vec+tensorflow自然语言处理NLP

目录 介绍&#xff1a; 搭建上下文或预测目标词来学习词向量 建模1&#xff1a; 建模2&#xff1a; 预测&#xff1a; 介绍&#xff1a; Word2Vec是一种用于将文本转换为向量表示的技术。它是由谷歌团队于2013年提出的一种神经网络模型。Word2Vec可以将单词表示为高维空间…

JS逆向进阶篇【去哪儿旅行登录】【上篇】

目标url: aHR0cHM6Ly91c2VyLnF1bmFyLmNvbS9wYXNzcG9ydC9sb2dpbi5qc3A 实现难点&#xff1a; 逆向滑块请求发送短信登录 目录 每篇前言&#xff1a;0、前置技术栈&#xff08;1&#xff09;JS实现页面滑动&#xff08;2&#xff09;JS实现记录滑动轨迹&#xff08;3&#xff…

SAP MM学习笔记42 - 特殊调达流程 - 受托品(寄售)

上一章讲了 外注加工的知识。 详细可以参考如下链接。 SAP MM学习笔记41 - 特殊调达流程 - 外注加工-CSDN博客 咱们继续学习特殊调达流程。 本章主要讲受托品。 1&#xff0c;什么是受托品 &#xff08;寄售&#xff09; 仕入先提供的商品&#xff0c;商品是放在你公司了&a…

一周学会Django5 Python Web开发-Django5 Hello World编写

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计14条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

java SSM新闻管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM新闻管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S…