Mysql篇——SQL优化

server/2025/3/19 0:53:10/

本篇将带领各位了解一些常见的sql优化方法,学到就是赚到,一起跟着练习吧~

SQL优化

准备工作

准备的话我们肯定是需要一张表的,什么表都可以,这里先给出我的表结构(表名:userinfo)

通过sql查看我们的表里面总共有2百万条数据,当然我这儿的数据量不是很多,但是练习用也够了~

这些准备好之后我们就可以正式进行练习阶段了~

练习

场景1:查出数据库里面所有姓王的且性别是女的数据,sql语句这么写:

select * from userinfo where username like "王%" and gender="女";

查询结果耗时2s多,这还是200w条数据的情况下,显然这个速率是不行的,所以先加个索引试试:

create index idx_name_gender on userinfo(username,gender);

再查询发现整个运行时间直接降低到了0.6s左右 ,后续查询直接稳定到0.3s左右,这相对第一次查询已经有了很大的提升

从执行计划中我们也可以看到走了索引而且使用索引下推加快查询:

当然,你也可以通过开启缓存,下次这条sql语句就会直接从缓存里面读取数据,速度应该会更快一些,当然我这儿没有做实验,感兴趣的可以去试试~

场景2:分页查询,每页20条数据,查询第10000页的数据,并按照id进行升序排列

sql语句可以这么写:

select * from userinfo order by id ASC LIMIT 199980,20;

查询耗时稳定都按差不多在0.4s左右,这里就不截图了,你可以自己试一下,当然我这是在数据量不多的情况下的查询结果,如果数据量过大的话那么查询分页耗时一定会比这个大的多。

这里拓展一点知识:

sql>mysql查询这条sql语句的时候,不止会查询当前页码的数据,它是从头开始查,比如你的limit是这样的-》limit n,m  那么mysq就会查询n+m条数据,然后舍弃掉前n条数据,这显然查询前n条数据是没有必要且浪费时间的,也会为什么查询速度慢的原因,读到这儿你应该有点儿印象,没错这就是sql>mysql里面的深分页问题。

解决办法可以通过子查询或者寻找那一页的最小的id通过大于判断查询,比如说:

子查询:

select * from userinfo where id in (select id from userinfo LIMIT 199980,20) order by id ASC;

这条sql语句我这个版本的运行不了,你可以先试试~(手动狗头)

我们都知道,sql慢了考虑加索引,但是如果sql设计不当也会导致索引失效的情况,这里给你列出一些常见的索引失效的情况,借鉴借鉴~

索引失效

  •  索引字段使用函数
  • 索引字段使用or连接且or的后面添加了>或者<
  • 索引使用了!=(这个不是绝对的,还得看执行计划)
  • 未遵循最左匹配原则
  • 使用了IS NULL或者IS NOT NULL
  • 隐式字段转换(例外:如果字段num类型为int,查询num='1'不会导致索引失效,因为sql>mysql会将参数转化为int类型)
  • 使用了order by(可能走索引,可能使用filesort,数据量小的时候直接走内存查数据了)
  • 使用了in(可能走索引,数据量小的话走索引优化)

.........

最后,既然是优化那肯定是出现了慢sql,那慢sql出现的可能原因我们得提前知道然后尽量杜绝:

sql

  • 表设计不合理
  • 表数据量过大
  • 索引设计区分度不高
  • 索引失效
  • 多表join
  • 回表次数太多

.........

当然,还有其他情况这里没有列出来的,各位可以在评论区进行补充,我们共同学习~


http://www.ppmy.cn/server/175764.html

相关文章

《C#上位机开发从门外到门内》3-2::Modbus数据采集系统

文章目录 **1. 项目概述****1.1 项目背景****1.2 项目目标****1.3 技术栈** **2. 系统架构设计****2.1 系统架构图****2.2 模块功能** **3. 数据采集模块实现****3.1 Modbus协议简介****3.2 数据采集流程****3.3 代码实现** **4. 数据存储模块实现****4.1 数据库设计****4.2 数…

本地部署Deep Seek-R1,搭建个人知识库——笔记

目录 一、本地部署 DeepSeek - R1 1&#xff1a;安装Ollama 2&#xff1a;部署DeepSeek - R1模型 3&#xff1a;安装Cherry Studio 二、构建私有知识库 一、本地部署 DeepSeek - R1 1&#xff1a;安装Ollama 1.打开Ollama下载安装 未科学上网&#xff0c;I 先打开迅雷再下…

使用 Flask 进行简单服务器改造的详细步骤和代码

以下是一个使用 Flask 进行简单服务器改造的详细步骤和示例代码。Flask 是一个轻量级的 Python Web 框架&#xff0c;非常适合快速搭建 Web 服务器。 1. 安装 Flask 首先&#xff0c;确保你已经安装了 Python&#xff0c;然后使用 pip 来安装 Flask&#xff1a; pip install…

Django连接MySQL

Django连接MySQL 文章目录 Django连接MySQL[toc]一、命令行安装mysql客户端二、下载安装MySQL三、MySQL基本配置四、Django配置 一、命令行安装mysql客户端 1.安装pymysql和mysqlclient&#xff0c;并验证查看 python -m pip install pymysql python -m pip install mysqlcli…

PHP语言的死锁

PHP语言中的死锁现象探析 引言 在现代的计算机科学中&#xff0c;并发编程是一个重要的领域。随着多核处理器的发展&#xff0c;越来越多的应用程序需要同时处理多个任务。PHP作为一种广泛使用的服务器端脚本语言&#xff0c;在处理并发请求时&#xff0c;死锁现象成为了一个…

基于jspm校园安全管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 随着信息时代的来临&#xff0c;过去信息校园安全管理方式的缺点逐渐暴露&#xff0c;本次对过去的校园安全管理方式的缺点进行分析&#xff0c;采取计算机方式构建校园安全管理系统。本文通过阅读相关文献&#xff0c;研究国内外相关技术&#xff0c;提出了一种集安全教…

PostgreSQL 多数据库集簇配置及多数据库复制方法【流程+代码实例】

PostgreSQL 多数据库集簇配置及多数据库复制方法 1. 多数据库集簇配置 安装下载完postgresql后&#xff0c;系统此时包含一个postgres用户和一个名为postgres的默认数据库。 PostgreSQL 基本命令 服务管理命令 # 停止和启动及重启PostgreSQL服务 sudo systemctl stop postgr…

硬件驱动——51单片机:寄存器、LED、动态数码管

目录 一、51单片机 1.寄存器 二、LED点灯 1.原理 2.封装函数 3.顺序点灯 4.特定位点灯 三、动态数码管 1.原理 2.封装函数 3.0~9跳变 4.顺序移位0~9跳变 一、51单片机 1.寄存器 51单片机共40个引脚&#xff0c;其中P0,P1,P2,P3是四个有8引脚的寄存器&#xff0…