在MySQL中,一条SQL语句从传入到执行经历了以下过程:检查缓存、规则验证、解析器解析为语法树、预处理器进一步验证语法树、优化SQL、生成执行计划、执行。其中对语法的解析和优化的过程其实是与传入的字段值无关的,但却比真正执行的过程更为耗费时间,因此在处理某些语句时,很容易造成时间的浪费,效率的下降。
所谓的预编译sql语句就是将这一类sql语句中的值用占位符替代,可以视为将sql语句模板化或者说参数化,一般称这类语句叫Prepared Statements。
预编译语句的优势在于归纳为:一次编译、多次运行,省去了解析优化等过程;此外预编译语句能防止sql注入。
局限性:并不是所有参数都可预编译,ORDER BY后的ASC/DESC不能被预编译,当业务场景涉及到用户可控制排序方式,且ASC/DESC是由前台传入并拼接到SQL语句上时,就可能出现危险了。