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 的緩存池,這樣作頗有意義。
相關文章
相關標籤/搜索