MySQL 查询缓存保存查询返回的完整结果。当查询命中改缓存,MySQL 会马上返回结果,跳过了解析、优化和执行阶段。
查询缓存系统会跟踪查询涉及查询中的每一个表,若是这些表发生变化,那么和这个表相关的全部查询数据都将失效。这种机制看起来很低效,由于数据变化时极可能对应查询结果并无变动,可是这种简单实现方式代价很小,对于一个很是繁忙的系统来讲相当重要。
MySQL 判断缓存命中的方法很简单:缓存存放在一个引用表中,经过一个哈希值引用,这个哈希值包含了以下因素,即查询自己、当前要查询的数据库、客户端协议的版本等。当判断缓存是否命中时,MySQL 不会解析、“正规化”或者参数化查询语句,而是直接使用 SQL 语句和客户端送过来的其余原始信息。任何字符上的不一样,如空格。注释等都会致使缓存不命中。
若是查询中包含任何用户自定义的函数、存储函数、用户变量、临时表、mysql 库中的系统表等都不会被缓存。
查询缓存配置:
query_cache_type
是否打开查询缓存。能够设置成 OFF、ON 或 DEMAND。DEMAND表示只有在查询语句中使用 SQL_CACHE 的语句才放入查询缓存。默认为 ON,分别对应数字 0,1,2。mysql
query_cache_size
查询缓存使用的总内存的空间,单位是字节。这个值必须是1024的倍数,不然 MySQL 实际分配的数据会有所不一样。默认16M。sql
query_cache_min_res_unit
查询缓存中分配内存块时的最小单位。设置小,浪费空间少,可是频繁的内存申请;若是设置大,碎片会不少。数据库
query_cache_limit
MySQL 查询缓存的最大查询结果。默认1M。缓存
query_cache_wlock_invalidate
若是某个数据表被其余的链接锁住,是否仍然从查询缓存中返回结果。默认是 OFF。
手动设置查询缓存:
SQL_CACHE 和 SQL_NO_CACHE
OFF/0,不缓存全部查询结果。
ON/1,缓存全部查询结果,SELECT SQL_NO_CACHE .... 指定不缓存。
DEMAND/2,显示指定缓存结果,SELECT SQL_CACHE .... 指定缓存。函数