`
wcdzxxgc
  • 浏览: 83803 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

转:MySQL之缓存讲解大全

阅读更多
  全局共享内存主要是 MySQL Instance(mysqld进程)以及底层存储引擎用来暂存各种全局运算及可共享的暂存信息,如存储查询缓存的 Query Cache,缓存连接线程的 Thread Cache,缓存表文件句柄信息的 Table Cache,缓存二进制日志的 BinLog Buffer, 缓存 MyISAM 存储引擎索引键的 Key Buffer以及存储 InnoDB 数据和索引的 InnoDB Buffer Pool 等等。下面针对 MySQL 主要的共享内存进行一个简单的分析。

        查询缓存(Query Cache):查询缓存是 MySQL 比较独特的一个缓存区域,用来缓存特定 Query 的结果集(Result Set)信息,且共享给所有客户端。通过对 Query 语句进行特定的 Hash 计算之后与结果集对应存放在 Query Cache 中,以提高完全相同的 Query 语句的相应速度。当我们打开 MySQL 的 Query Cache 之后,MySQL 接收到每一个 SELECT 类型的 Query 之后都会首先通过固定的 Hash 算法得到该 Query 的 Hash 值,然后到 Query Cache 中查找是否有对应的 Query Cache。如果有,则直接将 Cache 的结果集返回给客户端。如果没有,再进行后续操作,得到对应的结果集之后将该结果集缓存到 Query Cache 中,再返回给客户端。当任何一个表的数据发生任何变化之后,与该表相关的所有 Query Cache 全部会失效,所以 Query Cache 对变更比较频繁的表并不是非常适用,但对那些变更较少的表是非常合适的,可以极大程度的提高查询效率,如那些静态资源表,配置表等等。为了尽可能高效的利用 Query Cache,MySQL 针对 Query Cache 设计了多个 query_cache_type 值和两个 Query Hint:SQL_CACHE 和 SQL_NO_CACHE。当 query_cache_type 设置为0(或者 OFF)的时候不使用 Query Cache,当设置为1(或者 ON)的时候,当且仅当 Query 中使用了 SQL_NO_CACHE 的时候 MySQL 会忽略 Query Cache,当 query_cache_type 设置为2(或者DEMAND)的时候,当且仅当Query 中使用了 SQL_CACHE 提示之后,MySQL 才会针对该 Query 使用 Query Cache。可以通过 query_cache_size 来设置可以使用的最大内存空间。

        连接线程缓存(Thread Cache):连接线程是 MySQL 为了提高创建连接线程的效率,将部分空闲的连接线程保持在一个缓存区以备新进连接请求的时候使用,这尤其对那些使用短连接的应用程序来说可以极大的提高创建连接的效率。当我们通过 thread_cache_size 设置了连接线程缓存池可以缓存的连接线程的大小之后,可以通过(Connections - Threads_created) / Connections * 100% 计算出连接线程缓存的命中率。注意,这里设置的是可以缓存的连接线程的数目,而不是内存空间的大小。

        表缓存(Table Cache):表缓存区主要用来缓存表文件的文件句柄信息,在 MySQL5.1.3之前的版本通过 table_cache 参数设置,但从MySQL5.1.3开始改为 table_open_cache 来设置其大小。当我们的客户端程序提交 Query 给 MySQL 的时候,MySQL 需要对 Query 所涉及到的每一个表都取得一个表文件句柄信息,如果没有 Table Cache,那么 MySQL 就不得不频繁的进行打开关闭文件操作,无疑会对系统性能产生一定的影响,Table Cache 正是为了解决这一问题而产生的。在有了 Table Cache 之后,MySQL 每次需要获取某个表文件的句柄信息的时候,首先会到 Table Cache 中查找是否存在空闲状态的表文件句柄。如果有,则取出直接使用,没有的话就只能进行打开文件操作获得文件句柄信息。在使用完之后,MySQL 会将该文件句柄信息再放回 Table Cache 池中,以供其他线程使用。注意,这里设置的是可以缓存的表文件句柄信息的数目,而不是内存空间的大小。

        表定义信息缓存(Table definition Cache):表定义信息缓存是从 MySQL5.1.3 版本才开始引入的一个新的缓存区,用来存放表定义信息。当我们的 MySQL 中使用了较多的表的时候,此缓存无疑会提高对表定义信息的访问效率。MySQL 提供了 table_definition_cache 参数给我们设置可以缓存的表的数量。在 MySQL5.1.25 之前的版本中,默认值为128,从 MySQL5.1.25 版本开始,则将默认值调整为 256 了,最大设置值为524288。注意,这里设置的是可以缓存的表定义信息的数目,而不是内存空间的大小。

        二进制日志缓冲区(Binlog Buffer):二进制日志缓冲区主要用来缓存由于各种数据变更操做所产生的 Binary Log 信息。为了提高系统的性能,MySQL 并不是每次都是将二进制日志直接写入 Log File,而是先将信息写入 Binlog Buffer 中,当满足某些特定的条件(如 sync_binlog参数设置)之后再一次写入 Log File 中。我们可以通过 binlog_cache_size 来设置其可以使用的内存大小,同时通过 max_binlog_cache_size 限制其最大大小(当单个事务过大的时候 MySQL 会申请更多的内存)。当所需内存大于 max_binlog_cache_size 参数设置的时候,MySQL 会报错:"Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage"。

        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 Log 的写入性能有非常关键的影响。该参数可以设置为0,1,2,解释如下:
0:log buffer中的数据将以每秒一次的频率写入到log file中,且同时会进行文件系统到磁盘的同步操作,但是每个事务的commit并不会触发任何log buffer 到log file的刷新或者文件系统到磁盘的刷新操作。

1:在每次事务提交的时候将log buffer 中的数据都会写入到log file,同时也会触发文件系统到磁盘的同步;

2:事务提交会触发log buffer 到log file的刷新,但并不会触发磁盘文件系统到磁盘的同步。此外,每秒会有一次文件系统到磁盘同步操作。
        此外,MySQL文档中还提到,这几种设置中的每秒同步一次的机制,可能并不会完全确保非常准确的每秒就一定会发生同步,还取决于进程调度的问题。实际上,InnoDB 能否真正满足此参数所设置值代表的意义正常 Recovery 还是受到了不同 OS 下文件系统以及磁盘本身的限制,可能有些时候在并没有真正完成磁盘同步的情况下也会告诉 mysqld 已经完成了磁盘同步。

        InnoDB 数据和索引缓存(InnoDB Buffer Pool):InnoDB Buffer Pool 对 InnoDB 存储引擎的作用类似于 Key Buffer Cache 对 MyISAM 存储引擎的影响,主要的不同在于 InnoDB Buffer Pool 不仅仅缓存索引数据,还会缓存表的数据,而且完全按照数据文件中的数据快结构信息来缓存,这一点和 Oracle SGA 中的 database buffer cache 非常类似。所以,InnoDB Buffer Pool 对 InnoDB 存储引擎的性能影响之大就可想而知了。可以通过 (Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests * 100% 计算得到 InnoDB Buffer Pool 的命中率。

        InnoDB 字典信息缓存(InnoDB Additional Memory Pool):InnoDB 字典信息缓存主要用来存放 InnoDB 存储引擎的字典信息以及一些 internal 的共享数据结构信息。所以其大小也与系统中所使用的 InnoDB 存储引擎表的数量有较大关系。不过,如果我们通过 innodb_additional_mem_pool_size 参数所设置的内存大小不够,InnoDB 会自动申请更多的内存,并在 MySQL 的 Error Log 中记录警告信息。

        这里所列举的各种共享内存,是我个人认为对 MySQL 性能有较大影响的集中主要的共享内存。实际上,除了这些共享内存之外,MySQL 还存在很多其他的共享内存信息,如当同时请求连接过多的时候用来存放连接请求信息的back_log队列等。

希望本文能对你有所收获。
分享到:
评论

相关推荐

    MySQL复习笔记七:MySQL官方文档及阅读辅助工具

    MySQL作为一款广泛使用的开源关系型数据库管理系统,它的官方文档是学习和掌握MySQL的重要资料之一。本文将围绕MySQL 5.7的官方文档进行深入探讨,帮助读者更好地理解文档结构、关键知识点以及如何高效利用这些资源...

    全面讲解MySQL性能管理及架构设计

    - **查询缓存**:虽然MySQL 8.0版本之后已经移除了查询缓存功能,但理解其工作原理有助于更好地优化查询性能。 - **执行计划分析**:使用EXPLAIN命令分析SQL执行计划,找出性能瓶颈。 3. **配置调优**: - **...

    MySQL_OCP5.7带讲解.pdf

    key_buffer_size是MySQL服务器中的一个重要配置项,它定义了用于缓存MyISAM表索引块的内存大小。这个内存区域也称为键缓存或keycache。 - key_buffer_size仅对MyISAM表的索引块进行缓存,对InnoDB表的索引块不进行...

    lnmp安装(nginx mysql php )

    本文将详细讲解如何在Linux系统上安装这三个关键组件,构建一个功能强大的Web服务环境。 首先,让我们从Nginx开始。Nginx是一款高性能的HTTP和反向代理服务器,以其高并发处理能力而闻名。它采用事件驱动的异步非...

    Mysql手册_MYSQL_

    13. 性能优化:MySQL手册中包含了各种性能优化技巧,如查询优化、索引优化、内存配置和查询缓存等。 本手册详细讲解了上述所有概念,并通过实例演示了如何在实际应用中使用MySQL。无论你是初学者还是经验丰富的...

    mysql 8.0中文参考手册

    MySQL 8.0中文参考手册是一本详尽的指南,为用户提供关于MySQL 8.0版本的全面信息。MySQL是一个广泛使用的开源关系型数据库管理系统(RDBMS),它以其高效、稳定和易于扩展的特性而受到全球开发者的青睐。手册以中文...

    mysql性能调优讲解

    MySQL作为全球最受欢迎的开源数据库之一,在众多应用场景中发挥着重要作用。然而,随着数据量的增长和业务复杂度的提高,MySQL数据库可能会出现性能瓶颈,导致响应时间变长、查询效率降低等问题。因此,MySQL性能...

    MySQL技术大全:开发、优化与运维实战实例源代码.rar

    《MySQL技术大全:开发、优化与运维实战实例源代码》是一本深入探讨MySQL数据库系统的技术书籍,涵盖了开发、性能优化和运维等多个方面的实践内容。这本书的源代码包含了丰富的实例,帮助读者更好地理解和应用书中...

    mysql server 5.1参考手册

    10. **事务与并发控制**:MySQL支持ACID(原子性、一致性、隔离性和持久性)特性,手册会讲解如何使用事务,以及锁机制以确保并发操作的正确性。 11. **复制与备份**:MySQL的复制功能使得数据可以实时同步到多个...

    MySQL大佬姜承尧47完整课程笔记,进阶涨薪必看,内含MySQL配置文件

    MySQL是世界上最受欢迎的关系型数据库管理系统之一,尤其在互联网行业中,其高效、稳定和灵活的特点使其在数据存储和管理方面占据重要地位。姜承尧作为知名的MySQL专家,他的课程深受业界欢迎,尤其对于想要提升...

    MySQL_5.5中文手册

    5. **性能优化**:MySQL 5.5引入了诸多性能改进,如InnoDB存储引擎的优化、查询缓存、索引优化等。手册将指导如何通过查询分析、索引策略和服务器调整来提高数据库性能。 6. **备份与恢复**:MySQL提供了多种备份...

    MySQL 5.1官方简体中文手册

    7. **性能优化**:这部分会讲解如何通过优化查询、调整查询缓存、使用分区表和配置参数来提升MySQL的性能。还会涉及性能分析工具,如EXPLAIN和SHOW STATUS命令。 8. **复制与集群**:MySQL 5.1支持主从复制,可以...

    mysql学习资料(全面)

    MySQL是世界上最受欢迎的关系型数据库管理系统之一,尤其在Web应用程序中被广泛应用。本学习资料全面涵盖了MySQL的基础知识到高级特性,包括深入理解、性能优化、分布式存储、缓存管理以及锁机制等多个方面,旨在...

    Mysql5.7官方文档

    7. **性能优化**:MySQL 5.7提供了性能监视器、查询缓存和查询优化器等工具来提升系统性能。文档将指导用户如何分析和优化查询,以及如何调整系统参数以适应不同工作负载。 8. **复制与高可用性**:MySQL 5.7的复制...

    mysql优化.txt

    本文将重点围绕MyISAM表类型的key cache进行详细讲解,并涉及InnoDB存储引擎的相关特性,以及MySQL查询缓存的管理。 #### MyISAM 存储引擎与 Key Cache MyISAM是MySQL早期广泛使用的存储引擎之一,它提供了快速的...

    MySQL 8 中文参考手册.zip chm格式,中英文对照

    MySQL 8 是一款广泛使用的开源关系型数据库管理系统,它的最新版本带来了许多性能改进、安全增强以及新特性的引入。这份“MySQL 8 中文参考手册”以CHM(Compiled HTML Help)格式提供,方便用户离线查阅。CHM格式是...

    MYSQL教程 pdf文件

    2. **MySQL安装与配置**:这部分可能会讲解如何在不同的操作系统上安装MySQL,以及如何配置服务器设置,如端口、用户权限等。 3. **数据库与表的创建**:教程会涵盖如何创建数据库,定义表结构,包括选择合适的字段...

    高性能mysql PDF 中英文合集

    《高性能MySQL》是数据库管理员、开发人员和系统架构师必备的一本经典著作,特别是对于处理大规模数据和高并发场景的企业来说,这本书提供了丰富的知识和实践经验。该书的第三版不仅涵盖了MySQL的基础操作,还深入...

Global site tag (gtag.js) - Google Analytics