MySQL查询缓存设置(附带实例)
首先我们需要显式开启查询缓存。在 MySQL 5.7 中进行如下设置。
开启 PROFILE 功能后,执行两条 SQL 语句,如下所示:
使用如下语句查看上面两条 SQL 语句的查询成本:
查看上面两条 SQL 语句对应的查询成本的详细信息,结果如下所示:
需要注意的是,两次查询 SQL 必须是一致的,否则不能命中查询缓存。例如,下面两条 SQL 语句虽然查询结果一致,但不会命中查询缓存,这里不再进行测试。
如果在 MySQL 8.0 中添加同样的开启查询缓存的配置信息,重启 MySQL 服务时就会报错,如下所示:
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.