首页 > 编程笔记 > MySQL笔记 阅读:2

MySQL查询缓存设置(附带实例)

首先我们需要显式开启查询缓存。在 MySQL 5.7 中进行如下设置。

1) 在配置文件中开启查询缓存

在 /etc/my.cnf 配置文件中新增一行配置,如下所示,开启查询缓存:
query_cache_type=1

2) 重启 MySQL 服务

在配置文件中新增的配置需要重启 MySQL 服务才能生效。重启命令如下所示:
systemctl restart mysqld

3) 验证查询缓存

使用如下 SQL 语句创建数据库 chapter4 和表 test1:
mysql> CREATE DATABASE chapter4;
mysql> USE chapter4;
mysql> CREATE TABLE test1(id int, name varchar(20));
mysql> INSERT INTO test1(id, name) VALUES (1,'a'),(2,'A'),(3,'b'),(4,'B');
我们可以通过查看SQL语句的查询成本来判断是否命中查询缓存。

开启 PROFILE 功能后,执行两条 SQL 语句,如下所示:
mysql> SET profiling=1;
mysql> SELECT * FROM test1;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | A    |
|  3 | b    |
|  4 | B    |
+----+------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM test1;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | A    |
|  3 | b    |
|  4 | B    |
+----+------+
4 rows in set (0.00 sec)

使用如下语句查看上面两条 SQL 语句的查询成本:
mysql> SHOW PROFILES;
+----------+-------------+----------------------+
| Query_ID | Duration    | Query                |
+----------+-------------+----------------------+
|        1 | 0.00025325  | select * from test1  |
|        2 | 0.00006100  | select * from test1  |
+----------+-------------+----------------------+
2 rows in set, 1 warning (0.00 sec)

查看上面两条 SQL 语句对应的查询成本的详细信息,结果如下所示:
mysql> SHOW PROFILE FOR QUERY 1;
+------------------------------+-----------+
| Status                       | Duration  |
+------------------------------+-----------+
| starting                     | 0.0000161 |
| Waiting for query cache lock | 0.000002  |
| ...                          | ...       |
| storing result in query cache| 0.000003  |
| cleaning up                  | 0.000009  |
+------------------------------+-----------+
25 rows in set, 1 warning (1.58 sec)

mysql> SHOW PROFILE FOR QUERY 2;
+---------------------------------+-----------+
| Status                          | Duration  |
+---------------------------------+-----------+
| starting                        | 0.0000151 |
| ...                             | ...       |
| sending cached result to client | 0.000032  |
| cleaning up                     | 0.000002  |
+---------------------------------+-----------+
8 rows in set, 1 warning (0.00 sec)
可以看到,在第二条 SQL 语句对应的查询成本信息中有一条信息“sending cached result to clien”,表示数据是从查询缓存中获取的。

需要注意的是,两次查询 SQL 必须是一致的,否则不能命中查询缓存。例如,下面两条 SQL 语句虽然查询结果一致,但不会命中查询缓存,这里不再进行测试。
SELECT * FROM mydb.mytbl WHERE id=2;
SELECT * FROM mydb.mytbl WHERE id>1 AND id<3;

如果在 MySQL 8.0 中添加同样的开启查询缓存的配置信息,重启 MySQL 服务时就会报错,如下所示:
[root@atguiguo1 ~]# systemctl restart mysqld
Job for mysqld.service failed because the control process exited with error code.
See "systemctl status mysqld.service" and "journalctl -xe" for details.

相关文章