2019独角兽企业重金招聘Python工程师标准>>>
MySQL 查询缓存保存查询返回的完整结果。当查询命中改缓存,MySQL 会立刻返回结果,跳过了解析、优化和执行阶段。
查询缓存系统会跟踪查询涉及查询中的每个表,如果这些表发生变化,那么和这个表相关的所有查询数据都将失效。这种机制看起来很低效,因为数据变化时很可能对应查询结果并没有变更,但是这种简单实现方式代价很小,对于一个非常繁忙的系统来说至关重要。
MySQL 判断缓存命中的方法很简单:缓存存放在一个引用表中,通过一个哈希值引用,这个哈希值包含了如下因素,即查询本身、当前要查询的数据库、客户端协议的版本等。当判断缓存是否命中时,MySQL 不会解析、“正规化”或者参数化查询语句,而是直接使用 SQL 语句和客户端送过来的其他原始信息。任何字符上的不同,如空格。注释等都会导致缓存不命中。
如果查询中包含任何用户自定义的函数、存储函数、用户变量、临时表、mysql 库中的系统表等都不会被缓存。
查询缓存配置:
query_cache_type
是否打开查询缓存。可以设置成 OFF、ON 或 DEMAND。DEMAND表示只有在查询语句中使用 SQL_CACHE 的语句才放入查询缓存。默认为 ON,分别对应数字 0,1,2。
query_cache_size
查询缓存使用的总内存的空间,单位是字节。这个值必须是1024的倍数,否则 MySQL 实际分配的数据会有所不同。默认16M。
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 .... 指定缓存。