mysql的查询缓存
‘壹’ Mysql中刷新优化数据库性能走起mysql中flush
MySQL中刷新:优化数据库性能走起
MySQL是一种非常受欢迎的开源数据库管理系统。不管是开发网站还是管理大型企业系统,MySQL都是首选之一。然而,为确保数据库系统的最大性能和稳定性,鉴于MySQL在使用中会带来很多难题,本文发掘MySQL中一个非常重要的技巧:刷新,让我们来优化MySQL的性能吧!
MySQL缓存机制
在MySQL中,查询时优化器会选择最合适的索引,同时将查询结果缓存到缓存区。当下次读取数据时,查询结果可以直接从缓存区读取,而无需再次从磁盘读取数据,这样大大提高了系统的查询性能和吞吐率。
在MySQL中,有两种缓存机制:
查询缓存(Query Cache):存储所有结果被缓存后的结果集。此种类型的缓存非常适用于不经常变化的数据,但是它可以降低性能,因为缓存区的容量较小,如果一个查询结果集较大,则会把缓存区刷掉,从而导致查询结果无法被缓存。
InnoDB缓存池
InnoDB缓存池(Buffer Pool):存储最近被查询的数据和索引。在InnoDB表中,数据和索引都被存储在磁盘中,在每次查询时需要从磁盘中读取数据和索引,因此,为了提高查询性能,应将常用的数据和索引存储到缓存区中。InnoDB缓存池可以缓存表的数据和索引以及操作数据库时使用的元数据和控制信息。
InnoDB Buffer Pool的设置和监控
为保证InnoDB缓冲池的高效性,您必须了解InnoDB Buffer Pool的设置,即您必须设置适当的缓冲区大小以及调整相关参数,例如InnoDB数据块大小、最大连接数、线程池大小等。请查看以下示例,该示例描述了如何计算缓冲池大小。
SET innodb_buffer_pool_size=5G;
SELECT CONCAT(ROUND(KBS/POWER(1024,
LEAST(POWER(2,20),IF(MB32,32,MB))))),
SUBSTR(‘KMGT’,IF(MB32,32,MB))/10+1,1))
recommended_innodb_buffer_pool_size FROM
(SELECT CEILING(Total_InnoDB_Bytes*1.6/POWER(1024,3)) AS GB
FROM (SELECT SUM(data_length+index_length)
Total_InnoDB_Bytes FROM information_schema.tables
WHERE engine=’InnoDB’) AS
InnoDB_Tables) AS T,
(SELECT 2 AS MB) AS T2;
运行以上命令会为InnoDB缓冲池设置大小,并返回建议缓冲池大小。
使用MYSQL FLUSH命令
MYSQL FLUSH命令是MySQL提供的控制缓存和资源清单的方式。使用该命令可以清空MySQL中的缓存并重新加载InnoDB缓冲池。它在DBA执行复杂操作、更新表定义、修改授权、以及执行备份操作文件传输等情况下非常有用。
以下是延迟刷新、重要表清单、InnoDB缓冲池清单:
延长高速缓存时间(DELAY_KEY_WRITE 语句)
SET GLOBAL delayed_insert_timeout=200;
重要表清单(FLUSH TABLES 类)
FLUSH TABLES tb_name_1,tb_name_2,tb_name_3;
刷新InnoDB缓冲池
FLUSH INNODB_BUFFER_POOL;
结论
MySQL是非常流行的数据库管理系统,但由于缓存和其他复杂的因素会影响性能和稳定性。InnoDB Buffer Pool是一个非常重要的MySQL缓存机制,在使用MySQL时,必须理解如何正确配置它。使用MYSQL FLUSH命令可以帮助您清空MySQL中的缓存并重新加载InnoDB缓冲池,从而优化MySQL的性能。在进行大数据处理操作时使用缓存刷写操作,可以极大地提高MySQL的查询性能,从而提高数据库系统的整体性能和稳定性。
‘贰’ 如何清理MySQL 的查询缓存
MySQL的FLUSH可以清理mysql数据库缓存数据
MySQL的FLUSH句法(清除或者重新加载内部缓存) FLUSH flush_option [,flush_option],如果你想要清除一些MySQL使用内部缓存,你应该使用FLUSH命令。为了执行FLUSH,你必须有reload权限。
flush_option 可以是下列任何东西:
HOSTS 这个用的最多,经常碰见。主要是用来清空主机缓存表。如果你的某些主机改变IP数字,或如果你得到错误消息Host ... isblocked,你应该清空主机表。当在连接MySQL服务器时,对一台给定的主机有多于 max_connect_errors个错误连续不断地发生,MySQL为了安全的需要将会阻止该主机进一步的连接请求。清空主机表允许主机再尝试连接。
LOGS 关闭当前的二进制日志文件并创建一个新文件,新的二进制日志文件的名字在当前的二进制文件的编号上加1。
PRIVILEGES 这个也是经常使用的,每当重新赋权后,为了以防万一,让新权限立即生效,一般都执行一把,目地是从数据库授权表中重新装载权限到缓存中。
TABLES 关闭所有打开的表,同时该操作将会清空查询缓存中的内容。
FLUSH TABLES WITH READ LOCK 关闭所有打开的表,同时对于所有数据库中的表都加一个读锁,直到显示地执行unlock tables,该操作常常用于数据备份的时候。解锁的语句就是unlock tables。
FLUSH TABLES WITH READ LOCK对于数据库是全局的表锁定,如果只想锁定几个表,可以用LOCK TABLES tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE} 。这个命令同样需要unlock tables来解锁。
read-lock: 允许其他并发的读请求,但阻塞写请求,即可以同时读,但不允许任何写。也叫共享锁。write-lock: 不允许其他并发的读和写请求,是排他的(exclusive)。也叫独占锁
STATUS 重置大多数状态变量到0。
MASTER 删除所有的二进制日志索引文件中的二进制日志文件,重置二进制日志文件的索引文件为空,创建一个新的二进制日志文件,不过这个已经不推荐使用,改成reset master 了。可以想象,以前自己是多土啊,本来一条简单的命令就可以搞定的,却要好几条命令来,以前的做法是先查出来当前的二进制日志文件名,再用purge 操作。
QUERY CACHE 重整查询缓存,消除其中的碎片,提高性能,但是并不影响查询缓存中现有的数据,这点和Flush table 和Reset Query Cache(将会清空查询缓存的内容)不一样的。
SLAVE 类似于重置复制吧,让从数据库忘记主数据库的复制位置,同时也会删除已经下载下来的relay log,与Master一样,已经不推荐使用,改成Reset Slave了。这个也很有用的。
一般来讲,Flush操作都会记录在二进制日志文件中,但是FLUSH LOGS、FLUSH MASTER、FLUSH SLAVE、FLUSH TABLES WITH READ LOCK不会记录,因此上述操作如果记录在二进制日志文件中话,会对从数据库造成影响。
‘叁’ MySQL 查询缓存命中率是什么哪些因素影响查询的命中率
影响查询命中率高低的四个因素: 1.一模一样的SQL重复执行的次数 ; 2.查询语句结果集有多少缓存在query_cache_size中; 3.有多少查询语句结果集缓存,因元数据发生变化而不得不从缓存中踢出 ; 4.查询缓存能存多少结果集,那么就由query_cache_size配置信息和查询结果集的大小 有关系;