MySQL中 EXPLAIN 的使用介绍

news2024/11/24 17:38:29

 Day08-11. MySQL-索引-结构_哔哩哔哩_bilibili

 

 

使用 EXPLAIN

在查询语句前加上 EXPLAIN 关键字:

EXPLAIN SELECT * FROM orders WHERE customer_id = 123 AND order_date > '2023-01-01';

执行上述 EXPLAIN 语句,查看输出结果。MySQL 会返回一个包含查询执行计划的表格(如下)。

具体解释:

EXPLAIN 输出表格包含多个列,每列提供不同的查询计划信息。常见列包括:

1、id:查询的标识符,表示查询的执行顺序。

2、select_type:查询类型,如 SIMPLE(简单查询),PRIMARY(主查询),UNION(联合查询的一部分),SUBQUERY(子查询)。

3、table:查询涉及的表。

4、type:连接类型,表示MySQL如何查找行。常见类型按效率从高到低排列为:

  • system:表只有一行(常见于系统表)。

  • const:表最多有一个匹配行(索引为主键或唯一索引)。

  • eq_ref:对于每个来自前一个表的行,表中最多有一个匹配行。

  • ref:对于每个来自前一个表的行,表中可能有多个匹配行。

  • range:使用索引查找给定范围的行。

  • index:全表扫描索引。

  • ALL:全表扫描。

5、possible_keys:查询中可能使用的索引。

6、key:实际使用的索引。

7、key_len:使用的索引键长度。

8、ref:使用的列或常量,与索引比较。

9、rows:MySQL 估计的要读取的行数。

10、filtered:经过表条件过滤后的行百分比。

11、Extra:额外的信息,如 Using index(覆盖索引),Using where(使用 WHERE 子句过滤),Using filesort(文件排序),Using temporary(使用临时表)。

优化查询路径

根据 EXPLAIN 输出,采取以下措施优化查询路径:

确保使用索引

如果 type 列显示为 ALL 或 index,说明表进行了全表扫描。可以通过创建适当的索引来优化查询。例如:

CREATE INDEX idx_customer_date ON orders (customer_id, order_date);

优化查询条件

避免在索引列上使用函数或进行计算。改写查询条件以利用索引。例如:

-- 避免SELECT * FROM orders WHERE YEAR(order_date) = 2023;

-- 改为SELECT * FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31';

使用覆盖索引

如果查询只涉及索引中的列,可以避免回表,提高性能。例如:

CREATE INDEX idx_covering ON orders (customer_id, order_date, order_id);
-- 查询只涉及索引中的列SELECT customer_id, order_date, order_id FROM orders WHERE customer_id = 123;

分解复杂查询

将复杂查询分解为多个简单查询,可以提高性能。例如:

-- 复杂查询SELECT * FROM orders o JOIN customers c ON o.customer_id = c.id WHERE c.name = 'John Doe';
-- 分解为两个简单查询SELECT id FROM customers WHERE name = 'John Doe';-- 假设查询结果为 123SELECT * FROM orders WHERE customer_id = 123;

实际示例

假设有一个 employees 表和一个 departments 表:

CREATE TABLE employees (    id INT AUTO_INCREMENT PRIMARY KEY,    first_name VARCHAR(50),    last_name VARCHAR(50),    department_id INT,    hire_date DATE,    INDEX (department_id),    INDEX (hire_date));
CREATE TABLE departments (    id INT AUTO_INCREMENT PRIMARY KEY,    name VARCHAR(50));

查询所有在某个日期后加入某部门的员工:

EXPLAINSELECT e.id, e.first_name, e.last_nameFROM employees eJOIN departments d ON e.department_id = d.idWHERE d.name = 'Sales' AND e.hire_date > '2023-01-01';

示例 EXPLAIN 输出:

+----+-------------+-------+--------+---------------+---------+---------+-------------------+------+--------------------------+| id | select_type | table | type   | possible_keys | key     | key_len | ref               | rows | Extra                    |+----+-------------+-------+--------+---------------+---------+---------+-------------------+------+--------------------------+|  1 | SIMPLE      | d     | const  | PRIMARY       | PRIMARY | 4       | const             |    1 |                          ||  1 | SIMPLE      | e     | ref    | department_id | department_id | 4 | const             |   10 | Using where              |+----+-------------+-------+--------+---------------+---------+---------+-------------------+------+--------------------------+

从 EXPLAIN 输出可以看出:

  • d 表使用了 PRIMARY 索引,类型为 const,表示是一个常量查找。

  • e 表使用了 department_id 索引,类型为 ref,表示引用查找。

进一步优化:

  • 如果查询频繁,可以为 departments.name 创建索引。

  • 确保 hire_date 上有索引。

优化后的索引创建:

CREATE INDEX idx_department_name ON departments (name);

再次执行 EXPLAIN:

EXPLAINSELECT e.id, e.first_name, e.last_nameFROM employees eJOIN departments d ON e.department_id = d.idWHERE d.name = 'Sales' AND e.hire_date > '2023-01-01';

优化后的输出可能显示更好的执行计划,减少查询时间。

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

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

相关文章

Linux 可视化管理工具:Webmin

😀前言 在 Linux 系统的运维管理中,命令行界面(CLI)是主要的操作方式。然而,对于许多系统管理员或开发者来说,使用 CLI 进行管理和维护任务并不总是最直观或最方便的方式。为了简化操作并提高效率&#xff…

LLama3本地部署安装

这篇教程将指导你如何在本机上安装 LLama3 客户端和可视化对话界面,我们会分为三部分:安装 LLama3 客户端、部署大模型和设置模型文件路径。 一、LLama3客户端安装 去 Ollama 官网下载 Ollama 客户端 Download Ollama on macOS 选择合适的操作系统平台…

Unity 编辑器-监听创建控件,prefab创建或添加组件的自动处理⭐

拓展控件 需求解决方案方案 需求 比如我想在添加Text时,自动添加一个脚本,用于处理多语言。在添加图片时,自动去掉raycast的勾选以节约性能损耗 解决方案 方案 ObjectFactory.componentWasAdded 用于监听组件的添加事件 using TMPro; us…

《基于智能化填报的单病种质量监测系统》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

Python在QtSide6(PyQt)上加载网页使用OpenCV进行图像处理

基本思路: 1.在Qt Designer中添加QWebEngineView,该组件可用于加载网页 2.在python中开启Timer事件,每10ms进行一次网页窗口截图(QWidget.grab) 3.将截图(QPixmap)转换为cv.mat,进行图像处理…

关于thinkPHP3.2中的rewrite不严谨问题会导致网站被注入以及nginx配置中的if多条件判断问题-阿里云阻止指host访问

一、关于thinkPHP3.2中的rewrite不严谨问题会导致网站被注入 thinkPHP3.2的rewrite问题,之前也没在意过,但是今天浏览了一下服务器的一套CMS的相关东西,因为这套CMS是使用thinkPHP3.2搭建的,在浏览代码时发现其目录架构与目前的流…

内网横向移动常用方法

横向移动 #横向移动含义 横向移动是以已经被攻陷的系统为跳板,通过收集跳板机的信息(文档,存储的凭证,ipc连接记录等等信息)来访问其他域内主机。#常见横向手段 1,通过相同的用户名密码批量ipc连接其他域内…

【C++二分查找 】1477. 找两个和为目标值且不重叠的子数组

本文涉及的基础知识点 C二分查找 C算法:滑动窗口总结 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode1477. 找两个和为目标值且不重叠的子数组 给你一个整数数组 arr 和一个整数值 target 。 请你在 arr 中找 两个互…

C语言 | Leetcode C语言题解之第368题最大整除子集

题目: 题解: int cmp(int* a, int* b) {return *a - *b; }int* largestDivisibleSubset(int* nums, int numsSize, int* returnSize) {int len numsSize;qsort(nums, numsSize, sizeof(int), cmp);// 第 1 步:动态规划找出最大子集的个数、…

Java | Leetcode Java题解之第371题两整数之和

题目&#xff1a; 题解&#xff1a; class Solution {public int getSum(int a, int b) {while (b ! 0) {int carry (a & b) << 1;a a ^ b;b carry;}return a;} }

【Python】函数内的全局变量关键字gobal值,在函数外调用,有块“免死金牌”

在python世界里&#xff0c;全局变量global关键字&#xff0c;在函数间的跳转&#xff0c;就像是被赋予独立于体系的全局者&#xff0c;拥有一块“免死金牌”。 他拥有一种特权——它只是函数内部的对象&#xff0c;但是却能在函数外&#xff0c;亮出自己身份的全局变量&#…

浅拷贝和深拷贝(图文详解)

前端面试中&#xff0c;面试官经常会提到关于浅拷贝和深拷贝的问题。但是我总是理解于它的表面&#xff0c;面试中再深挖一点就会卡壳&#xff0c;我想把我的理解写下来&#xff0c;希望可以帮助到大家&#xff0c;如果有错误的地方希望大家可以指正&#xff0c;以免误导~ 看这…

mysql的安装与初始化

mysql mysql5.7.40下载链接 mysql安装文档 1. 编译安装过程 yum install -y cmake # 安装cmake tar xf mysql-boost-5.7.40.tar.gz cd /root/mysql-5.7.40 cmake -LH # 查看cmake的默认参数&#xff0c;需要进入mysql目录 yum install -y gcc-c.x86_64 yum install -y bis…

漏洞挖掘 | 记一次伪静态页面的SQL注入

前言 最近工作繁忙&#xff0c;许久没有挖洞&#xff0c;打开度娘&#xff0c;凡事随缘&#xff0c;偶米头发~~(⊙﹏⊙) 涉及技能点 SQL注入基础原理 盲注常用函数及思路 burpsuite基础知识 过程记录 1.发现 在翻阅一EDU站点时&#xff0c;发现路径中带有明显的数字参数 …

Java语言程序设计基础篇_编程练习题*17.1 (创建一个文本文件)

题目&#xff1a;*17.1 (创建一个文本文件) 编写一个程序&#xff0c;如果文件 Exercise17_01.txt 不存在&#xff0c;就创建一个名为 Exercise17_01.txt 的文件。向这个文件追加新数据。使用文本 I/O 将 100 个随机生成的整数写入这个文件。文件中的整数用空格分隔。 习题思路…

Sqlite3数据库表内数据批量读取操作---sqlite3_stmt机制

0、引言 在前面两篇文章已经对数据环境搭建、数据批量写入库中进行了较为详细的讲解。因此&#xff0c;基于前两篇文章内容的基础上&#xff0c;本文主要从数据库中批量数据读取操作进行梳理讲解。 嵌入式数据库SQLite 3配置使用详细笔记教程_sqlite3-CSDN博客 SQLite 3 优化批…

TCP与UDP传输的学习

void *memset(void *s, int c, size_t n); 功能&#xff1a;将一块内存空间的每个字节都设置为指定的值&#xff1b;这个函数通常用于初始化一个内存空间&#xff0c;或者清空一个空间&#xff1b; 参数&#xff1a;viod * s 空类型指针&#xff0c;指向要填充内存块&#xf…

android13 隐藏状态栏里面的飞行模式 隐藏蓝牙 隐藏网络

总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题分析 3.代码分析 4.代码修改 5.编译运行 6.彩蛋 1.前言 android13 隐藏状态栏里面的飞行模式,或者其他功能,如网络,蓝牙等等功能,隐藏下图中的一些图标。 2.问题分析 这里如果直接找这个布局的话,需要跟的逻…

ubuntu /windows 安装COLMAP

目录 一、COLMAP简介 二、ubuntu安装COLMAP 三、windows安装COLMAP 一、COLMAP简介 COLMAP 是一款用于3D重建和图像处理的软件&#xff0c;它结合了计算机视觉算法和优化技术&#xff0c;用于从一组图像中构建三维结构。COLMAP 是一个全功能的通用视觉测距和三维建模工具&a…

免费的AI认证考试

努力保持领先地位 过去几年&#xff0c;科技行业发展速度越来越快&#xff0c;尤其是人工智能和大型语言模型(LLM) 的出现。 作为该领域的资深软件开发人员&#xff0c;我也注意到一个人的经验很快就会变得过时。 就在几年前&#xff0c;神经网络和深度学习风靡一时。虽然这…