zoukankan      html  css  js  c++  java
  • 8.12 Optimizing the MySQL Server 优化MySQL Server 优化

    8.12 Optimizing the MySQL Server 优化MySQL Server 优化

    8.12.1 System Factors and Startup Parameter Tuning 系统因素和启动参数调整

    8.12.2 Tuning Server Parameters 调整server参数

    8.12.3 Optimizing Disk I/O 优化Disk I/O

    8.12.4 Using Symbolic Links 使用符号连接

    8.12.5 Optimizing Memory Use 优化内存使用

    8.12.6 Optimizing Network Use 优化网络使用

    8.12.7 The Thread Pool Plugin

    这个章节讨论了数据库的优化技术, 主要处理系统配置而不是SQL语句优化。

    这章的信息适用于DBA 需要确保性能和可扩展性,对于开发构建安装脚本包括设置数据库

    8.12.1 System Factors and Startup Parameter Tuning

    我们首先从系统层面因素入手,因为这些决策必须在早期决定来完成大的性能。

    在其他情况下,快速查看这种章节就够了。

    在MySQL 投产前,我们建立在你的平台上测试下:

    其他注意事项:

    1.如果你有足够的内存,你可以删除所有的swap设备。一些操作系统使用一个swap设备在一些内存交换

    2.为了避免MyISAM 表的外部锁定,自MySQL 4.0以来,默认外部锁定是关闭的在所有的系统。

    -external-locking and –skip-external-locking options 显示的启动和禁用外部锁定:

    禁用external locking 不影响MySQL的工作,你只要记录关闭服务器( 或者lock 和flush 相关的表)

    在你运行myisamchk前,在一些系统,它是强制禁用外部锁定的 因为它不工作:

    8.12.2 Tuning Server Parameters 调整Server 参数

    你可以通过使用mysqld server 使用下面的命令来调整默认buffer size 值:

    8.12.3 Optimizing Disk I/O 优化磁盘I/O

    这个章节描述配置存储设备当你分配更多的或者更快的存储引擎给数据库服务器。

    磁盘搜索时一个很大的性能瓶颈,这个问题变得更加明显当数据开始变的如此之大,有效的缓存变的不可能。

    对于大的数据库,你访问的数据的多少是随机的,你可以肯定 你需要至少一个磁盘搜素来读和一对磁盘寻址来写。

    最小化这个问题,使用寻址时间少的磁盘。

    增加可用磁盘数量(降低磁盘寻址开销)通过连接文件到不同的磁盘或者条带化磁盘

    1.使用符号连接

    这意味着 ,对于MyISAM 表,你的连接到索引文件和数据文件从它们的平常的位置到另外的磁盘

    (也可以是条带).

    这使得寻址和读的时间都变的更好,假设磁盘是不用于其他用途。见第8.12.4,“使用符号链接”。

    符号连接是不支持用于InnoDB 表,然而, 你可以创建一个InnoDB file-per-table tablespace

    在一个位置在MySQL 数据目录之外 使用 DATA DIRECTORY = absolute_path_to_directory

    2.Striping 条带化

    条带意味着你有很多的磁盘,把第一个block放在第一个磁盘,第2个block放到第2个磁盘, and the N-th block on the (N MOD

    number_of_disks) disk, and so on.

    这意味着如果你的正常数据是小于条带大小(或者完全对齐),你会获得更好的性能。

    对于可靠性,你需要使用RAID0+1 (条带加镜像), 在这种情况下,

    你需要2*N 设备来保存N的数据设备。

    一个很好的选项是根据不同的数据类型选择不同的RAID LEVEL

    8.12.4 Using Symbolic Links

    8.12.4.1 Using Symbolic Links for Databases on Unix
    8.12.4.2 Using Symbolic Links for MyISAM Tables on Unix

    你可以移动数据库或者表从数据库的一个目录到其他地方,替换它们使用符号连接到新的位置。

    8.12.5 Optimizing Memory Use 优化内存使用

    8.12.5.1 How MySQL Uses Memory MySQL如何使用内存:

    下面的列表表明mysqld 使用内存的一些方法, 在适用的情况下,系统变量的名称和相关内存的使用:

    所有的threads 共享MyISAM key buffer, 它的大小有key_buffer_size决定。

    其他的buffer 用于服务器是按需要分配

    每个thread 用于管理客户端连接使用一些 thread-specific space.下面的列表表明

    那些,那些变量控制大小:

    A stack (variable thread_stack)

    A connection buffer (variable net_buffer_length)

    A result buffer (variable net_buffer_length)

    The connection buffer and result buffer 每个开始和net_buffer_length一样的大小,

    但是可以动态增大到max_allowed_packet bytes 如果需要的话。result buffer 缩小

    net_buffer_length bytes在每个SQL语句后, 当一个语句执行时,一个当前语句字符串的拷贝也被分配。

    All threads share the same base memory. 所有的threads 共享base memory

    当一个thread 不再需要, 分配给它的内存是被释放,返回给系统 除非thread 回到thread cache.

    在这种情况下,内存仍旧保持分配。

    myisam_use_mmap 系统变量可以设置为1来启用 memory-mapping for all MyISAM tables.

    每个请求执行一个顺序的扫描 分配一个read buffer(variable read_buffer_size).

    当读取记录按任意的顺序(比如,排序),一个random-read buffer (variable read_rnd_buffer_size) 可能被分配避免磁盘寻址

    所有的关联是执行在一个单独的pass,但是很多的关联可以不需要使用临时表。

    很多的临时表是memory-based hash tables.

    如果一个内部的 in-memory temporary table变的太大, MySQL 自动的处理通过改变表从 in-memory to on-disk format,

    被MyISAM 存储引擎处理。

    大多数请求执行一个排序分分配一个sort buffer ,从0到2个临时文件依赖result set size. See Section B.5.4.4, “Where

    MySQL Stores Temporary Files”.

    几乎所有的解析和计算是在 thread-local 和可重用的内存池里。

    没有内存负载是需要的对于小的项目,因此通常缓慢的内存分配和释放是避免的,

    对于每个打开的MyISAM表, 索引文件通常被打开,数据文件打开一次用于每个并发运行的thread.

    每个并发thread,一个表结构,列结构对于每列,buffer大小是3 * N 被分配

    每个表有BLOB列,一个Buffer 会自动扩大 拉IDU更大的BLOB值。如果你扫描一个表

    处理程序结构 对于所有使用的表是保存在cache里通过FIFO管理。

    初始的大小是采取 table_open_cache system variable.

    如果一个表已经用于2个运行的thread 同一时间,cache包含表的2个entries.

    一个FLUSH TABLES 语句或者mysqladmin flush-tables 命令关闭所有的表,立即不被使用和让所有使用的表关闭

    当强制执行的thread 完成。这个有效的释放大多数的内存,

    FLUSH TABLES 不返回知道所有的表被关闭。

    server caches 信息在内存里结果是 GRANT, CREATE USER, CREATE SERVER, and INSTALL PLUGIN statements.

    这个内存不被释放通过相应的REVOKE, DROP USER, DROP SERVER, and UNINSTALL PLUGIN statements。

    8.12.5.2 Enabling Large Page Support 启用大页支持

  • 相关阅读:
    springboot springdata 整合es
    forkJoinPool
    springboot整合ElasticSearch
    雪花算法生成全局唯一ID
    linux环境下elasticsearch+kibana+ik(实现热词自动更新)
    ECMAScript 6新特性简记
    Tsung:开源多协议分布式负载&压力测试工具
    js 数组迭代方法总结
    js for循环
    箭头函数this的问题
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13351240.html
Copyright © 2011-2022 走看看