首页 > 数据库 >如何让带参数变量的mysql查询走索引?

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

时间:2024-09-23 11:50:34浏览次数:1  
标签:set 变量 查询 索引 参数 mysql

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

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

标签:set,变量,查询,索引,参数,mysql
From: https://www.cnblogs.com/jackkwok/p/18426752

相关文章

  • ES 常用API:创建索引,创建别名,重建索引
    华为云不同版本间索引同步数据(目前华为后台工具不能跨版本间同步数据):ES常用API:创建索引,创建别名,重建索引华为云不同版本间索引同步数据(目前华为后台工具不能跨版本间同步数据):elasticdump--inputhttp://admin:123456@ip:9200/sensitive_1_v15--outputhttp://admin:123123@ip......
  • 阿里云mysql数据库服务器错误怎么回事
    阿里云MySQL数据库服务器错误可能由多种因素造成,以下是一些常见的原因及解决方法:网络配置错误:检查服务器的网络配置,确保防火墙设置允许来自客户端的连接请求。确认IP地址或域名解析正确,且客户端能够通过网络访问到数据库服务器。MySQL服务未启动:确认MySQL服务已经在阿......
  • mysql5.7.40升级到5.7.44
    1.软件下载https://www.mysql.com/downloads/找到mysqlcommunityGPLdownload--mysqlcommunityserver--选择5.7.44和rhel/oracle下载mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar2.停服备份systemctlstopmysqldcp/etc/my.cnf/etc/my.cnf.bak20240801配置文件tar-z......
  • 为什么数据库查询总是报错
    数据库查询总是报错可能有以下几个常见原因:SQL语句错误:语法错误:SQL语句编写不正确,比如缺少分号、括号不匹配等。表或列不存在:查询中引用了不存在的表名或字段名。查询条件错误:WHERE子句中的条件表达式错误,比如比较运算符使用不当、值类型不匹配等。数据库连接问题:连......
  • SQL Server的Descending Indexes降序索引
    SQLServer的DescendingIndexes降序索引   背景索引是关系型数据库中优化查询性能的重要手段之一。对于需要处理大量数据的场景,合理的索引策略能够显著减少查询时间。特别是在涉及多字段排序的复杂查询中,选择合适的索引类型(如降序索引)显得尤为重要。本文将探讨如何在SQL......
  • SQLSTATE[HY000] [2013] Lost connection to MySQL server at 'reading initial commu
    错误信息 SQLSTATE[HY000][2013]LostconnectiontoMySQLserverat'readinginitialcommunicationpacket',systemerror:111 表示在尝试与MySQL服务器建立连接时出现了问题,具体来说是在读取初始通信包时失去了与MySQL服务器的连接,系统错误码为111,这通常表示连接被拒绝......
  • MySQL 的 Change Buffer 是什么?它有什么作用?
    MySQL的ChangeBuffer是**InnoDB存储引擎中的一个重要机制,用于优化插入、更新和删除等写操作的性能。**ChangeBuffer可以理解为一种延迟写机制,专门用于处理二级索引(SecondaryIndex)的非聚集索引页的变化。下面是关于ChangeBuffer的详细解释及其作用。1.ChangeB......
  • MySQL 必知概念
    Delete、Drop和Truncatedelete、truncate仅仅删除表里面的数据,drop会把表的结构也删除delete是DML语句,操作完成后,可以回滚,truncate和drop是DDL语句,删除之后立即生效,不能回滚执行效率:drop>truncate>deleteMyISAM与InnoDBInnoDB支持事务,MyISAM不支持Inn......
  • 为什么大多数开发人员都避免在MySQL表名和列名中使用中文?
    大多数开发人员避免在MySQL表名和列名中使用中文,主要有以下几个原因:1.兼容性问题不同的数据库系统和工具对字符集的支持各不相同。使用中文可能导致在不同平台或工具间的数据迁移和兼容性问题。2.编码和显示问题在某些开发环境或工具中,中文可能会出现乱码,导致调试和维护......
  • 第二十二讲:MySQL是怎么保证数据不丢的?
    第二十二讲:MySQL是怎么保证数据不丢的?简概开篇​ 今天这篇文章,我会继续和你介绍在业务高峰期临时提升性能的方法。从文章标题“MySQL是怎么保证数据不丢的?”,你就可以看出来,今天我和你介绍的方法,跟数据的可靠性有关。在专栏前面文章和答疑篇中,我都着重介绍了WAL机制(你可以......