1. 服务端预编译与客户端预编译的差异,MySQL 默认客户端预编译?
服务端预编译与客户端预编译的差异是什么?为什么 MySQL 默认采用客户端预编译?
- 服务端预编译与客户端预编译的区别
- MySQL 默认客户端预编译的原因
- 预编译在连接池下的生命周期
客户端预编译(客户端模拟预编译)指驱动在客户端对参数做转义处理并拼入 SQL 文本,以普通文本协议(COM_QUERY)整体发送给服务器执行,服务器不做预解析与计划缓存;服务端预编译则通过 COM_STMT_PREPARE 让服务器预先解析并缓存执行计划,之后用 COM_STMT_EXECUTE 传参数执行,可复用解析结果与执行计划。MySQL 默认采用客户端预编译,是因为服务端预编译语句的缓存与连接绑定,连接断开、复用或 DEALLOCATE 后缓存会失效,而客户端预编译不依赖服务器端缓存,兼容性更好,连接池复用下更稳定。
关键是区分"参数分离"与"执行计划缓存"两个层面。客户端预编译只做参数处理,服务端预编译才真正复用计划;MySQL 默认客户端预编译主要是为了规避连接池复用导致服务端缓存失效的问题,需要时通过 useServerPrepStmts 显式开启服务端预编译。