与MySQL的注释、Query_cache有关的一个bug

今天有同学问了一个关于注释的问题,顺藤摸瓜发现一个bug,简要说明下。

有关注释的一些QA

Q: MySQL注释有哪些格式

A:MySQL的注释格式有三种,分别是 /**/ -- 和 #。具体参见手册

        

Q:在一些导出文件中见过/*! xxx*/,是不是注释?

A:  需要注意的是/*! */ 这种格式,对于MySQL来说不是注释,是能够直接执行的。同时这个格式还支持指定版本号,比如/*!50518 xxxx*/ 表示,若server端版本大于5518,则后续的xxxx作为语句的一部分执行,否则忽略。

 

Q:语句中的注释会不会发给server

A:默认是不会的。一种方法是在mysql连接中加-c (--comments)参数,则会强制将注释部分也发给Server端。 另一种方法与上一条答案有关,指定一个超过server端的版本号。如果比如指定 /*!121221 xxxx*/,也可以发给server。

 

Q: 慢查询日志会不会记录注释部分

A: 慢查询会记录语句原文,如果用上面说到的两种方法将注释发给server,若记录到慢查询日志中,就会显示。(也许可以用这种方法来加入语句来源,做业务慢查询分析)

   不只是慢查询,如果使用statement格式的binlog,注释部分也会写入到binlog中。

 

Q: 使用注释的语句能不能使用Query_cache(QC)

A:可以的,QC 会用原文作key,因此若有注释,则注释部分也要求一模一样才会命中QC

 

Query_cache小背景

QC是一个hash表,key是语句原文,value是查询结果。因此要求一模一样的语句才会命中。

 

Bug描述

若你的语句中是这么写select * from t /*!121221 just test*/. 按照上面说到的,这个语句是会被全文发到server端,不用怕语法错误,因为121221这个版本号大于现有的所有可用版本。因此实际执行的是select * from t;

 

如果query_cache正常打开,会看到第一次执行后show status like 'qcache_inserts';值确实+1.

然后再次执行,发现Qcache_hits并没有+1,反而是Qcache_not_cached +1.

说明这个语句虽然被插入QC中,但是却用不上

 

Bug分析

如果这个查询是慢查询,我们可以在慢查询日志中看到,它记录的是 select * from t /* 121221 just test*/。 ‘!’被换成了空格。

这个替换是在解析阶段发生的。

这样就有问题了:

1、  判断QC是否命中是在解析之前,也就是SQL的原文

2、  第一次执行不命中QC,需要执行,执行期间将!替换成空格

3、  结果在插入QC中,但是此时的key,已经是替换过的。

4、  下一次执行使用的仍然是带!的,因此仍然无法命中

 

    一种解决方法

Percona和MariaDB(5.5+)中有一个特性,刚好绕过这个问题。

参数query_cache_strip_comments用于控制QC中是否去掉SQL语句的注释部分。默认是OFF,若打开,插入QC中的是原语句,可以解决这个问题。

 

'!'为什么要替换

这个问题的是由解析器将/*! */替换成/*  */ 造成的。在5.1其实没有这个替换行为(感谢@飞哥最爱白菜 指出)。为什么MySQL要加上这个动作呢?

原因是我们上面提到的,binlog中会记录语句原文,包括/*!VERSION xxx*/的内容。

这样在主从同步时,若VERSION大于主库版本而小于从库版本(官方是承诺向下兼容的),则可能会出现主从执行不一致的问题。

主库发现xxx不会被执行,就做了替换,语句变成 /* VERSION xxx*/,这是个标准的注释,从库也不会执行xxx部分。

因此属于解决bug的时候引入的。

Codex 5.5本地部署实战:VS Code集成+MySQL上下文理解 大语言模型(LLM)在编程辅助中的核心价值,不仅在于通用文本生成能力,更取决于其对代码语义、数据库结构和工程规范的深度理解。Codex作为专为代码优化的LLM架构,通过定制化Tokenizer、内置SQL解析器与注释强化学习机制,在MySQL上下文理解、中文代码注释生成等垂直任务上显著优于通用模型。本地部署方案(如Ollama+Codex 5.5)可规避网络延迟、数据泄露与API限流风险,实现离线、可控、可审计的AI编码工作流。本文聚焦真实开发场景——从硬件适配、模型拉取、Modelfile定制,到VS C 阅读详情

相关推荐

CentOS 6 LEMP部署实战:nginx MySQL PHP编译优化与碎片处理

LEMP栈是Linux环境下经典的Web服务组合,其核心原理在于Nginx轻量级事件驱动模型、MySQL关系型数据管理机制与PHP动态脚本执行能力的协同。该技术组合具备高并发承载、资源占用低、部署灵活等工程价值,广泛应用于金融票据系统、工业数据采集、气象实时分发等对稳定性与兼容性要求严苛的遗留生产场景。在CentOS 6这一已终止支持但仍在大量服役的操作系统上,成功部署LEMP的关键在于绕过EPEL源失效、规避OpenSSL版本冲突、合理控制MyISAM表碎片,并解决PHP扩展的符号依赖问题。本文聚焦真实运

weixin_33938733的博客 361

Ubuntu 16.04下用ProxySQL实现MySQL查询缓存实战

MySQL查询缓存是提升高并发读性能的关键技术手段,其核心原理是将规范化后的SELECT语句结果暂存于内存,避免重复执行相同查询。ProxySQL作为轻量级SQL代理中间件,通过SQL规范化(normalize_query)、正则匹配规则(match_digest)与毫秒级内存缓存(cache_ttl),在不修改应用代码的前提下实现透明化缓存加速。相比已废弃的MySQL原生query_cache和侵入性强的Redis方案,ProxySQL具备无感接入、精准失效、自动路由等工程优势,特别适用于Ubuntu 1

weixin_30664051的博客 435

Debian 9 LAMP 实战校准指南:PHP模块化、Apache保守配置与MariaDB socket认证

LAMP 是 Linux、Apache、MySQL(或 MariaDB)、PHP 四大开源组件构成的经典 Web 开发栈,其核心价值在于稳定、可控与高度可定制。在实际部署中,不同发行版对各组件的默认策略存在显著差异——尤其 Debian 以安全基线高、包粒度细、服务行为严谨著称。例如 PHP 不提供元包而强制模块化安装,Apache 默认禁用 .htaccess 覆盖,MariaDB root 用户采用 unix_socket 插件认证而非密码登录。这些设计并非缺陷,而是 Debian ‘不替用户做决定’

CURSED! 685

mysql crash定位分析_mysql bug#64624: 备库开启query cache后导致crash的分析

主库:mysql-5.1.48备库:percona server 5.5.18(query cache on)重现:点击(此处)折叠或打开valgrind --leak-check=full --trace-children=yes --log-file=$HOME/valgrind.1 ./bin/mysqld --defaults-file=my.s.s.cnf主库上执行:点击(此处)折叠或打...

weixin_29969209的博客 200

CoppeliaSim(原V-REP)新手上路

CoppeliaSim(原V-REP)是一个机器人仿真平台,里面有很多来自别的公司的机器人模型以及完备的物理引擎,我们可以通过python,c++,matlab等语言控制里面的机器人。,您也可以在官网中Downloads里找您需要的版本,一般只需要下载EDU版本就可以了,我下载的是v4.1.0 windows EDU版本。在版本V4之前,CoppeliaSim叫V-REP,在官网可以下载到之前的V-REP版本。

qq_37051669的博客 4万+

ClaudeCode 通过 CC Switch 配置 Ollama 本地大模型

本文介绍了如何让Claude Code使用本地免费模型qwen3.5:9b而无需Anthropic API Key的方法。主要内容包括:1)安装Claude Code、CC Switch代理工具和Ollama本地模型运行时;2)配置环境变量和设置文件将请求转发到本地服务;3)详细说明了系统架构和工作原理,展示请求如何从Claude Code经CC Switch代理到Ollama本地模型。该方案通过代理拦截和转发机制,实现了使用免费开源模型替代官方API的功能。

稚枭天卓 3222

MySQL的注释、Query_cache有关的一个bug

转自丁奇,原文http://dinglin.iteye.com/blog/1749273 今天有同学问了一个关于注释的问题,顺藤摸瓜发现一个bug,简要说明下。 有关注释的一些QA Q: MySQL注释有哪些格式 A:MySQL的注释格式有三种,分别是 /**/ -- 和 #。具体参见手册          Q:在一些导出文件中见过/*! xxx*/,是不是注释? A:  需要注

qiuyepiaoling的专栏 561

驯服电源尖峰:从BUCK/BOOST环路剖析到高di/dt噪声的实战抑制

本文深入探讨了电源系统中高di/dt噪声的产生机制及抑制方法,通过BUCK/BOOST电路的环路分析,揭示了电流路径不连续导致的电压尖峰问题。文章提供了实用的PCB布局技巧和噪声抑制策略,包括最短回路原则、铺铜优化和过孔阵列战术,帮助工程师有效降低EMI噪声,提升电源系统的稳定性。

weixin_29587015的博客 275

springboot-redis 的配置,以及chche注解的使用

1.项目目录 2.application.yml spring: application: name: cache redis: host: 47.97.219.159 #redis的IP地址 port: 6379 #redis的端口号 timeout: 20000 password: ...

houkai的博客 938

Qwen-Image LoRA训练实战:从数据准备到异常修复的全流程解析

本文详细解析了Qwen-Image LoRA训练的全流程,从数据准备到参数优化再到异常修复。通过实战案例展示了如何利用LoRA技术微调Qwen-Image模型,提升中文场景下的图像生成质量,特别针对手脚生成异常等问题提供了有效解决方案。文章还分享了中文提示词优化技巧和高级训练方法,帮助开发者高效训练出高质量的LoRA模型。

lemon的博客 969

Windows下的Geant4安装教程

本教程将从0开始展示在Windows下如何安装Geant4,包括各种辅助工具(QT、Cmake、Visual Studio)的下载安装,环境变量的配置,以及example的生成等。

weixin_49065278的博客 4113

(转)MySQL Query Cache 说明及应用中问题解答

  文章作者:Sky.Jian   原文链接:MySQL Query Cache小结         顾名思义,MySQL Query Cache 就是用来缓存和 Query 相关的数据的。具体来说,Query Cache 缓存了我们客户端提交给 MySQL 的 SELECT 语句以及该语句的结果集。大概来讲,就是将 SELECT 语句和语句的结果做了一个 HASH 映射关系然后保存在一定的...

田维宝博客 293

科研软件|Adobe Photoshop 2024 (PS 2024)

科研软件|Adobe Photoshop 2024 (PS 2024)

m0_55499682的博客 5516

com.esotericsoftware.kryo.KryoException: java.lang.IndexOutOfBoundsException的解决办法

今天访问系统的管理后台的时候,突然间弹出一个很大的500错误: 然后下载日志查看,发现报了下面的错误: com.esotericsoftware.kryo.KryoException: java.lang.IndexOutOfBoundsException 想想发现provider的pojo中增加了两个字段,然后发布到了服务器,consumer没有同步更新; 按照正常的理解是我是增加...

谢彬の优快云专栏 1万+

深入解析AUTOSAR中IIC的MCAL实现与Vector配置实践

本文深入解析AUTOSAR架构中IIC总线的MCAL实现与Vector配置实践,探讨IIC在汽车电子中的特殊定位及Vector的折中方案。通过Channel与Sequence设计模式、Chain特性应用及DaVinci Configurator配置步骤,提供IIC驱动的优化与安全实现方法,助力开发者高效解决车载通信问题。

weixin_29172963的博客 407

暑期实习前端面试笔试总结汇总

腾讯2020暑期实习——前端视频面试(1)回顾 腾讯2020暑期实习——前端视频面试(2)回顾 腾讯2020暑期实习——前端视频面试(3)回顾 腾讯2020暑期实习——前端视频面试(4)回顾 蘑菇街2020暑期实习——前端视频面试回顾 二、笔试 奇安信前端实习笔试总结 vivo笔试(2020年3月8日) ...

明媚 3067

mysql配置优化实践

我们游戏采用了mysql作为数据库软件,几经优化,已经相对稳定,有连续几个月稳定运行的记录,不过最近发生了比较诡异的现象,数据库有100多个进程突然锁住,用show processlist命令查看,几分钟之内一直是这些进程在执行相同的sql,没有任何结束的迹象,导致tomcat应用服务器飙升到线程池的最大线程,500个线程,然后停止响应。   show processlist看到的lock现象...

herberthui的专栏 176

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Golang操作Redis与MySQL实战指南

数据库操作是现代应用开发的核心技术,其中Redis作为高性能内存数据库,MySQL作为成熟的关系型数据库,在各类系统中广泛应用。Golang凭借其卓越的并发模型和简洁语法,成为连接这两种数据库的理想选择。通过database/sql和redigo等标准库,开发者可以构建高并发的数据访问层,实现包括连接池管理、事务处理、批量操作等关键功能。在电商秒杀、实时统计等高并发场景下,合理使用Redis缓存能显著提升系统响应速度,而MySQL则确保数据的持久化和一致性。本文通过实际项目案例,详细介绍如何利用Golang

xpp02的专栏 407

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Ubuntu 18.04下PHP PDO MySQL事务实战:ACID落地与避坑指南

数据库事务是保障数据一致性的核心机制,其本质是通过原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)四大特性实现多操作的可靠协同。在PHP开发中,PDO作为官方推荐的数据库抽象层,不仅提供统一接口,更原生支持事务控制、预处理防注入及跨数据库迁移能力。尤其在Ubuntu 18.04这一广泛使用的LTS环境中,PHP 7.2与MySQL 5.7组合虽默认支持PDO_MySQL驱动,但需手动启用扩展、显式配置Unix Socket路径、关闭

weixin_34289454的博客 535

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

MySQL规范

MySQL规范整理 命名规范 基础规范 库表设计 字段设计 索引规范 SQL设计 行为规范 FAQMySQL规范整理1. 命名规范① 库名、表名、字段名必须使用小写字母,并采用下划线分割 如库名/表名/字段名: sys_user ② 库名、表名、字段名禁止超过32个字符。须见名之意 ③ 库名、表名、字段名禁止使用MySQL保留字 ④ 临时库、表名必须以temp为前缀,并以日期为后缀 如:te

灯塔的优快云博客 750

Linux安装MySQL教程:手把手图文讲解,教你在CentOS 7上安装MySQL

本文摘要: 本文详细介绍了在CentOS 7系统上通过二进制方式安装MySQL 8.0的完整流程,涵盖环境检查、目录规范、用户配置、依赖安装、数据初始化等关键步骤。教程采用标准化路径管理(/opt/mysql、/data/mysql),强调使用mysql虚拟用户运行服务,提供详细的配置文件模板(my3306.cnf),并解决常见依赖问题。通过--initialize-insecure实现空密码初始化,最后配置环境变量简化操作。全文配有命令行截图和注释,适合运维、开发及Linux初学者快速部署生产级MySQL

mysql教程 726

AI时代Java程序员如何抓住红利期:聚焦并发、JVM、MySQL与Spring深度技能

在软件开发领域,AI编程工具的普及正在重塑技术价值分配。从概念上讲,AI通过自动化代码生成,显著提升了基础开发效率,但其核心原理在于处理模式化任务。这带来的技术价值是,将开发者的工作重心从基础编码转向了复杂系统设计与质量保障。在应用场景上,尤其对于Java技术栈,那些涉及高并发处理、JVM深度调优、MySQL高性能架构设计以及Spring生态高级应用的场景,恰恰是AI难以替代的“深水区”。因此,Java开发者需要将核心竞争力从知识记忆转向工程化与系统化思维,例如深入理解并发编程中的线程池实战艺术与JUC工具

weixin_34216107的博客 470

Ubuntu 20.04 LEMP部署实战:MySQL 8.0认证与Nginx PHP-FPM协同配置

LEMP栈是Linux环境下Web服务的基础技术架构,其核心在于Linux操作系统、Nginx服务器、MySQL数据库与PHP运行时的深度协同。理解其工作原理需把握进程通信机制(如Unix Socket)、认证插件兼容性(如MySQL 8.0的caching_sha2_password与php-mysqlnd驱动适配)、以及配置可验证性(如nginx -t与systemctl show)。该架构的技术价值体现在稳定性、安全审计能力与生产可复现性上,广泛应用于WordPress、Laravel等PHP生态项目

weixin_33834628的博客 384

Python操作MySQL生产实战:字符集、连接池与参数化防注入

MySQL与Python的集成是Web后端开发的基础能力,其核心在于理解数据库驱动原理、连接生命周期管理及SQL执行安全机制。从字符集配置(如utf8mb4)到连接池调优(maxsize与QPS匹配),再到参数化查询如何通过MySQL协议级预编译抵御SQL注入,每一环节都直接影响系统稳定性与安全性。真实项目中常见的中文乱码、连接泄漏、事务卡死、SSL劫持风险等问题,本质是开发人员对底层协议(如COM_STMT_PREPARE)、服务端配置(wait_timeout、max_allowed_packet)和驱

culuo8053的博客 399
上一篇: MySQL关于timestamp和mysqldump的一个“bug”
下一篇: mysqldump输出方式和进度报告
iteye_621
博客等级 码龄8年 12粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值