MySQL性能优化预编译语句

MySQL性能优化的方法有很多,预编译是使用比较多,效果比较好的一种方法。本文将简单介绍什么是MySQL预编译语句,如何使用预编译语句,以及使用预编译语句在性能上能带来多少提高。

什么是预编译语句?

MySQL在执行SQL语句时,分为几个阶段。

  1. 词法解析、语义解析。
  2. 优化SQL语句,生成执行计划。
  3. 执行SQL并返回结果。

很多情况下,同一类SQL会反复执行,只是SQL中的某些具体的值不同,本质上属于同一类SQL。比如select中的where条件值不同,insert中的values值不同,update中的set值不同等等。这些SQL只要解析一次,以后再次执行时,就不再需要进行词法解析、语义解析、SQL语句优化、生成执行计划,这些过程都不再需要,只要告诉MySQL具体的参数值变了就行。通常我们称这类SQL为Prepared Statements。

使用预编译语句,同一类SQL,只要一次编译,多次运行,省去了不必要的重复的解析优化过程,大大提高了SQL语句执行性能,另外预编译功能也能防止SQL注入。

如何使用预编译语句?

通过prepare关键字来编译一个SQL语句,通过execute关键字来执行一个具体的SQL,通过deallocate关键字来释放一个预编译SQL语句。示例如下:

mysql> prepare sel from 'select * from t where c1=? and c2=?'; mysql> set @a='100',@b='200'; mysql> execute sel using @a,@b; +------+------+------+---------------------+ | id   | c1   | c2   | ts                  | +------+------+------+---------------------+ | 3275 | 100  | 200  | 2020-01-18 11:53:39 | | 3277 | 100  | 200  | 2020-01-18 11:53:39 | +------+------+------+---------------------+ 2 rows in set (0.01 sec) mysql> set @a='400',@b='400'; mysql> execute sel using @a,@b; +------+------+------+---------------------+ | id | c1 | c2 | ts | +------+------+------+---------------------+ | 3279 | 400 | 400 | 2020-01-19 15:10:09 | +------+------+------+---------------------+ 1 row in set (0.00 sec) mysql> deallocate prepare sel; Query OK, 0 rows affected (0.00 sec)