MySQL全局共享内存介绍
前言全局共享内存的MySQL实例(mysqld进程)和底层存储引擎用于全球各种操作的临时存储和共享信息,如临时存储,查询缓存的查询缓存,线程缓存连接线程缓存,缓存缓存表表文件句柄信息,BinLog Buffer二进制日志缓存,缓存存储引擎MyISAM索引缓冲关键InnoDB数据存储和InnoDB缓冲池索引等。以下是主要的共享内存的MySQL的简单分析。
查询缓存(查询缓存)
查询缓存是MySQL的唯一缓存区。它是用来缓存特定的查询结果集(结果集)信息和分享给所有客户的查询语句的具体的哈希计算后,相应的结果集存储在高速缓存来提高查询的查询语句对应的速度。当我们打开MySQL的查询缓存,MySQL接收选择类型每一个查询后,首先得到查询哈希值通过固定的散列算法,然后寻找相应的查询缓存查询。如果有,设置缓存的结果直接返回给客户端,如果没有,跟进和缓存设置查询缓存的结果返回给客户端后得到了相应的结果集。当一个表的任何变化的数据,所有的查询缓存的应用相关的表格都会失败,所以查询的表和修改缓存经常不是很适合,但是很适合那些变化少,可以大大提高查询效率,如那些静态资源表配置表等。为了尽可能有效地使用查询缓存,MySQL设计多query_cache_type值和两个查询提示:查询缓存sql_cache和sql_no_cache。当query_cache_type设置为0(或关闭)时,不使用查询缓存,当设置为1(或)时,当且仅当查询时使用的sql_no_cache MySQL将忽略查询缓存,当query_cache_type设置为2(或要求)时,当且仅当sql_cache查询提示用,MySQL将使用查询缓存查询。您可以设置最大内存空间,你可以使用query_cache_size。
连接线程缓存(线程缓存)
连接MySQL线程是为了提高创建连接线的效率,螺纹连接部分闲置时保持使用传入的连接请求的缓冲,特别是用于创建这些应用程序,使用短连接的连接效率大大提高。当我们建立的连接螺纹可缓存的连接线程缓存池通过thread_cache_size的大小,我们可以计算出连接线程缓存的命中率(连接threads_created) /连接* 100%。请注意,连接螺纹,可以缓存的数量,没有内存空间的大小,设置在这里。
表缓存(表缓存)
表缓冲区主要用于缓存表文件的文件句柄信息。在mysql5.1.3是由table_cache参数的版本,但大小变化从mysql5.1.3到table_open_cache.when客户提交查询到MySQL,MySQL查询中涉及的每个表有一个表文件句柄信息,如果没有表缓存,所以MySQL不得不频繁的启闭操作,无疑会对系统的性能有一定的影响,表缓存来解决这个问题。有表缓存后,每次MySQL需要一个表文件的处理信息,它首先会在表缓存表文件句柄。如果有,拿出来直接使用,如果没有,你只能打开文件的操作得到的文件句柄信息。使用后,MySQL会把文件哈经营信息回表缓存池被其他线程使用。注意,这里是可以缓存表文件句柄信息的数量,而不是内存空间的大小。
表定义信息缓存(表定义缓存)
表定义信息缓存是一个新的缓存区,从mysql5.1.3版本引入了存储的表定义信息。当多个表中使用了MySQL,这无疑会提高缓存表定义information.mysql访问效率提供了table_definition_cache数量参数设置表,可以在mysql5.1.25的缓存。以前的版本,默认值是128,和默认值调整为256从mysql5.1.25版,用524288的最大设定值。注意,这里是可以缓存表定义的信息的数量,而不是内存空间的大小。
二进制日志缓冲区(Binlog Buffer)
The binary log buffer is mainly used to cache the Binary Log information generated by a variety of data changes.In order to improve the performance of the system, MySQL does not always write binary logs directly into Log File, but first writes information to Binlog Buffer, and then writes to Log File when meeting certain conditions, such as sync_binlog parameter settings.We can set the memory size that can be used by binlog_cache_size, and at the same time, limit the maximum size by max_binlog_cache_size. (当MySQL正在申请更多的内存时,一个单一的交易太大),当所需内存大于max_binlog_cache_size参数设置,MySQL会报告错误:多语句事务需要超过max_binlog_cache_size的字节的存储。
MyISAM索引缓存(Key Buffer)
MyISAM索引缓存缓存的MyISAM表的索引信息在内存中以提高其访问性能。这个缓存可以说是一个影响MyISAM存储引擎性能的重要因素,和最大的内存空间,可以通过设置key_buffere_size。
Innodb日志缓冲区(innodb log buffer)
这是由InnoDB存储引擎的事务日志所使用的缓冲区。类似于Binlog Buffer InnoDB,写入事务日志时,为了提高性能,还写信息给Innofb Log Buffer第一,当相应的条件满足innodb_flush_log_trx_commit参数设置(或日志缓冲区满),会写到日志文件(或同步到磁盘),最大内存空间,它可以用可设定的innodb_log_buffer_size参数。
注:本innodb_flush_log_trx_commit参数对Innodb日志写入性能的一个非常关键的影响。该参数可以设置为0, 1,和2,这说明如下:
* 0:日志缓冲区数据将被写入第二个频率到日志文件,并在文件系统同磁盘的同步操作的同时,但每个事务的提交不会触发日志文件系统中的任何日志缓冲区来刷新或刷新磁盘的操作;
* 1:日志缓冲区中的数据将在每次事务时写入日志文件,并触发文件系统与磁盘的同步;
* 2:事务提交触发日志缓冲区刷新到日志文件,但不会触发磁盘文件系统与磁盘的同步。此外,每秒将有一个文件系统到磁盘同步。
此外,文件还提到,MySQL机制同步每秒一次这些设置可能无法完全保证每一秒的精度,而且还取决于进程调度的问题。事实上,InnoDB可以满足参数设定值代表正常恢复的意义或不同操作系统的文件系统和磁盘本身的限制,有时并没有真正完成会告诉mysqld已完成磁盘同步。
InnoDB数据和索引缓存(InnoDB缓冲池)
InnoDB缓冲池的InnoDB存储引擎类似于MyISAM存储引擎的关键缓冲效果,主要的区别是InnoDB缓冲池索引数据不仅会缓存,缓存表中的数据,并根据数据文件的结构信息来缓存数据,并且Oracle SGA的数据库缓冲区高速缓存非常相似。因此,InnoDB缓冲池对InnoDB存储引擎的性能的影响是可以想象的。我们可以得到InnoDB缓冲池的命中率(innodb_buffer_pool_read_requests - innodb_buffer_pool_reads) / innodb_buffer_pool_read_requests * 100%。
InnoDB词典信息缓存(InnoDB内存池)
InnoDB词典信息缓存主要是用来存储InnoDB存储引擎的词典信息和共享数据结构的一些内部信息,因此系统的规模也对InnoDB存储引擎系统中使用的数量有关。但是,如果我们没有足够的内存大小设置innodb_additional_mem_pool_size参数InnoDB会自动申请更多的记忆和记录的警告信息,在错误日志MySQL。
不同的共享内存,这里列出的是主要的共享内存,我个人认为对MySQL的性能有显著的影响。事实上,除了这些共享内存,MySQL也有许多其他的共享内存的信息,如back_log队列连接请求信息的要求时,在同一时间有太多的连接。
以上的分析可能是不合适的,欢迎派专,一起交流。