如何让带参数变量的mysql查询走索引?

news/2024/9/23 11:59:17

1,问题的提出

mysql 5.7的数据库,jx_performance表含索引idx_performance。该索引关联两个字段:`date`, `user_id`。

在运行sql语句时发现,如果where条件采用参数变量,则查询不走索引。

 

 图1,带参数变量查询

 

 图2,采用字符串常数查询

 

上图1和图2,实际上查询条件一样,因为查询前采用了如下赋值方式:

set @LZJ_id='5ff67822d08e51e7609d073a';
set @lastMonth='2024-08';

 

因此二者返回的数据也一样,但是采用带参数的查询(图1)明显耗时太长。

2,原因分析

 为什么如此奇怪?明明查询条件一样,只是写法不一样,查询耗时就能相差几千倍?

采用explain分析语句如下:

上述对比发现,采用参数变量的查询,没有走索引,虽然相关查询字段都在索引中。

 

为什么mysql会采用这种策略呢?令人费解。

网上查询了些说法,大致是有计算、数据类型不一致等等,我对比发现不存在这些问题。

也有说加强制索引的,尝试了发现无效。如下图:

 

3,解决方案

山重水复疑无路,柳暗花明又一村。

经过思考,我觉得问题可能还是出在 变量参数的类型上,我在set 变量前,未声明变量类型,可能导致查询优化器无法使用索引。

有此怀疑,立即将参数变量的赋值改写为如下:

declare lastMonth varchar(50);
declare LZJ_id varchar(50);set LZJ_id='5ff67822d08e51e7609d073a';
set lastMonth='2024-08';

 

结果表明,带参数变量的查询也能走索引了!查询速度大大提高,问题得到解决。

 

4,总结

mysql中使用set语句给变量赋值非常方便,因此经常不写declare语句。

但是,直接 set产生的变量,在查询时很可能导致不走索引,带来严重的性能问题。

另外,本文可能只是表面解决了,深层次的原因依然还是未知,留待后续补充吧。

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

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

相关文章

大发明家

(彩蛋:大样例是从数据里扒的,且没有绑点)。 由于组题人电脑坏了,所以只能写简略题解了(其实是组题人的口胡碎碎念),写的不清晰的和部分分可以听讲题(可能有一些地方我下意识省略了,可以来问我). 首先,生成到完美的时间线的概率是固定的,如果我们假设概率为 \[p = \frac{|完…

acme+cloudflare生成免费证书(自动续期)

acme DNSapi acme DNSapi的作用是在申请证书时使用dns交易,acme可以通过dnsapi在对应的dns管理平台提交对应的dns记录。玩过证书的朋友都知道,证书申请时有三种验证方式邮箱验证:需要邮箱与域名绑定(细节要求我没试过) 文件验证:文件验证时证书管理方会要求你在服务器的指…

pip install volcengine-python-sdk[ark]

解决方案: 需要修改注册表的变量 https://github.com/volcengine/volcengine-python-sdk/issues/5

python面试题

python是什么?Python是一种开放原始码、直译式、可携式、面向对象的程序语言,具有模块、多线程、异常处理以及自动内存管理功能。广泛应用包括Web开发(如Django和Flask框架)、数据科学(如Pandas和NumPy库)、机器学习(如TensorFlow和PyTorch框架)、自动化脚本、科学计算…

基于gin的web开发脚手架模版

一、web开发模式 1.传统的MVC模式:这个模式不太适合大型的web应用。 2.CLD模式链接:https://github.com/Ruan0423/gin-web-Framework 二、目录结构 --web_app-controller-logic-dao-mysql-redis-models-pkg-settingssettings.go-routersrouter.gomain.gogo.modgo.sumconfig.y…

OpenAI o1模型揭秘:通过LLMs学习推理能力

OpenAI推出了o1,这是一种通过强化学习训练的大型语言模型,专门用于进行复杂的推理任务。o1在回答问题之前会“思考”,能够在响应用户之前生成一条长的内部思维链。 在编程竞赛问题(Codeforces)中,OpenAI o1的排名在89%分位,位列美国数学奥林匹克预选赛(AIME)前500名学…

网站数据库为什么连接失败

网站数据库连接失败可能有以下几个常见原因:数据库配置错误:数据库连接参数配置错误,如用户名、密码、主机地址、端口号、数据库名称等配置不正确。 应用程序中的数据库配置文件(如WordPress中的wp-config.php)可能包含了错误的信息。网络问题:数据库服务器与应用程序服务…

Spark(五)运行环境(一)

Local模式不需要其他任何节点资源就可以在本地执行Spark代码的环境,一般用于教学,调试,演示等 在IDEA中运行代码的环境称之为开发环境1、解压缩文件将spark-3.0.0-bin-hadoop3.2.tgz文件上传到Linux并解压缩,放置在指定位置,路径中不要包含中文或空格 压缩文件放在/opt/so…