当前位置: 首页 > news >正文

MySQL之索引优化

1、在进行查询时,索引列不能是表达式的一部分,也不能是函数的参数,否则无法使用索引
  • 例如下面的查询不能使用 actor_id 列的索引:

  • #这是错误的

  • SELECT actor_id FROM sakila.actor WHERE actor_id + 1 = 5;

  • 优化方式:可以将表达式、函数操作移动到等号右侧。如下:

  • SELECT actor_id FROM sakila.actor WHERE actor_id = 5 - 1;

  • 2、在需要使用多个列作为条件进行查询时,使用多列索引比使用多个单列索引性能更好
    • 例如下面的语句中,最好把actor_id 和 film_id 设置为多列索引。猿辅导有道题,详见链接,可以让理解更深刻。

    • SELECT film_id, actor_ id FROM sakila.film_actor

    • WHERE actor_id = 1 AND film_id = 1;

    • 3、让选择性最强的索引列放在前面。 见MySql最左前缀原则 索引的选择性是指:不重复的索引值和记录总数的比值。最大值为 1,此时每个记录都有唯一的索引与其对应。选择性越高,每个记录的区分度越高,查询效率也越高
      • 例如下面显示的结果中 customer_id 的选择性比 staff_id 更高,因此最好把 customer_id 列放在多列索引的前面。

      • 复制代码

      • SELECT COUNT(DISTINCT staff_id)/COUNT(*) AS staff_id_selectivity,

      • COUNT(DISTINCT customer_id)/COUNT(*) AS customer_id_selectivity,

      • COUNT(*)

      • FROM payment;

      • #结果如下

      • staff_id_selectivity: 0.0001

      • customer_id_selectivity: 0.0373

      • COUNT(*): 16049

      • 4、对于 BLOB、TEXT 和 VARCHAR 类型的列,必须使用前缀索引,只索引开始的部分字符。 前缀长度的选取需要根据索引选择性来确定
      • 5、索引包含所有需要查询的字段的值。具有以下优点: 索引通常远小于数据行的大小,只读取索引能大大减少数据访问量。 一些存储引擎(例如 MyISAM)在内存中只缓存索引,而数据依赖于操作系统来缓存。因此,只访问索引可以不使用系统调用(通常比较费时)。 对于 InnoDB 引擎,若辅助索引能够覆盖查询,则无需访问主索引
      • 6、mysql在使用like进行模糊查询的时候把%放后面,避免开头模糊查询 因为mysql在使用like查询的时候只有使用后面的%时,才会使用到索引
        • 如:'%ptd_' 和 '%ptd_%' 都没有用到索引;而 'ptd_%' 使用了索引。

        • 复制代码

        • #进行全表查询,没有用到索引

        • EXPLAIN SELECT * FROM `user` WHERE username LIKE '%ptd_%';

        • EXPLAIN SELECT * FROM `user` WHERE username LIKE '%ptd_';

        • #有用到索引

        • EXPLAIN SELECT * FROM `user` WHERE username LIKE 'ptd_%';

        • 复制代码

        • 再比如:经常用到的查询数据库中姓张的所有人:

        • SELECT * FROM `user` WHERE username LIKE '张%';

        • 7、在表中建立索引,优先考虑where、group by使用到的字段
        • 8、 尽量避免使用in 和not in,会导致数据库引擎放弃索引进行全表扫描
          • 比如:

          • SELECT * FROM t WHERE id IN (2,3)

          • SELECT * FROM t1 WHERE username IN (SELECT username FROM t2)

          • 优化方式:如果是连续数值,可以用between代替。如下:

          • SELECT * FROM t WHERE id BETWEEN 2 AND 3

          • 如果是子查询,可以用exists代替。如下:

          • SELECT * FROM t1 WHERE EXISTS (SELECT * FROM t2 WHERE t1.username = t2.username)

          • 9、尽量避免使用or,会导致数据库引擎放弃索引进行全表扫描
            • 如:

            • SELECT * FROM t WHERE id = 1 OR id = 3

            • 优化方式:可以用union代替or。如下:

            • SELECT * FROM t WHERE id = 1

            • UNION

            • SELECT * FROM t WHERE id = 3

            • 10、 尽量避免进行null值的判断,会导致数据库引擎放弃索引进行全表扫描
              • SELECT * FROM t WHERE score IS NULL

              • 优化方式:可以给字段添加默认值0,对0值进行判断。如下:

              • SELECT * FROM t WHERE score = 0

              • 11、尽量避免在where条件中等号的左侧进行表达式、函数操作,会导致数据库引擎放弃索引进行全表扫描
                • 例如:

                • SELECT * FROM t2 WHERE score/10 = 9

                • SELECT * FROM t2 WHERE SUBSTR(username,1,2) = 'li'

                • 优化方式:可以将表达式、函数操作移动到等号右侧。如下:

                • SELECT * FROM t2 WHERE score = 10*9

                • SELECT * FROM t2 WHERE username LIKE 'li%'

            • 12、当数据量大时,避免使用where 1=1的条件。通常为了方便拼装查询条件,我们会默认使用该条件,数据库引擎会放弃索引进行全表扫描
              • SELECT * FROM t WHERE 1=1

              • 优化方式:用代码拼装sql时进行判断,没where加where,有where加and。

            • 13、建立索引后,查询时不会扫描全表,而会查询索引表锁定结果
            • 14、在数据库进行DML操作的时候,除了维护数据表之外,还需要维护索引表,运维成本增加
            • 15、选用选择性高的字段作为索引,一般unique的选择性最高
            • 16、复合索引:选择性越高的排在越前面。(左前缀原则);
            • 17、如果查询条件中两个条件都是选择性高的,最好都建索引
            • 18、 数据类型出现隐式转换时也不会使用索引
              • 让我们对上一个例子中的表增加一个 AGE 索引。

              • CREATE TABLE `test_index_table` (

              • `id` int(11) NOT NULL AUTO_INCREMENT,

              • `name` varchar(45) DEFAULT NULL,

              • `birthday` datetime DEFAULT NULL,

              • `address` varchar(45) DEFAULT NULL,

              • `phone` varchar(45) DEFAULT NULL,

              • `note` varchar(45) DEFAULT NULL,

              • `age` varchar(11) DEFAULT NULL,

              • PRIMARY KEY (`id`),

              • KEY `NAME_ADDRESS` (`name`,`id`) USING BTREE,

              • KEY `AGE` (`age`) USING BTREE

              • ) ENGINE=InnoDB AUTO_INCREMENT=283 DEFAULT CHARSET=utf8

              • 尝试使用下面的 sql 语句进行查询

              • explain SELECT * FROM test.test_index_table where age = 26

              • 由于表中的 age 是 VARCHAR 类型。而在 sql 语句中我们使用的是数字类型 26。MYSQL 默认会把输入的常量值进行转换以后才进行检索。现在我们通过 explain 看看这个语句的分析结果

            • 19、查看索引使用情况
              • show status like 'handler_read%';

            • 20、mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。    因此数据库默认排序可以符合要求的情况下不要使用排序操作,尽量不要包含多个列的排序,如果需要最好给这些列建复合索引

相关文章:

MySQL之索引优化

1、在进行查询时,索引列不能是表达式的一部分,也不能是函数的参数,否则无法使用索引 例如下面的查询不能使用 actor_id 列的索引: #这是错误的 SELECT actor_id FROM sakila.actor WHERE actor_id 1 5; 优化方式:…...

Spring Boot 与 Amazon S3:快速上传与下载文件的完整指南

概要 在将 Spring Boot 更新到 3 系列时,由于 javax 需要被替换为 jakarta,因此原先依赖于 javax 的 spring-cloud-starter-aws1 将无法使用(虽然在我本地环境中仍然可以正常工作)。为了确保兼容性,我将依赖关系更改为…...

细节剖析:HTTP与HTTPS在安全性、性能等方面的不同!

HTTPS是现代互联网通信的重要基石,通过加密通信、身份验证和数据完整性保护,为数十亿用户提供了安全可靠的互联网体验。 小编整理了2GB程序员相关资料,关注微信公众号“程序员Style”回复“程序员”免费领取! 1、介绍 随着 HTT…...

MySQL面试篇章——MySQL索引

文章目录 MySQL 索引索引分类索引创建和删除索引的执行过程explain 查看执行计划explain 结果字段分析 索引的底层实现原理B-树B树哈希索引 聚集和非聚集索引MyISAM(\*.MYD,*.MYI)主键索引辅助索引(二级索引) InnoDB&a…...

WSL 2 Oracle Linux 9.1 安装配置

文章目录 环境使用体验安装 Oracle Linux 9.1修改默认存储路径默认 root 用户登录启用 systemd启用 SSH 连接WSL 无法 ping 通宿主机和域名WSL 使用主机代理(测试通过)WSL 常用命令 环境 OS:Win11 24H2 (OS 内部版本26120.1252) wsl --versio…...

MySQL日志文件详解

MySQL中的日志文件是MySQL数据库系统的重要组成部分,它们记录了数据库的运行情况、用户操作、错误信息等,对于数据库的维护、优化、故障排查和恢复都具有重要意义。以下是MySQL中几种主要日志文件的详解: 1. 二进制日志(Binary L…...

MySQL零散拾遗(三)

在mysql中,JOIN ON 和 WHERE 的作用和用法是怎么样的? 在MySQL中,JOIN语句用于将两个或多个表根据指定的关联条件合并成一个新的结果集。JOIN ON和WHERE子句在JOIN语句中扮演着不同的角色,它们的用法和作用如下: JOI…...

鸿蒙 使用 Refresh 实现下拉刷新

import promptAction from ohos.promptActionEntry Component struct Index {Staterefreshing: boolean falseStatelist: number[] Array(20).fill(Date.now())Buildercontent(){Stack(){Row(){LoadingProgress().height(32)Text(正在刷新...).fontSize(16).margin({left:20}…...

【JavaScript 算法】图的遍历:理解图的结构

🔥 个人主页:空白诗 文章目录 一、深度优先搜索(DFS)深度优先搜索的步骤深度优先搜索的JavaScript实现 二、广度优先搜索(BFS)广度优先搜索的步骤 三、应用场景四、总结 图的遍历是图论中的基本操作之一&am…...

Ubuntu 中默认的 root 用户密码

场景:想要切换root用户,发现得输入密码,以为是以前设置过然后一直尝试都是错误【认证失败】最后发现根本没设置过root用户,默认会随机生成root用户的密码😅 Ubuntu 中默认的 root 密码是随机的,即每次开机都…...

Rust编程-高级特性

unsafe:内存不安全 内存安全问题,例如空指针解引用 关键字unsafe来切换到不安全模式,并在被标记后的代码块中使用不安全代码 使用unsafe告诉编译器后面代码安全性自行负责 因为电脑硬件安全问题,必须编写可能不安全的代码 可以将…...

JavaRegexImprove练习(1) (2024.7.22)

ImproveExercise1 package RegexImprove20240722; import java.util.Scanner; public class ImproveExercise {public static void main(String[] args) {Scanner sc new Scanner(System.in);System.out.println("请输入一个字符串");String str sc.nextLine();//…...

基于YOLO模型的鸟类识别系统

鸟类识别在生物研究和保护中具有重要意义。本文将详细介绍如何使用YOLO(You Only Look Once)模型构建一个鸟类识别系统,包括UI界面、YOLOv8/v7/v6/v5代码以及训练数据集。 目录 2. 环境配置 2.1 安装Python和相关库 2.2 安装YOLO模型库 …...

WebRTC通话原理(SDP、STUN、 TURN、 信令服务器)

文章目录 1.媒体协商SDP简介 2.网络协商STUN的工作原理TURN工作原理 3.信令服务器信令服务器的主要功能信令服务器的实现方式 1.媒体协商 比如下面这个例子 A端与B端要想通信 A端视频采用VP8做解码,然后发送给B端,B端怎么解码? B端视频采用…...

面试场景题系列--(1)如果系统的 QPS 突然提升 10 倍该怎么设计?--xunznux

1. 如果系统的 QPS 突然提升 10 倍该怎么设计? 1.1 硬件的扩展微服务的拆分 如果所有的业务包括交易系统、会员信息、库存、商品等等都夹杂在一起,当流量一旦起来之后,单体架构的问题就暴露出来了,机器挂了所有的业务就全部无法…...

【数学建模】——前沿图与网络模型:新时代算法解析与应用

目录 1.图与网络的基本概念 1. 无向图和有向图 2. 简单图、完全图、赋权图 3. 顶点的度 4. 子图与图的连通性 2.图的矩阵表示 1. 关联矩阵 2. 邻接矩阵 3.最短路问题 1.Dijkstra 算法 2.Floyd 算法 4.最小生成树问题 1.Kruskal 算法 2.Prim 算法 5.着色问题 6.…...

视频分帧【截取图片】(YOLO目标检测【生成数据集】)

高效率制作数据集【按这个流程走,速度很顶】 本次制作,1059张图片【马路上流动车辆】 几乎就是全自动了,只要视频拍得好,YOLO辅助制作数据集就效率极高 视频中的图片抽取: 【由于视频内存过大,遇到报错执行…...

Redis7(二)Redis持久化双雄

持久化之RDB RDB的持久化方式是在指定时间间隔,执行数据集的时间点快照。也就是在指定的时间间隔将内存中的数据集快照写入磁盘,也就是Snapshot内存快照,它恢复时再将硬盘快照文件直接读回到内存里面。 RDB保存的是dump.rdb文件。 自动触发…...

发布支持TS的npm包

你现在有这么一个包,已经将他发布在npm上了,周下载量也还比较可观。美中不足的就是,这个包之前使用js写的,现在你想增加TS类型,提升用户使用体验,那么你现在可以做以下几个步骤 1.在你的包的根目录下创建一…...

计算机视觉9 全卷积网络

全卷积网络(Fully Convolutional Network,简称 FCN)在计算机视觉领域具有重要地位。 传统的卷积神经网络(CNN)在最后的输出层通常使用全连接层来进行分类任务。然而,全连接层会丢失空间信息,使得…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

Bean 作用域有哪些?如何答出技术深度?

导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答&#xff0c…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…...

(12)-Fiddler抓包-Fiddler设置IOS手机抓包

1.简介 Fiddler不但能截获各种浏览器发出的 HTTP 请求&#xff0c;也可以截获各种智能手机发出的HTTP/ HTTPS 请求。 Fiddler 能捕获Android 和 Windows Phone 等设备发出的 HTTP/HTTPS 请求。同理也可以截获iOS设备发出的请求&#xff0c;比如 iPhone、iPad 和 MacBook 等苹…...

Monorepo架构: 项目管理模式对比与考量

关于 monorepo 相关概念及项目管理模式 在软件开发中&#xff0c;尤其是前端项目&#xff0c;我们会涉及到不同的项目管理模式&#xff0c;这里先介绍几个重要的概念“monorepo”是当前较为热门的一种项目管理方式&#xff0c;虽然很多人可能听说过&#xff0c;但可能在实际项…...

【汇编逆向系列】四、函数调用包含单个参数之Double类型-mmword,movsd,mulsd,addsd指令,总结汇编的数据类型

一、汇编代码 上一节开始&#xff0c;讲到了很多debug编译独有的汇编方式&#xff0c;为了更好的区分release的编译器优化和debug的区别&#xff0c;从本章节开始将会提供debug和release的汇编用作对比 Debugb编译 single_double_param:00000000000000A0: F2 0F 11 44 24 08…...