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产生的变量,在查询时很可能导致不走索引,带来严重的性能问题。

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

posted @ 2024-09-23 11:58 jack0424 阅读(15) 评论(0) 推荐(0) 编辑
摘要: 1,问题的提出 采用vue做手机评分页面的前端,页面显示多个评分项的分数和总分。 每个评分项有个修改按钮,按下后弹出新的页面,用户填写分数后按提交按钮,则保存数据、关闭页面、回到前一页。 此时,页面上显示的分数和总分会刷新,但是显示的页面位置未保留修改前的位置,而是回到了顶部显示。 这种情况如果页面 阅读全文
posted @ 2023-07-26 15:35 jack0424 阅读(837) 评论(0) 推荐(0) 编辑
摘要: 1, 问题描述 某vue2.6前端,采用el-table显示从数据库中取出的表格内容。 发现其中带有换行符的字符串,在el-tabel中的栏位中显示时,并不换行,而是转为了空格。 于是在网上查找相关解决方案,种种方案均指出,要设置 el-table的 cell的属性,以保留其换行特性。 .el-ta 阅读全文
posted @ 2023-06-29 15:40 jack0424 阅读(4025) 评论(0) 推荐(0) 编辑
摘要: 1,需求描述 某ORCALE11生产数据库(下称源数据库),内含近万个表,需要从中每日同步几十个表的数据到mySQL5.7数据库(下称目标数据库)中,供第三方使用。 需要对生产数据库影响越小越好。 2,技术挑战 数据类型不完全一致。从Oracle中导出的建表语句到MySQL数据库中不一定能运行,因为 阅读全文
posted @ 2023-06-17 10:30 jack0424 阅读(1066) 评论(0) 推荐(0) 编辑
摘要: 1,问题的提出 某vue前端程序,在手机APP上运行。需要做多图片浏览效果,要求如下: 进入浏览页面时,显示适应手机页面的缩小图, 用户可采用双指缩放,放大查看小图 用户点击图片时,弹出大图,宽度尺寸固定为1200px 大图可移动查看,但不允许缩放,点击大图后退出 以上要求中,第2和3叠加后,可能造 阅读全文
posted @ 2023-05-12 15:32 jack0424 阅读(1387) 评论(0) 推荐(0) 编辑
摘要: 1,故障现象 一个vue2的前端程序,需要根据浏览的设备类型来进入不同的path。 具体说就是PC端和手机端的home页面是分开来写的,PC端的home路径是“/home”,手机端的home路径是“/mhome” 用户点击进入程序的超链接的路径写死是进入“/home”路径(如“http://xx.y 阅读全文
posted @ 2023-04-17 17:46 jack0424 阅读(1814) 评论(0) 推荐(0) 编辑
摘要: 问题的提出 Vue前端+springboot后端的开发架构很普遍,一般最终以war的形式部署到tomcat中运行。 笔者在开发、测试、部署时,由于环境不一致,需要不断改变vue前端的配置,导致一些不必要的重复工作。具体见下表, 运行环境 web服务器 前端访问后端的路径 开发时 vue采用ide自带 阅读全文
posted @ 2023-03-23 16:23 jack0424 阅读(270) 评论(0) 推荐(0) 编辑
摘要: 1,项目背景 某项目采用前后端分离,实现基于浏览器的单网页应用。 前端采用vue2.6.14,使用history模式的vueRouter,IDE环境是webStorm 后端采用springboot 2.6.11,IDE环境是IDEA 2,问题描述 该项目在IDE环境下调试正常,在浏览器地址栏中输入地 阅读全文
posted @ 2023-03-09 17:47 jack0424 阅读(1704) 评论(0) 推荐(0) 编辑
摘要: 1,目标 GammaRay 是一个允许你查看 Qt 应用程序甚至在某种程度上修改它的独特应用,GammaRay 可以在运行时实时观察程序中的 qt 代码的行为和数据结构,可谓是 Debugger 的良好补充。 但是GammaRay的工作需要用和被调试程序使用同一个版本的qt和VS编译,否则Gamma 阅读全文
posted @ 2022-08-23 09:42 jack0424 阅读(1289) 评论(2) 推荐(0) 编辑
摘要: 1,对讲部署环境 对讲分为前端(设备端)和后端(PC端)。 前后端要根据制定的数据通信协议,执行各种功能,包括: 1) 设备端发起呼叫 2) PC端接听呼叫或拒接呼叫 3) 设备端挂断 4) PC端挂断 5) 语音数据的获取、收发、播放 1.1设备端 l 设备端有按钮可以发起对讲呼叫。对讲中按按钮, 阅读全文
posted @ 2022-07-08 17:23 jack0424 阅读(190) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示