高性能MySql学习笔记-第八章:优化服务器设置

本章关于MySQL配置的介绍似乎更适合DBA 。所以本章笔记只记录了一些定性的东西,具体的配置项及用法不会过多着墨。

1. MySQL配置的工作原理

  • 命令行和配置文件中可以获得MySQL的配置信息。在类UNIX系统中,配置文件的位置一般在/etc/my.conf或者/etc/mysql/my.conf
  • 配置项可以有多个作用域,有服务器级别的,会话级别的和对象级别的。
  • 配置的值并不是越大越好。

2. 配置内存使用

  • MySQL保持连接只需要少量的内存。
  • InnoDB缓冲池往往更需要内存,因为它并不仅仅缓存索引,还会缓存行的数据,自适应哈希索引,插入缓冲锁和其他内部数据结构。
  • 线程缓存保存那些当前没有与连接关联但是准备为后面新的连接服务的线程。当新的连接创建时,如果线程缓存中有线程存在,则从缓存中取出这个线程并使用。当连接关闭时,如果线程缓存还有空间,则将线程放入缓存,否则销毁这个线程。
  • InnoDB 有自己的表缓存,可以称之为表定义缓存或者数据字典。InnoDB每打开一个表,则增加一个对应的对象到数据字典。

3. 配置MySQL的IO行为

InnoDB的IO配置

  • InnoDB事务日志

    • InnoDB使用事务日志将随机IO转换为顺序IO,以减少事务提交时的开销。
    • 可以修改innodb_flush_log_at_rtx_commit变量来控制日志缓冲刷新的频繁程度。该变量可以取值为0、1、2。高性能事务处理需要的最佳配置时把innodb_flush_log_at_trx_commit设置为1并且把日志文件放到一个有电池保护的写缓存的RAID卷中。这兼顾了安全和速度。
  • InnoDB怎样打开和刷新日志以及数据文件

    • 使用innodb_flush_method选项可以配置InnoDB如何跟文件系统相互作用。这个配置能够影响InnoDB如何读、写数据。该配置的选项有fdatasync、0_DIRECT、ALL_0_DIRECT、0_DSYNC、async_unbuffered、unbuffered、normal等。其中Windows系统默认为unbuffered,其他系统默认为fdatasync。
    • 如果使用类UNIX系统并且RAID控制器带有电池保护的写缓存,则建议使用0_DIRECT
  • InnoDB表空间

    • InnoDB把数据保存在表空间内,本质上是由一个或多个磁盘文件组成的虚拟文件系统。InnoDB用表空间并不只是存储表和索引,还存储了回滚日志、插入缓冲、双写缓冲等。
    • innodb_file_per_table选项让InnoDB为每张表使用一个文件。这个设置可能导致DROP TABLE时性能较差,但是仍建议使用该配置并给共享表空间设置大小范围。

4. 配置MySQL并发

  • InnoDB有自己的“线程调度器”控制线程怎么进入内核访问数据。innodb_thread_concurrency变量可以限制一次性由多少线程可以进入内核,0表示不限制。
  • 一旦线程进入内核,它会有一定数量的“票据(tickets)”,可以让它不需要再做并发检查即可回到内核。innodb_concurrency_tickets配置控制票据的数量。
  • innodb_commit_concurrency变量控制有多少个线程可以在同一时间提交。

5. 基于工作负载的配置

  • 服务器不能在内存表中存储BLOB值,如果一个查询设计BLOB值,又需要使用临时表,不管它多小,他都会立即在磁盘上创建临时表。这样效率很低。
  • 当InnoDB更新存储在扩展存储空间中的大字段时,将不会在原来的位置更新,而是会在拓展存储空间中写一个值到一个新的位置,并且不会删除旧的值。
posted @ 2021-11-27 00:54  员力  阅读(52)  评论(0编辑  收藏  举报