user_id 123 走不了索引是因为MySQL对INT类型列隐式转为字符串比较导致全表扫描PostgreSQL则直接报错。EXPLAIN中type为ALL/index、Extra仅含Using where即为典型表现SHOW WARNINGS可见CAST痕迹。WHERE 条件里 user_id 123 为什么走不了索引字符串和数字混用时MySQL 会把列隐式转成字符串再比对user_id 是 INT 类型但传了字符串 123引擎不得不对整列做类型转换索引失效是必然结果。PostgreSQL 更严格直接报错而 MySQL 默默执行却慢得离谱。查 EXPLAIN 的 type 字段如果是 ALL 或 index非 ref/range大概率有隐式转换看 Extra 列出现 Using where; Using index 是健康的若只有 Using where说明索引没被用于定位只是最后过滤用 SHOW WARNINGS 查优化器重写后的语句常能看到类似 CAST(user_id AS CHAR) 这样的痕迹PreparedStatement 参数绑定不等于类型安全Java 用 setString(1, 123) 给 INT 字段赋值JDBC 驱动默认仍会发字符串过去——MySQL 收到后照旧隐式转换。真正起作用的是驱动层的类型提示不是应用层的 setXxx 方法名。MySQL Connector/J 8.0 可加连接参数useServerPrepStmtstruecachePrepStmtstruerewriteBatchedStatementstrue并确保 serverPreparedStatementDiscardThreshold 合理更可靠的做法是显式调用 setInt(1, 123)哪怕变量来源是字符串也先 Integer.parseInt()注意空值和异常MyBatis 中 if testuserId ! nullAND user_id #{userId} 不够得配合 jdbcTypeINTEGER 或让参数对象字段类型为 IntegerJSON 字段里的数字查询最容易翻车JSON 类型字段如 extra_info存了 {age: 25}写 JSON_EXTRACT(extra_info, $.age) 25MySQL 会把提取出的数字转成字符串比较索引哪怕建了函数索引也白搭。 稿定AI 拥有线稿上色优化、图片重绘、人物姿势检测、涂鸦完善等功能