MySQL缓存机制就是缓存SQL文本及缓存结果,用KV形式保存再服务器内存中,如果运行相同的sql,服务器直接从缓存中去获取结果,不需要在再去解析、优化、执行sql。 如果这个表修改了,那么使用这个表中的所有缓存将不再有效,查询缓存值得相关条目将被清空。表中得任何改变是值表中任何数据或者是结构的改变,包括insert、update、delete、truncate、alter table、drop table或者是drop database 包括那些映射到改变了的表的使用merge表的查询,显然,者对于频繁更新的表,查询缓存不合适,对于一些不变的数据且有大量相同sql查询的表,查询缓存会节省很大的性能。
1.1 缓存命中条件
缓存是有命中条件的,并不是所有的SQL语句都会进入缓存查找。
缓存存在一个hash表中,通过查询SQL,查询数据库,客户端协议等作为key,在判断命中前,MySQL不会解析SQL,而是使用SQL去查询缓存,SQL上的任何字符的不同,如空格,注释,都会导致缓存不命中。如果查询有不确定的数据current_date(),那么查询完成后结果者不会被缓存,包含不确定的数的是不会放置到缓存中。
1.2 缓存工作流程
1)服务器接收SQL,以SQL和一些其他条件为key查找缓存。
2)如果找到了缓存,则直接返回缓存。
3)如果没有找到缓存,则执行SQL查询,包括原来的SQL解析,优化等。
4)执行完SQL查询结果以后,将SQL查询结果放入查询缓存。
1.3 缓存说明
开启查询缓存
MySQL默认是将查询缓存关闭的,我们需要在配置文件中打开。
查询当前数据库缓存是否开启:
mysql> select @@query_cache_type;+--------------------+| @@query_cache_type |+--------------------+| OFF |+--------------------+1 row in set, 1 warning (0.00 sec)
修改配置文件:linux的是/etc/my.conf,Windows的是C:\ProgramData\MySQL\MySQL Server 5.7\my.ini
在mysqld组下面增加并重启MySQL服务:
query_cache_type=1--重启systemctl restart mysqld-- 再次查看mysql> select @@query_cache_type;+--------------------+| @@query_cache_type |+--------------------+| on |+--------------------+1 row in set, 1 warning (0.00 sec)
