Mysql 配置的工做原理

可能有时候咱们会问,“个人服务器有50 GB内存,12核CPU,怎样配置最好?” 很遗憾,问题没这么简单,MySQL 服务器的配置应该符合它的工做负载,数据,以及应用需求,并不只仅看硬件的状况。一般只须要把基本的项配置正确,应该将更多的时间花费在 schema 的优化,索引,以及查询设计上。mysql

1、查找配置文件

为 Mysql 服务器建立一个靠谱的配置文件过程。
MySQL是从命令行参数配置文件得到配置信息。
在类 UNIX 系统中,配置文件的位置通常在 /etc/my.conf 或者 /etc/mysql/my.conf 中。sql

必定要清楚的知道服务器配置文件的位置!有时候咱们尝试修改配置文件可是不生效,由于修改的并非服务器读取的文件。不过咱们能够用下面的命令来找出正在运行的mysql的配置文件的位置。数据库

➜  ~ which mysqld
/usr/local/bin/mysqld
➜  ~ /usr/local/bin/mysqld --verbose --help | grep -A 1 'Default options'
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
➜  ~

2、语法、做用域和动态性

1.语法

配置项设置都使用小写,单词之间用下划线横线隔开。下面的例子是等价的,而且可能在命令行和配置文件中都看到这两种格式:缓存

/usr/local/bin/mysqld --auto-increment-offset=5
/usr/local/bin/mysqld --auto_increment_offset=5

在这里咱们建议使用一种固定的风格。bash

2.配置项做用域

配置项能够有多个做用域。有些设置是服务器级的(全局做用域),有些对每一个链接是不一样的(会话做用域),剩下的一些是对象级的。服务器

许多会话级变量跟全局变量相等,能够认为是默认值。若是改变会话级变量,它只影响改动的当前链接,当链接关闭时全部的参数变动都会失效。socket

举例:性能

  • query_cache_size 变量是全局的
  • sort_buffer_size 变量默认是全局相同的,但每一个线程里也能够设置

另外,除了在配置文件中设置变量,有不少变量(但不是全部)也能够在服务器运行时修改。MySQL 把这些归为动态配置变量。优化

SET sort_buffer_size = 2000;

若是动态的设置变量,要注意 MySQL 关闭时可能丢失这些设置,若是想保持这些设置,仍是须要修改配置文件。ui

若是在服务器运行时修改了变量的全局值,这个值对当前会话和其余任何已经存在的会话都不起效果,这是由于会话的变量值是在连续建立时从全局值初始化来的。在每次变动后,应该检查 SHOW_GLOBAL_VARIABLES 的输出,确认已经按照指望变动了。

3.设置变量的反作用

动态设置变量可能致使意外的反作用,例如从缓冲中刷新脏块。务必当心那些能够在线更改的设置,由于它们可能致使数据库作大量的工做。

经常使用的变量:

key_buffer_size      键缓冲区 
table_cache_size     表能够被缓存的数量
thread_cache_size    线程缓存
query_cache_size     查询缓存
read_buffer_size     
sort_buffer_size      排序操做缓存分配内存

3、建立MySQL配置文件

正如咱们前面提到的,没有一个适合全部场景的“最佳配置文件”,好比,对一台有18GB 内存和 12 块硬盘的 4 路CPU服务器,不会有一个相应的“最佳配置文件”。应该开发本身的配置,由于即便是一个好的起点,也依赖于具体是如何使用服务器的。

实际上MySQL 的可配置性太强也能够说是一个弱点,看起来好像须要花费不少的时间在配置上,其实大多数配置的默认值已是最佳配置了,因此,不要改动太多配置。
下面就是这个基础配置文件:

[mysqld]
#GENERAl
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock 
pid_file=/var/lib/mysql/mysql.pid
user=mysql
port = 3306 
default_storage_engine=InnoDB
#INNODB
innodb_buffer_pool_size=<value>
innodb_log_file_size=<value>
innodb_file_per_table=1
innodb_flush_method=0_DIRECT
#LOGGING
log_error=/var/lib/mysql/mysql-error.log
slow_query_log=/var/lib/mysql/mysql-slow.log
#OTHER
tmp_table_size=32M
max_heap_table_size=32M
max_connections=<value>
open_files_limit=65535
socket=/var/lib/mysql/mysql.sock

# Replication Master Server (default) 
# binary logging is required for replication 
log-bin=mysql-bin

# binary logging format - mixed recommended 
binlog_format=mixed

4、配置内存使用

配置MySQL正确使用内存量对高性能事关重要。MySQL内存消耗能够分为两类
能够控制的内存不可控制的内存。没法控制MySQL服务器运行、解析查询,以及其内部管理所消耗的内存,可是为特定目的而使用多少内存则有不少参数能够控制。

能够按下面的步骤来配置内存:

  1. 肯定可使用的内存上限。
  2. 肯定每一个链接MySQL须要使用多少内存,例如排序缓冲和临时表。
  3. 肯定操做系统须要多少内存才够用。包括同一台机器上其余程序使用的内存,如定时任务。
  4. 把剩下的内存所有给 MySQL 缓存,例如 INNODB 的缓存池,这样作颇有意义。
相关文章
相关标签/搜索