mysql查询缓存原理分析
QueryCache(以下简称QC)是基于SQL语句缓存。如果一个SQL查询从选择MySQL服务器将尝试使用QC,每个高速缓存存储为SQL文本作为重点。在应用QC、SQL文本将不受理任何更多的,说,两个SQL语句,如果差异是连字符(例如,情况不同的是,多个空间,等等),这两个SQL将使用不同的缓存。
但是SQL文本可以由客户机处理。例如,在正式命令行客户机中,在向服务器发送SQL之前,您将执行以下操作:
过滤所有注释
删除SQL文本前后的空格、制表符和其他字符。注意它是文本的前后部分。中间部分不会被删除。
以下三个SQL,因为选择和尺寸之间的关系,最后与其它两个绝对是不同的存储位置在QC,第一和第二,不同的是,后者有一个音符,在不同的客户,会有不同的结果。所以,在保险的情况下,尝试不使用动态注释尽可能。在PHP的MySQL扩展,SQL的注释不会被删除,三个SQL将存储在三个不同的缓存,虽然他们的结果都是一样的。
SELECT * FROM人名字= 'surfchen;
选择*从人民那里 / *嘿~ * /名称= 'surfchen;
SELECT * FROM人名字= 'surfchen;
目前只有SELECT语句将被缓存,而其他类似显示,使用语句将不会被缓存。
因为QC是这样一个前端,这样一个简单的缓存系统,如果更新了表,与此表相关的SQL的所有QC都将失效。
换句话说,如果一个表是经常更新的,有必要考虑是否应该QC相关的一些SQL。经常更新的表,如果应用到QC,可能会加重数据库的负担,而不是减轻负担。我一般的做法是默认开放的QC,和禁用一些SQL语句,包括经常更新的表sql_no_cache关键词缓存。这样可以避免不必要的内存操作尽可能保持记忆的连续性,尽可能多的。
QC不应该用于那些SQL语句非常分散。例如,选择从名称= 'surfchen'is用来查询用户和密码的用户。这样的声明,在一个系统中,可能用只有当用户登陆了。每一个用户登录使用的查询是不同的从SQL文本。QC在这里几乎没有用处,因为缓存数据很少使用。他们只占据记忆中的位置。
存储块
在本节中,存储块和块具有相同的意义。
当QC缓存查询结果,它一般不会一次性分配足够的内存来缓存结果。相反,它是存储块在获取查询结果的过程中,当一个存储块填充,一个新的存储块将被创建和内存分配(分配),一个单一的存储块的内存分配的大小是由query_cache_min_res_unit参数控制,默认的是4KB。最后一个存储块,如果不使用,那么未使用的内存将被释放。如果缓存的结果,那么可能会导致过于频繁的操作内存的分配,系统可以降低;如果缓存结果是非常小的,它可能会导致过多的记忆的碎片,如果这些碎片太小了,它像与使用分开。
除了查询结果需要存储块,每个SQL文本也需要一个存储块,和涉及到的表也需要一个存储块(表的存储块是由所有线程,共享每个表只需要一个存储块)。存储块=数据库表中查询结果* 2 +数的数。也就是说,当第一个缓存的产生,至少有三个存储块是必要的:表信息存储块,SQL文本存储块,和查询结果的存储块,如果第二查询使用相同的表,然后只有两块是至少需要:SQL文本存储块,和查询结果存储块。
通过观察qcache_queries_in_cache和qcache_total_blocks,你可以知道每缓存结果平均占用的存储块。如果他们的比例接近1:2,目前query_cache_min_res_unit参数已经是够大的。如果qcache_total_blocks远远超过qcache_queries_in_cache,你需要增加的query_cache_min_res_unit大小。
对qcache_queries_in_cache * query_cache_min_res_unit内存(SQL文本和表格信息块很小,可以忽略)。如果它比query_cache_size-qcache_free_memory大得多,那么我们可以尽量减少query_cache_min_res_unit价值。
调整大小
如果qcache_lowmem_prunes增长迅速,这意味着许多高速缓存被释放,因为内存不足,不能因为相关表的更新,努力提高query_cache_size努力使尽可能多的qcache_lowmem_prunes零增长。
启动参数
显示变量like'query_cache %看到这个信息。
query_cache_limit:如果一个查询的结果大于这个值,那么它不缓存
query_cache_size:分配给QC的记忆。如果设置为0,这相当于禁用QC。需要注意的是,QC必须使用kb左右来存储它的结构很重要,如果设置不少于40kb,它相当于禁用QC,QC存储的最小单位是1024字节,所以如果你设置的值不是1024的倍数,该值将四到五的值是最接近的当前值等于1024。
query_cache_type:0完全禁止QC,不是由SQL(也可能控制语句需要注意的是,即使是残疾人,设置参数在内存大小或将分配);1 QC启用,您可以在残疾人使用的sql_no_cache SQL语句;2可以在SQL语句中启用sql_cache。
query_cache_min_res_unit:分配每次质检结果内存的大小
状态
显示状态like'qcache %看到这个信息。
qcache_free_blocks:当一个表被更新,缓存块与它将是免费的。但块可能仍然在队列中存在,除非是在队列的末尾。这些块将被视为该值。刷新查询缓存的语句可用于空的空闲块。
qcache_free_memory:可用于在内存中,如果是小的,可以考虑添加query_cache_size
qcache_hits:从MySQL的过程和缓存命中数
qcache_inserts:已经从MySQL过程中加入质量数
酒吧,qcache_lowmem_prunes数:已由QC由于内存不足,删除,增加query_cache_size和保持尽可能多的价值0。
qcache_not_cached:从MySQL进程并没有一些只读查询的缓存(包括选择、显示、使用、查询、等)
qcache_queries_in_cache:目前在缓存SQL数
qcache_total_blocks:块数量在QC。查询可以由多个块,这些块存储,最后填充的内存将被释放。例如,对于较大内存的一个QC成果,如果query_cache_min_res_unit是4KB,它最终将产生3块,第一块是用来存储SQL语句文本,这不会是统计查询+ cache_size,二块4KB,第三块2kb(第一allocate4kb,然后释放多余的2KB)。每个表,当第一个SQL查询,它是缓存,使用一块表来存储信息。也就是说,块将用在三个地方:表信息,SQL文本和查询结果。