【高性能MySQL第3版】第8章 优化服务器设置 中上

版权声明:高性能MySQL是第3版,注意mysql版本;很多博客都参考或者直接转载自网络,如果不方便被转载,看到请与我联系 https://blog.csdn.net/ma15732625261/article/details/81843507

8.4配置内存使用

内存消耗:控制内存和不可控内存

配置内存步骤:

  1. 确定可使用内存上限
  2. 确定每个连接MySQL需要使用多少内存:排序缓冲和临时表
  3. 确定操作系统需要多少内存:包其他程序使用的内存
  4. 剩下的内存给mysql缓冲

8.4.1mysql可使用多少内存

1、机器上安装了多少物理内存

2、考虑系统或架构的限制:

    mysql单进程多线程,受系统限制:32位linux内核通常限制任意进程可使用的内存量在2.5G~2.7G

    64位限制:5.0及前版本上,有4G限制,MySQL手册上记载每个变量最大值

3、堆栈大小和其他设置的限制

8.4.2每个连接需要的内存

mysql保持一个连接只需要少量内存,还要求一个基本量的内存来执行任何给定查询;

知道高峰期消耗多少内存:使用许多大的临时表或复杂存储过程的查询、高内存消耗;

观察服务器在真实工作压力下使用了多少内存,可在进程的虚拟内存大小看到

8.4.3为操作系统保留内存

如无虚拟内存正在交换Paging到磁盘:操作系统内存足够

至少保留1G~2G的内存,建议2G或总内存5%为基准:较大者为准,可再增加一些预留

不为操作系统缓存增加任何内存:可能会变得非常大

    通常利用all剩下的内存做文件系统缓存,这应从操作系统自身需求分离出来

8.4.4为缓存分配内存

MySQL为缓存分配更多的内存,使用缓存类避免磁盘访问

最重要的缓存:

  • InnoDB缓冲池
  • InnoDB日志文件和MyISAM数据的操作系统缓存
  • MyISAM键缓存
  • 查询缓存
  • 无法手工配置的缓存,例如二进制日志和表定义的操作系统缓存

8.4.5InnoDB缓冲池Buffer Pool

很大缓冲池;预热、关闭都花费时间

无法同时加速关闭和重启两个动作:事先知道何时关闭InnoDB,可在运行时修改innodb_max_dirty_pages_pct变量,将值改小、等刷新线程清理缓冲池,脏页较少时关闭

     默认通过后台线程刷新脏页,合并写入,高效顺序写到磁盘:延迟缓冲池中刷写脏页的操作:直到其他线程必须使用空间才刷写【传送门

很大的缓存池,重启后服务器也许需要花很长的时间预热缓冲池,特别是磁盘很慢,可用Percona Server加快预热,或重启后立即全表扫描或索引扫描把索引载入缓冲池

8.4.6MyISAM键缓存Key Caches

只缓存索引,大部分是该表、为键缓存分较多内存,分配前了解myisam索引实际上占用多少磁盘空间:设置不要超索引总大小或操作系统保留内存的25%~50%,更小为准

=索引存储占用空间

默认将all索引缓存在默认键缓存中:第一次需访问MYI文件时

1、可创建键缓冲:配置文件添加key_buffer_1.key_buffer_size=1G

2、key_buffer_1缓存t1、t2索引

3、show status 和 show variables监控键缓冲使用情况:

4、缓存区使用率:没什么用

5、每秒缓存未命中次数:key_reads/Uptime

6、每10s获一次状态值的变化量

7、使用操作系统缓存 缓存数据文件

8、不管有没有myisam,需要将key_buffer_size设置为较小的值:mysql服务器内部有时会使用myisam:group by

mysql键缓存块大小

5.1及后可设置myisam索引块的大小(myisam_block_size)和操作系统一样,以避免写时读取

8.4.7线程缓存

存为后面新连接服务的线程:

      新连接创建,缓存有线程删一个并分配给新连接,连接关闭、缓存有空间,线程放回缓存无则毁

查看threads_created,设置thread_cache_size(指定缓存中可存线程数)合适

8.4.8表缓存 Table cache

包含表frm文件的解析结果,其他数据:依赖存储引擎

可重用资源,是服务器存储引擎间分离不彻底的产物

    myisam查看关闭是否干净:表索引文件计数器

mysql5.1:

1、打开表的缓存:opened_tables,建删临时表、不停增长

2、表定义缓存:table_definition_cache设置,解析frm文件的结果,从其他资源分离出来:表描述符;全局、all连接共享;可足够高但myisam可使关机time long

无法打开更多文件:可能需要增mysql容许打开文件的数,同my.cnf设open_files_limit

线程和表缓存需要内存不多,有效节约资源,提升效率

8.4.9InnoDB数据字典Data Dictionary

innodb开一张表,增加对象到字典,关闭时不移除;内存泄漏

第一次开表计算统计信息,I/O操作,代价高,可在percona server(5.6中的innodb_analyze_is_persistent)打开innodb_use_sys_stats_table存统计信息到磁盘

启动后,innodb统计可能对服务器和特定查询产生冲击,可关闭innodb_stats_on_metadata避免耗时表统计信息刷新

innodb为每个.ibd使用单个 全局文件描述符(myisam表缓存),设置了innodb_file_per_table则可保持打开.ibd数有限,bestinnodb_open_files足够大使服务器可保持all.ibd文件同时打开

猜你喜欢

转载自blog.csdn.net/ma15732625261/article/details/81843507
今日推荐