Mysql重点思考(上)--mysql的索引优化

mysql的索引优化

  • expalin关键字的用法
    • explain索引优化示例
  • type列用法
    • 执行查询的顺序
    • 类型概述
  • 索引概念
    • 索引的定义
    • 索引的分类
    • 主键&唯一区别
  • 唯一索引的创建和查询
    • 创建一个唯一索引
    • 查询一个唯一索引
  • 场景题合集
    • 唯一索引的场景题
    • 主键索引的场景题(B+树)
    • 联合索引的场景题

expalin关键字的用法

explain索引优化示例

  • 下面是一个示例,假设我们有一个简单的表 users,包含两个字段 id 和 name,并且 id 字段上有一个索引:
CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50)
);

INSERT INTO users (id, name) VALUES (1, 'Alice'), (2, 'Bob'), (3, 'Charlie');

CREATE INDEX idx_id ON users (id);

  • 我们想要查询 id 为 2 的用户:
SELECT * FROM users WHERE id = 2;
  • 我们可以使用 EXPLAIN 命令来分析这个查询的执行计划:
EXPLAIN SELECT * FROM users WHERE id = 2;
  • 输出的信息
id  select_type  table  partitions  type  possible_keys  key    key_len  ref  rows  filtered  Extra
1   SIMPLE       users  NULL        const idx_id         idx_id  4        const 1     100.00    NULL

id:查询中每个 SELECT 子句的唯一标识符。如果查询中有多个子句,则每个子句都有一个唯一的标识符。这个字段并不直接影响查询的优化。
select_type:查询的类型,常见的值包括 SIMPLE、PRIMARY、DERIVED 等。SIMPLE 表示查询不包含子查询或联合查询,是最简单的查询类型。优化时通常关注于将查询转换为简单类型以提高性能。
通过分析这些字段,你可以了解查询执行情况、是否使用了索引以及查询效率。如有必要,优化查询语句和索引设计以提高性能。

type列用法

执行查询的顺序

const、eq_ref、ref、range、index、all。

类型概述

  • all:全表扫描,效率最低,应该尽量避免使用
  • index:通过完整索引扫描进行查询,效率较低,可能会导致全表扫描
  • range:通过索引范围进行查询,效率相对较低,但仍然比全表扫描要好
  • ref:使用非唯一索引进行查询,可能会返回多行结果,但效率仍然比较高
  • eq_ref:使用索引进行连接,只有一行匹配,效率较高
  • const:通过常量条件进行查询,是最理想的访问方式,通常表示数据库能够直接定位到唯一的行

索引概念

索引的定义

在一个字典中,你可以按照字母顺序快速查找单词,而不需要逐个查找。这就类似于在数据库表中使用索引来快速查找数据。字典中的字母顺序类似于索引中的排序规则,而单词类似于表中的数据。

索引的分类

  • 唯一索引

是指对一个表中的某个列创建索引,并且要求该列中的所有数据都是唯一的,也就是不能有重复的值。唯一索引可以提高查询效率、确保数据完整性,并防止重复的数据被插入到数据库中。(可有多个)。

  • 主键索引

是唯一索引的一种特殊类型。创建主键会自动创建主键索引。中的每个值是非空,唯一的。(主动对主键建立 B+树索引,以便快速定位和查找)

  • 聚簇索引(聚集索引)

按照索引的键值对表进行重排,使得数据的物理存储顺序和索引顺序一致。因此每个表只能有一个聚簇索引,且聚簇索引的键值不能包含空值。(一表只能有一个)。

  • 非聚簇索引(普通索引)

表中各行数据存放的物理顺序与键值的逻辑顺序不匹配,索引和表格数据分开存放,索引内存储的是指向对应数据所在位置的指针或行标识。聚索引比非聚索引有更快的数据访问速度。

  • 复合索引

联合索引同时考虑多个列的值,以创建一个索引结构。联合索引的作用是加快对多列组合条件的查询操作,例如在 WHERE 子句中涉及到多个列的查询条件。通过联合索引,数据库可以更快地定位到满足多个查询条件的数据行,提高查询性能。

主键&唯一区别

在这里插入图片描述

唯一索引的创建和查询

创建一个唯一索引

CREATE UNIQUE INDEX index_name ON table_name (column_name);

在这里插入图片描述

查询一个唯一索引

SELECT * FROM table_name WHERE unique_column = 'value';

场景题合集

唯一索引的场景题

假设有一个名为 users 的用户表,其中包含 id、username 和 email 等字段,现在要在 email 列上创建一个唯一索引,确保电子邮件地址的唯一性。下面是创建唯一索引并执行插入操作的 SQL 语句:

-- 创建唯一索引
CREATE UNIQUE INDEX idx_email ON users (email);

-- 尝试插入一条新记录,保证电子邮件地址的唯一性
INSERT INTO users (username, email) VALUES ('john_doe', 'john@example.com');

-- 尝试再次插入相同的电子邮件地址,会返回唯一性约束违反的错误
INSERT INTO users (username, email) VALUES ('jane_doe', 'john@example.com');

在这个示例中,创建了一个名为 idx_email 的唯一索引,然后尝试插入两条记录,第一条记录的电子邮件地址是 ‘john@example.com’,插入成功;而第二条记录尝试使用相同的电子邮件地址,但由于唯一索引的限制条件,插入操作会失败,并返回唯一性约束违反的错误。

主键索引的场景题(B+树)

CREATE TABLE products (
    product_id INT PRIMARY KEY,
    name VARCHAR(100),
    price DECIMAL(10, 2),
    stock_quantity INT
);

在这个解决方案中,我们在 products 表上创建了一个名为 product_id 的主键索引。这个主键索引将建立 B+ 树索引结构,使得在执行商品查找、浏览和购买操作时能够快速定位到目标商品。

联合索引的场景题

在这里插入图片描述

CREATE INDEX idx_user_created_at ON posts (user_id, created_at);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python下载bing每日壁纸并实现win11 壁纸自动切换

前言: 爬虫哪家强,当然是python 我是属于啥语言都用,都懂点,不精通,实际工作中能能够顶上就可以。去年写的抓取bing每日的壁纸,保存到本地,并上传到阿里云oss,如果只是本地壁纸切换,存下来就行,一直想做个壁纸站点&…

第四篇:3.3 无效流量(Invalid traffic) - IAB/MRC及《增强现实广告效果测量指南1.0》

翻译计划 第一篇概述—IAB与MRC及《增强现实广告效果测量指南》之目录、适用范围及术语第二篇广告效果测量定义和其他矩阵之- 3.1 广告印象(AD Impression)第三篇广告效果测量定义和其他矩阵之- 3.2 可见性 (Viewability)第四篇广…

火力发电必备:DeviceNET转Modbus TCP神技

在当今工业自动化领域,设备间的信息交流至关重要,其中Modbus协议由于其简单、开放和易于实施的特性,已经成为了事实上的行业标准。然而,随着技术的发展,对实时性、可靠性和数据传输速度的要求越来越高,尤其…

【C++航海王:追寻罗杰的编程之路】priority_queue(优先队列) | 容器适配器你知道哪些?

目录 1 -> priority_queue的介绍和使用 1.1 -> priority_queue的介绍 1.2 -> priority_queue的使用 1.3 -> priority_queue的模拟实现 2 -> 容器适配器 2.1 -> 什么是适配器 2.2 -> STL标准库中stack和queue的底层结构 2.3 -> deque的介绍 2.…

Error: Cannot find module ‘@rollup/rollup-win32-x64-msvc‘

1.背景 新项目需要使用vite搭建一个v3项目,之前也弄过,但项目创建后却一直无法跑起来,大聪明的我一直没有注意到这个问题 2.解决步骤 方案1:删除node_modules和package-lock.json文件重新npm install下包,部分码农通过这个步骤可解决 方案2:node版本或者npm版本不对,或者没…

android WMS服务

android WMS服务 WMS的定义 窗口的分类 WMS的启动 WindowManager Activity、Window、DecorView、ViewRootImpl 之间的关系 WindowToken WMS的定义 WMS是WindowManagerService的简称,它是android系统的核心服务之一,它在android的显示功能中扮演着…

作业9:编程练习

1.喝汽水问题 int Func(int money) {int total money;int empty money;while (empty > 1){total total empty / 2;empty empty / 2 empty % 2;}return total; } 2.打印菱形 将菱形看作三部分打印:上三角,中间,下三角 分别列出每一行…

http模块 设置资源类型(mime类型)

虽然浏览器自带websocket功能它会根据响应回来的内容自动去判断资源类型,但是我们加上了mime类型判断代码会更加规范些 一、mime类型概念: 媒体类型是一种标准,它用来表示文档。文件、字节流的性质和格式。HTTP服务可以设置响应头Content-T…

安装VS2022社区版

Visual Studio 2022 平台的使用 1.Visual Studio 的下载地址: https://visualstudio.microsoft.com/zh-hans/downloads/ 2.安装步骤简要记录 耐心等待安装完成 参考链接:Visual Studio 2022安装教程(非常详细),从零基础入门到精通&…

通过搜索引擎让大模型获取实时数据-实现类似 perplexity 的效果

文章目录 一、前言二、初衷三、实现方式四、总结 一、前言 汇报一下这周末的工作,主要是开发了一门课程:通过搜索引擎让大模型获取实时数据,第一次开发一门课程,难免会有很多不熟悉和做的不好的地方。 已经训练好的大模型有气数…

问卷调查技巧大揭秘:如何设计有效的问题?

做问卷调查技巧有:明确设计问卷的基本原则、制定清晰的研究目标、设计与选择问题、问卷实施和回收。 在实施市场研究、收集用户反馈或进行社会调查时,问卷调查是一种常用的方法。然而,设计和进行问卷调查需要一定的技巧和策略才能确保获得准…

【栈】单调栈与直方图中最大的矩形

一、单调递增栈&#xff1a; 用单调递增栈&#xff0c;当该元素可以入栈的时候&#xff0c;栈顶元素就是它左侧第一个比它小的元素。用于查找所要查找元素左侧第一个比它要小的数&#xff0c;以3 4 2 7 9为例&#xff1a; #include<iostream> #include<stack> usi…

Linux 常见性能分析方法论介绍(业务负载画像、下钻分析、USE方法论,检查清单)

写在前面 博文内容为 《BPF Performance Tools》 读书笔记整理内容涉及常用的性能调优方法论介绍&#xff1a;业务负载画像下钻分析USE方法论检查清单理解不足小伙伴帮忙指正 不必太纠结于当下&#xff0c;也不必太忧虑未来&#xff0c;当你经历过一些事情的时候&#xff0c;眼…

C++刷题篇——07检测热点字符

一、题目 二、解题思路 1、使用map&#xff0c;key为元素&#xff0c;value为出现的次数 2、由于sort不适用于map&#xff0c;因此要将map的key、value放到vector中&#xff0c;再对vector排序 3、对map排序&#xff1a;方法1&#xff1a;使用二维数组vector<vector<>…

第十三届蓝桥杯JavaA组省赛真题 - GCD

解题思路&#xff1a; 找规律 最大的最小公因数就是两数的差值 5 7 gcd2 1 3 gcd2 1 4 gcd3 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);long a scan.nextLong();long b scan.ne…

Unity类银河恶魔城学习记录11-10 p112 Items drop源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili ItemObject_Trigger.cs using System.Collections; using System.Collecti…

Django详细教程(一) - 基本操作

文章目录 前言一、安装Django二、创建项目1.终端创建项目2.Pycharm创建项目&#xff08;专业版才可以&#xff09;3.默认文件介绍 三、创建app1.app介绍2.默认文件介绍 四、快速上手1.写一个网页步骤1&#xff1a;注册app 【settings.py】步骤2&#xff1a;编写URL和视图函数对…

练习3-2 计算符号函数的值

对于任一整数n&#xff0c;符号函数sign(n)的定义如下&#xff1a; 请编写程序计算该函数对任一输入整数的值。 输入格式: 输入在一行中给出整数n。 输出格式: 在一行中按照格式“sign(n) 函数值”输出该整数n对应的函数值。 输入样例1: 10 输出样例1: sign(10) 1 输入样例…

文献阅读:通过 NeuronChat 从单细胞转录组推断神经元-神经元通信

文献介绍 「文献题目」 Inferring neuron-neuron communications from single-cell transcriptomics through NeuronChat 「研究团队」 聂青&#xff08;加利福尼亚大学欧文分校&#xff09; 「发表时间」 2023-02-28 「发表期刊」 Nature Communications 「影响因子」 16.6…

React系列之合成事件与事件处理机制

文章目录 React事件处理机制原生事件的事件机制事件代理&#xff08;事件委托&#xff09; 合成事件使用合成事件目的合成事件原生事件区别事件池 原生事件和React事件的执行顺序e.stopPropagation() React17事件机制的修改 React事件处理机制 react 事件机制基本理解&#xf…