SQL 优化(一):慎用 SQL 函数

news2024/9/29 23:28:27

假如有下面这样一张用户表

CREATE TABLE `t_user` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) DEFAULT NULL,
  `sex` tinyint(1) DEFAULT NULL,
  `mobile` varchar(45) DEFAULT NULL,
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`user_id`),
  KEY `idx_create_time` (`create_time`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=100001 DEFAULT CHARSET=utf8mb4

现在如果要查询在 7 月份创建的数据,我们的 SQL 可能这样写

select * from t_user where month(create_time) = '7' limit 1,10

接着我们使用explain查看这条 SQL 的执行计划

可以看到,该 SQL 并没有使用索引,这是为什么呢?

由于我们这里的索引,使用的是 B+ Tree,而 B+ Tree 提供的快速定位能力,是由于 B+ Tree 同源节点是有序的,这一特性保证的

借用丁奇的《MySQL45讲》中的图,如果我们使用where create_time = '2018-7-1'的话,就能根据下图绿色箭头快速从索引中定位到create_time='2018-7-1'这条记录

但是用where month(create_time)='7',在树的第一层的时候就不知道怎么办了,因此对索引字段做函数操作的话,可能会破坏索引值的有序性,因此优化器就放弃走树索引

需要注意的是,优化器只是放弃走树索引,并不是放弃使用这个索引, 如下面的 SQL

select count(*) from t_user where month(create_time) = '7'

使用explain查看这条 SQL 的执行结果

可以看到,扫描的函数还是 10w 行,但是Using index表示该 SQL 使用了覆盖索引,因为count(*) 统计行数的时候,可以直接在idx_create_time索引树上进行统计

那么有什么优化方案呢?还是查找 7 月份的数据,我们可以讲 SQL 改写成下面这种形式

select * 
from t_user
where (create_time >= '2021-07-01' and create_time <= '2021-07-31')
	or (create_time >= '2022-07-01' and create_time <= '2022-07-31')
  or (create_time >= '2023-07-01' and create_time <= '2023-07-31');

到这里,我们知道函数不走索引的原因是因为索引破坏了树结构的有序性,那么,如果我们使用的函数不会破坏树结构的有序性呢?MySQL 还会走索引吗?比如下面的语句

select * from t_user where user_id + 1 = 1000;

同样的,使用explain查看执行结果

可以看到,MySQL 还是不走索引,这就属于 MySQL 的偷懒行为啦,只要有函数操作,MySQL 就不走索引,为了使语句走索引,我们需要将 SQL 语句改写成下面这样

select * from t_user where user_id = 1000 - 1;

关注公众号:huangxy,一起学习,一起进步

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

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

相关文章

Linux系统下查看网卡配置和网络流量监控指令:ifconfig、ethtool

文章目录 1 查看/设置网卡&#xff08;ifconfig&#xff09;2 查看网卡配置、属性&#xff08;ip、ethtool&#xff09;3 查看网络接口配置情况&#xff1a;4 查看网络接口属性信息5 测试网路通信&#xff08;ping&#xff09; 6 查看具体网卡配置文件 1 查看/设置网卡&#xf…

Unity | HDRP高清渲染管线学习笔记:Lightmapping(光照烘焙)与Lightmap(光照贴图)

目录 相关概念 1.渐进式光照贴图烘焙 1.1 渐进式光照贴图烘焙对模型的要求 1.2 渐进式光照贴图烘焙对硬件的要求 1.3 渐进式光照贴图烘焙支持的Unity渲染管线 1.4 进行渐进式光照贴图烘焙结果 1.5 渐进式光照贴图烘焙的CPU版本和GPU版本 1.6 Lighting窗口Lightmapping …

2023MWC上海|平行云邀您一起聊聊“未来数字世界中的社交,游戏与娱乐”

“世界移动通信大会&#xff08;MWC上海&#xff09;&#xff0c;自2012年落户上海以来已经举办9届&#xff0c;是中国乃至亚太区域移动产业向世界展示最新发展成果与发展战略的关键平台。2023年MWC上海将于2023年6月28-30日在上海新国际博览中心举行&#xff0c;主题是“时不我…

Spring 更简单的读取和存储对象、使用注解存取对象

文章目录 1.前言2.存储 Bean对象2.1 前置任务&#xff1a;配置扫描路径&#xff08;重中之重&#xff09;2.2 添加注解存储 Bean 对象2.2.1 类注解2.2.2 方法注解 Bean 3.获取 Bean对象3.1 属性注入3.2 构造方法注入3.3 Setter 注⼊3.4 三种注释的优缺点3.5 另⼀种注⼊关键字&a…

python学习——时间序列

目录 1 生成时间1.1 pd.Timestamp1.2 pd.to_datetime 最常用1.2.1 单个转换为时间戳1.2.2 多个时间转换为时间戳1.2.3 日期在前 dayfirst1.2.4 处理特殊格式 format1.2.5 处理无效时间 errors1.2.6 和timestamp互转 1.3 固定跨度时间的生成 pd.date_range 2 时间格式转换 .dt.s…

AI工具在不同领域的应用范围分享,让我们一起了解

随着人工智能技术的不断发展&#xff0c;越来越多的领域开始应用AI工具来解决问题、提高效率和创造力。无论是在医疗、金融、教育还是其他行业&#xff0c;AI工具都展现出了巨大的潜力和价值。今天&#xff0c;我将分享一些常见的AI工具在不同领域的应用范围&#xff0c;让我们…

Consul:什么是Consul? ①

一、思想 微服务、分布式应用的特点就是拆分&#xff0c;拆分带来的问题就是服务器数量成倍增多&#xff0c;两个很重要的原因&#xff0c;需要抽离出来一个项目专门管理这些服务信息。 1、对信息的管理思想&#xff0c;统一化、中心化一直是一套比较常规成熟的标准。 2、并且它…

开源工具系列8:Spring Security

Spring Security 是一套认证授权框架, 支持认证模式如 HTTP BASIC 认证头 (基于 IETF RFC-based 标准), HTTP Digest 认证头 ( IETF RFC-based 标准), Form-based authentication (用于简单的用户界面), OpenID 认证等, Spring Security使得当前系统可以快速集成这些验证机制亦…

Matplotlib---等高线图

1. 等高线图 等高线图&#xff1a;也称水平图&#xff0c;是一种在二维平面上显示 3D 图像的方法。 x np.linspace(-5, 5, 100) y np.linspace(-5, 5, 100)# 将上述数据变成网格数据形式 X, Y np.meshgrid(x, y)# 定义Z与X, Y之间的关系 Z np.sqrt(X**2 Y**2)# 画等高线…

Win11 系统Java17的安装教程:最新版JDK 17.07下载、安装、卸载详解

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

如何利用AI高效率快速调色

在设计行业中&#xff0c;时间是非常宝贵的资源&#xff0c;而设计师们常常需要应对繁忙的工作日程和紧迫的截止日期。为了提高工作效率和节省时间&#xff0c;越来越多的设计师开始利用人工智能&#xff08;AI&#xff09;技术中的高效调色功能。本文将介绍如何利用AI高效率快…

震惊!国产AI模特已经可以做到这个程度了,未来可期

自从GhatGPT火了之后 AI就成为网络热词 并且渗透到各行各业中 你敢相信下面这些图模特图 竟然都是AI生成的&#xff01; 简直不要太逼真 这次AI真的可以取代一部分模特了 假人模特 神采PromeAI生成 神采PromeAI生成 从生成效果来看 AI模特已非常接近真人 对于电商企业或…

springboot开发PC端桌面应用

一、需求描述&#xff1a; 1、要求桌面能在window、Linux和macos系统上运行 2、用户自定义数据筛选策略&#xff0c;策略可通过excel导入导出 3、选择多个excel文件通过策略过滤生成新的excel 二、技术选型及集成环境配置&#xff1a; 1、PC端跨平台直接选用javafx来作为桌…

go实现的简单压测工具

1、参数概览 依赖github.com/ddliu/go-httpclient进行http接口请求 依赖github.com/antlabs/pcurl解析curl 输入参数&#xff1a; -c&#xff0c;concurrency&#xff0c;并发数&#xff0c;启动协程数-n&#xff0c; totalNumber&#xff0c;单个协程发送的请求个数-u&…

Zookeeper源码解析(上)

序&#xff1a; Zookeeper最早起源于雅虎研究院的一个研究小组&#xff0c; 在当时&#xff0c; 研究人员发现&#xff0c;在雅虎内部有很大大型的系统都是需要一个依赖一个类似的系统来进行分布式协调&#xff0c;但是在系统往往都存在分布式单点问题&#xff0c;所以雅虎的开…

佩戴舒适度极好的蓝牙耳机推荐,五款佩戴舒适的蓝牙耳机推荐

​说到真无线蓝牙耳机&#xff0c;很多人会问音质表现好不好&#xff0c;佩戴上耳舒适性怎么样&#xff1f;等等问题。面对这些常会问的问题&#xff0c;我总结出来&#xff0c;也整理出来几款质量好、佩戴舒适的蓝牙耳机给大家&#xff0c;来看看有哪些。 一、南卡OE PRO开放…

安装SSL证书会拖慢网站访问速度吗?

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言什么是SSL证书SSL证…

Python程序设计基础:程序流程控制(一)

文章目录 一、条件表达式1、关系运算符2、逻辑运算符3、条件表达式 二、选择结构1、单分支结构if语句2、双分支结构if-else语句3、多分支结构if-elif-else语句4、嵌套的if结构 一、条件表达式 程序流程的基本结构主要有三种&#xff0c;顺序结构、选择结构和循环结构&#xff…

5.3.3 绝对路径与相对路径

除了需要特别注意的FHS目录配置外&#xff0c;在文件名部分我们也要特别注意。因为根据文件名写法的不同&#xff0c;也可将所谓的路径&#xff08;path&#xff09;定义为绝对路径&#xff08;absolute&#xff09;与相对路径&#xff08;relative&#xff09;。 这两种文件名…

Java IO 学习总结(五)OutputStreamWriter

Java IO 学习总结&#xff08;一&#xff09;输入流/输出流 Java IO 学习总结&#xff08;二&#xff09;File 类 Java IO 学习总结&#xff08;三&#xff09;BufferedInputStream Java IO 学习总结&#xff08;四&#xff09;BufferedReader 缓冲字符流 Java IO 学习总结&…