第11步---MySQL的优化

news2024/9/28 13:22:07

第11步---MySQL的优化

 1.概念

原先写功能。后来对平静进行优化

  • 设计

  • 查询语句

  • 索引

  • 存储

2.查看执行效率

-- 查看当前会话sql得执行类型得统计信息

SHOW session STATUS like 'Com%'

上面展示得信息就是统计了当前会话得执行得操作得次数。

-- 查看全局得
SHOW GLOBAL STATUS like 'Com%'
-- 查看基于innoDB引擎得操作
SHOW STATUS LIKE 'Innodb_rows_%'

 3.sql优化操作

查看慢sql

-- 查看慢日志得配置得信息
SHOW VARIABLES LIKE '%slow_query_log%';

 

系统得慢日志是默认是关闭的状态的需要自己单独进行开启。

开启慢日志查询

-- 开启慢日志查询
set GLOBAL slow_query_log=1;

重新查看慢日志的信息

 

-- 查看慢日志的执行的阈值的信息
SHOW VARIABLES LIKE '%long_query_time%';

 只有执行的执行的时间超过了10s的就会被记录下来。

-- 修改慢日志的执行的阈值的信息
SET SESSION long_query_time=5;


-- 查看慢日志的执行的阈值的信息
SHOW VARIABLES LIKE '%long_query_time%';

要是进行全局修改的修改的话只能修改本地的配置文件。

4.定位执行效率低下的sql

-- 查看当前客户端连接服务器的线程执行的状态信息
SHOW PROCESSLIST;

5.Explain执行计划

-- 查看当前sql的执行计划
EXPLAIN SELECT * FROM account WHERE name ='zhangsan';

 

  • id是表的查询序号

  • type是简单表还是子查询等

  • 输出结果的表

  • type:连接的类型

  • 用到的索引

  • 实际的索引

  • 索引字段的长度

  • 扫描字段的长度

  • 扫描行的长度

  • 执行情况的说明和描述

-- 查看表的连接情况
EXPLAIN SELECT * FROM dept d join emp e ON d.deptno=e.deptno;

 

上面的表都是平行的关系,没有主副之分的。

要是子查询的话有顺序的关系。id的值越大执行的顺序就越高。里面的子查询最先被加载的。

主查询是子查询最外层的查询。

 

select_type指定的是表中的数据来自于什么地方。可以来自基本表,可以来自衍生表等等。

6.type类型

all:表示全表扫描。

 

5.7以上的版本不再显示system。

普通的索引是ref。只有唯一索引才会出现const。

CREATE TABLE `user2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

CREATE TABLE `user2_sex` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

INSERT INTO `xx`.`user2` (`id`, `name`) VALUES (1, '张三');
INSERT INTO `xx`.`user2` (`id`, `name`) VALUES (2, '李四');
INSERT INTO `xx`.`user2` (`id`, `name`) VALUES (3, '王五');


INSERT INTO `xx`.`user2_sex` (`id`, `age`) VALUES (1, 20);
INSERT INTO `xx`.`user2_sex` (`id`, `age`) VALUES (2, 22);
INSERT INTO `xx`.`user2_sex` (`id`, `age`) VALUES (3, 23);

EXPLAIN SELECT * FROM user2 a,user2_sex b WHERE a.id=b.id;

 

下面给第二个添加一个主键索引。

eq_ref比ref效率更高。

range:

EXPLAIN SELECT * FROM user2 WHERE id>2;

index:扫描的是索引列

all:把整个表都进行扫描一遍

执行的效率:

system<const<eq_ref<ref<range<index<all

7.其他执行字段

table

  • 显示的不一定是真实的名字可以是数据表的简称

rows:

  • 扫描的行的数量

key:

  • possible_keys:显示可能应用在这张表的索引,一个或多个。

  • key:实际使用的索引。如果为null,就是没有使用索引。

EXPLAIN SELECT * FROM user2 WHERE id>2;

 要是直接查询全部的话就是不会显示

EXPLAIN SELECT * FROM user2 ;

 

extra

  • 显示额外的执行计划

EXPLAIN SELECT * FROM user2 order by name  ;

 


EXPLAIN SELECT count(*) FROM user2 GROUP BY name   ;

 

 8.show profile查看执行效率

-- 采用show profile
-- 8.x不支持的
show @@have_profiling;


-- 不支持的话
SET profiling=1;

执行一些简单的操作

SHOW DATABASES;
USE xx;
SELECT * FROM user2 WHERE id>2;

SHOW PROFILES;

 查看单个sql的执行的时间的信息。

SHOW PROFILE FOR QUERY 90;

 查看cpu的执行的时间的信息

SHOW PROFILE cpu FOR QUERY 109;

 

  • 1:整个阶段的时间

  • 2:用户消耗

  • 3:系统的cpu的消耗

9.查看trace优化器

sql中提供了跟踪的trace,通过trace文件可以进一步为什么优化器执行的过程。

-- 设置trace
set optimizer_trace ='enabled=on',end_markers_in_json=on;
-- 设置最大的显示内存
SET optimizer_trace_max_mem_size=1000000;

SELECT * FROM user2;

-- 执行sql
SELECT * FROM information_schema.OPTIMIZER_TRACE \G;

下面是在dos终端显示的内容。navicat中是显示不出来的。

*************************** 1. row ***************************
                            QUERY: SELECT * FROM user2
                            TRACE: {
  "steps": [
    {
      "join_preparation": {
        "select#": 1,
        "steps": [
          {
            "expanded_query": "/* select#1 */ select `user2`.`id` AS `id`,`user2`.`name` AS `name` from `user2`"
          }
        ] /* steps */
      } /* join_preparation */
    },
    {
      "join_optimization": {
        "select#": 1,
        "steps": [
          {
            "table_dependencies": [
              {
                "table": "`user2`",
                "row_may_be_null": false,
                "map_bit": 0,
                "depends_on_map_bits": [
                ] /* depends_on_map_bits */
              }
            ] /* table_dependencies */
          },
          {
            "rows_estimation": [
              {
                "table": "`user2`",
                "table_scan": {
                  "rows": 3,
                  "cost": 0.25
                } /* table_scan */
              }
            ] /* rows_estimation */
          },
          {
            "considered_execution_plans": [
              {
                "plan_prefix": [
                ] /* plan_prefix */,
                "table": "`user2`",
                "best_access_path": {
                  "considered_access_paths": [
                    {
                      "rows_to_scan": 3,
                      "access_type": "scan",
                      "resulting_rows": 3,
                      "cost": 0.55,
                      "chosen": true
                    }
                  ] /* considered_access_paths */
                } /* best_access_path */,
                "condition_filtering_pct": 100,
                "rows_for_plan": 3,
                "cost_for_plan": 0.55,
                "chosen": true
              }
            ] /* considered_execution_plans */
          },
          {
            "attaching_conditions_to_tables": {
              "original_condition": null,
              "attached_conditions_computation": [
              ] /* attached_conditions_computation */,
              "attached_conditions_summary": [
                {
                  "table": "`user2`",
                  "attached": null
                }
              ] /* attached_conditions_summary */
            } /* attaching_conditions_to_tables */
          },
          {
            "refine_plan": [
              {
                "table": "`user2`"
              }
            ] /* refine_plan */
          }
        ] /* steps */
      } /* join_optimization */
    },
    {
      "join_execution": {
        "select#": 1,
        "steps": [
        ] /* steps */
      } /* join_execution */
    }
  ] /* steps */
}

10.索引优化

最左原则

避免索引失效。

  • 全值匹配是会出现失效的。

  • 组合索引的时候从左到右进行匹配的。只要包含就行与顺序是无关的。

  • 不能违背最左原则

11.其他常见失效的情况

索引失效的其他的常见的做法

  • 范围上不能进行运算

  • 字符串不加单引号索引会失效。不影响查询,会自动地进行类型地转换

  • 尽量避免覆盖索引。避免select *。

  •  没有必要的时候尽量不要写select *的操作。

  •  避免l以%
  • 开头的like模糊查询。索引失效。要是%放在最后面的话就可以利用索引

12.不使用索引的情况

不使用索引的情况

  • 当全表查询的速度比索引快的时候不用索引

  • is null 和 is not null 有时候失效。有时候是有效的。根据实际的数据是有关的。

  • in走索引。not in索引失效。但是主键索引都是会用的。

  • 单列索引和复合索引,尽量比卖你使用复合索引。

  • 多个索引的话,即使where中有多个索引列,则只有一个是最优的索引是有效的。

 

13.SQL优化-大批量插入数据

大批量插入数据

  • 要保证主键列是有序的插入的速度是比较快的

CREATE TABLE tb_user
(
  id int(11) NOT NULL AUTO_INCREMENT,
  username varchar(45) NOT NULL,
  password varchar(96) NOT NULL,
  name varchar(45) NOT NULL,
  birthday datetime DEFAULT NULL,
  sex char(1) DEFAULT NULL,
  email varchar(45) DEFAULT NULL,
  phone varchar(45) DEFAULT NULL,
  qq varchar(32) DEFAULT NULL,
  status varchar(32) NOT NULL COMMENT '用户状态',
  create_time datetime NOT NULL,
  update_time datetime DEFAULT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY unique_user_username (username)
) ;

我们将文件中的数据保存到表中。插入的数据最好是要插入的数据是有顺序的。

  • 指定字段之间的分隔符 逗号

  • 指定行之间的分割符是 换行符

  • load是加载本地的文件插入到数据库中的

load data local infile 'D:\\sql_data\\sql1.log' into table tb_user fields terminated by ',' lines terminated by '\n';

需要开启系统的相关的操作


-- 1、首先,检查一个全局系统变量 'local_infile' 的状态, 如果得到如下显示 Value=OFF,则说明这是不可用的
show global variables like 'local_infile';


-- 2、修改local_infile值为on,开启local_infile
set global local_infile=1;

此时执行load操作。

主键乱序的比主键不乱序的执行的效率是低的。

关闭唯一性校验

-- 关闭唯一性校验
SET UNIQUE_CHECKS=0;

执行插入操作
-- 插入完成之后再开启校验的操作
SET UNIQUE_CHECKS=1;

14.insert优化

  • 将多个insert转换成一个插入的操作

  • 采用手动事务提交的方式。

  • 插入的数据尽量保持有序

15.order by优化

常见的两种排序的方式

  • 直接对返回的数据进行的排序就是filesort,所有不是通过索引直接返回排序结果的排序叫做filesort

  • 有序索引顺序扫描直接返回有序数据。这种情况极为using index。不需要额外排序,操作效率高。

DROP TABLE IF EXISTS emp;
-- 优化order by语句
CREATE TABLE `emp` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `age` int(3) NOT NULL,
  `salary` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ;
insert into `emp` (`id`, `name`, `age`, `salary`) values('1','Tom','25','2300');
insert into `emp` (`id`, `name`, `age`, `salary`) values('2','Jerry','30','3500');
insert into `emp` (`id`, `name`, `age`, `salary`) values('3','Luci','25','2800');
insert into `emp` (`id`, `name`, `age`, `salary`) values('4','Jay','36','3500');
insert into `emp` (`id`, `name`, `age`, `salary`) values('5','Tom2','21','2200');
insert into `emp` (`id`, `name`, `age`, `salary`) values('6','Jerry2','31','3300');
insert into `emp` (`id`, `name`, `age`, `salary`) values('7','Luci2','26','2700');
insert into `emp` (`id`, `name`, `age`, `salary`) values('8','Jay2','33','3500');
insert into `emp` (`id`, `name`, `age`, `salary`) values('9','Tom3','23','2400');
insert into `emp` (`id`, `name`, `age`, `salary`) values('10','Jerry3','32','3100');
insert into `emp` (`id`, `name`, `age`, `salary`) values('11','Luci3','26','2900');
insert into `emp` (`id`, `name`, `age`, `salary`) values('12','Jay3','37','4500');
 
-- 创建组合索引
CREATE INDEX idx_emp_age_salary on emp (age,salary);

-- Using filesort
EXPLAIN SELECT * FROM emp ORDER BY age;


-- Using filesort
EXPLAIN SELECT * FROM emp ORDER BY age,salary;

上面出现的不能使用索引的原因是select *

-- Using index
EXPLAIN SELECT id FROM emp ORDER BY age;

-- Using index
EXPLAIN SELECT id,age FROM emp ORDER BY age;

-- Using index
EXPLAIN SELECT id,age,salary FROM emp ORDER BY age;

-- Using filesort
EXPLAIN SELECT id,age,salary,name  FROM emp ORDER BY age;


-- Using index; Using filesort
EXPLAIN SELECT id,age  FROM emp ORDER BY age ASC ,salary DESC;

-- Backward index scan; Using index
EXPLAIN SELECT id,age  FROM emp ORDER BY age DESC ,salary DESC;

-- Using index; Using filesort
EXPLAIN SELECT id,age  FROM emp ORDER BY salary,age;

order by后面的排序的字段尽量和索引的顺序是一致的。

可以适当的提高排序的缓存的空间大小。

show variables like 'max_length_for_sort_data'; -- 4096
show variables like 'sort_buffer_size'; -- 262144

上面的值越大越优先选择一次扫描。

16.优化子查询

连接查询比子查询效率更高一点。尽量不采用临时表的形式进行查询。

17.优化limit

数据量越大需要的数据越少,消耗的性能越大,查询900010的10条数据,前面900000排序号的数据被舍弃了,导致了性能的损耗。

优化的方式

  • 可以对索引列进行排序,在这个基础上进行limit。可以跟原先的表进行关联查询。

explain select * from tb_user limit 900000,10; -- 0.684  速度是比较慢的

explain select * from tb_user a, (select id from tb_user order by id limit 900000,10) b where a.id = b.id; -- 0.486 速度是比较快的。用到了id索引列然后进行了关联查询
  • 转换成某个id的查询

采用下面的方式也是可以的
explain select * from tb_user where id > 900000 limit 10;

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

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

相关文章

【C++入门到精通】C++入门 —— deque(STL)

阅读导航 前言一、deque简介1. 概念2. 特点 二、deque使用1. 基本操作&#xff08;增、删、查、改&#xff09;2. 底层结构 三、deque的缺陷四、 为什么选择deque作为stack和queue的底层默认容器总结温馨提示 前言 文章绑定了VS平台下std::deque的源码&#xff0c;大家可以下载…

SOLIDWORKS中一些不常用却很实用的功能介绍

1.过滤 FeatureManager 设计树 我们可以在FeatureManager 设计树过滤器中搜索特定的零件特征和装配体零部件。 2.添加文件夹和子文件夹 在零件或装配体文件中&#xff0c;您可添加文件夹到 FeatureManager 设计树内。 您可重新命名新的文件夹并将额外项目拖动到新的文件夹中。…

(一)Dubbo源码解析:增强SPI

〇、前言 在Dubbo的架构设计中&#xff0c;如何可以通过“类插拔”的方式&#xff0c;对其功能进行灵活的扩展或者削弱&#xff0c;那么&#xff0c;SPI起到了极其关键的作用。本篇文章作为分析Dubbo源码的第一篇文章&#xff0c;我们先暂时放下“服务注册发布流程”、“服务启…

Linux:shell脚本:基础使用(6)《正则表达式-awk工具》

简介 awk是行处理器: 相比较屏幕处理的优点&#xff0c;在处理庞大文件时不会出现内存溢出或是处理缓慢的问题&#xff0c;通常用来格式化文本信息 awk处理过程: 依次对每一行进行处理&#xff0c;然后输出 1&#xff09;awk命令会逐行读取文件的内容进行处理 2&#xff09;a…

攻防世界-disabled_button

原题解题思路 看页面源码 把这个删了就行

ESP32-C3 手动启用 Secure Boot V2 与 Flash 加密流程

ESP-IDF 中 flash 加密可以在 bootloader 阶段自动启用&#xff0c;但是这需要设备自加密后重启一次&#xff0c;为了节省这次重启的步骤&#xff0c;你可以选择通过一些脚本工具在外部启用 flash 加密。 本篇文档用于介绍 ESP32-C3 手动启用 Secure Boot V2 与 Flash 加密的操…

矩阵乘法(C++ mpi 并行实现)

矩阵乘法有2种思路&#xff0c;我最先想到的是第一种思路&#xff0c;但是时间、空间复杂度都比较高。后面参考了一些资料&#xff0c;实现了第二种思路。 一、思路1&#xff1a;按行、列分块 矩阵乘法有一个很好的性质&#xff0c;就是结果矩阵的每个元素是不互相依赖的&…

如何批量加密PDF文件并设置不同密码 - 批量PDF加密工具使用教程

如果你正在寻找一种方法来批量加密和保护你的PDF文件&#xff0c;批量PDF加密工具是一个不错的选择。 它是一个体积小巧但功能强大的Windows工具软件&#xff0c;能够批量给多个PDF文件加密和限制&#xff0c;包括设置打印限制、禁止文字复制&#xff0c;并增加独立的打开密码。…

React实战 - React路由鉴权

目录 一、React-Router知识回顾 二、路由鉴权应用分析 三、路由鉴权配置 四、权限控制 一、React-Router知识回顾 React-router相关的文章中我已经给大家演示了最基础的应用&#xff1a; <Switch ><Route path"/products/:id" component{ProductDetai…

【Rust】Rust学习 第十七章Rust 的面向对象特性

面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一种模式化编程方式。对象&#xff08;Object&#xff09;来源于 20 世纪 60 年代的 Simula 编程语言。这些对象影响了 Alan Kay 的编程架构中对象之间的消息传递。他在 1967 年创造了 面向对…

Blob,File文件上传下载的内容笔记

Blob 对象表示一个不可变、原始数据的类文件对象&#xff0c;可以看做是存放二进制数据的容器 。 简单来说Blob就是一个二进制的对象&#xff0c;我们可以通过这个blob对象直接读取文件内容 Blob和Flie没什么区别&#xff0c;File继承于Blob,就是多了一个name属性&#xff0c;表…

当今职场,正在加速淘汰 “巨婴员工”

我担任过多家上市公司的技术高管职位&#xff0c;在工作中经常会遇到巨婴型员工&#xff0c;他们外在的表现是&#xff0c;不能够很好地管理自己&#xff0c;缺乏自律&#xff0c;缺乏起码的抗挫折能力和抗压能力&#xff0c;需要领导呵护着、同事们忍让着。作为一名管理者&…

科技成果鉴定测试有什么意义?专业CMA、CNAS软件测评公司

科技成果鉴定测试是指通过一系列科学的实验和检测手段&#xff0c;对科技成果进行客观评价和鉴定的过程。通过测试&#xff0c;可以对科技成果的技术优劣进行评估&#xff0c;从而为科技创新提供参考和指导。 一、科技成果鉴定测试的意义 1、帮助客户了解科技产品的性能特点和…

排序(七种排序)

1.插入排序 2.希尔排序 3.选择排序 4.堆排序 5.冒泡排序 6.快速排序 7.归并排序 1.插入排序 1.1思路 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为 止&#xff0c;得到一个新的有序序列 1.2实现 //插入排…

[计算机入门] 个性化设置系统

3.2 个性化设置系统 在Windows系统中&#xff0c;个性化设置可以让用户根据自己的喜好和需求对系统进行定制和调整&#xff0c;包括桌面背景、声音、屏幕保护程序、鼠标指针、字体等。通过个性化设置&#xff0c;用户可以创建自己的独特界面和用户体验&#xff0c;使系统更加符…

HBuilderX获取iOS证书的打包步骤

简介&#xff1a; 目前app开发&#xff0c;很多企业都用H5框架来开发&#xff0c;而uniapp又是这些h5框架里面最成熟的&#xff0c;因此hbuilderx就成为了开发者的首选。然而,打包APP是需要证书的&#xff0c;那么这个证书又是如何获得呢&#xff1f; 生成苹果证书相对复杂一些…

Hyper-V Linux服务器安装

官方文档&#xff1a;在 Windows 10 创意者更新上使用 Hyper-V 创建虚拟机 | Microsoft Learn 1 新增虚拟交换机 打开Hyper-V管理器&#xff0c;找到右侧的操作列&#xff0c;点击“虚拟交换机管理器”&#xff1a; 点击“新建虚拟网络交换机”&#xff0c;交换机类型选择“外部…

用idea解决代码合并冲突

参考文章&#xff1a; IDEA&#xff1a;idea中的Git冲突解决&#xff08;非常重要&#xff09; idea操作git时 合并分支解决冲突 一、前言 1.什么事冲突&#xff1f; 冲突是指当你在提交或者更新代码时被合并的文件与当前文件不一致。读起来有点绕&#xff0c;结合下面的案例…

16、Flink 的table api与sql之连接外部系统: 读写外部系统的连接器和格式以及FileSystem示例(1)

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

Unity解决:3D开发模式第三人称视角 WASD控制角色移动旋转 使用InputSystem

Unity版本&#xff1a;2019.2.3f1 目录 安装InputSystem 1&#xff1a;创建InputHander.cs脚本 挂载到Player物体上 获取键盘输入WADS 2.创建PlayerLocomotion.cs挂载到Player物体上&#xff0c;控制物体移动转向 安装InputSystem 菜单栏/Window/Package Manager/Input Syst…