mysql中的主要的引數
1檢視mysql的引數的預設值設定
mysqld --verbose --help
Usage: mysqld [OPTIONS]
msqld 後面的選項讀取的順序檔案如下
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql-5.6.21/my.cnf/my.cnf ~/.my.cnf
2 檢視server當前使用的引數
遠端檢視:mysqladmin -h ip -P port variables|grep binlog
本機檢視:show variables
query_cache_size:
該引數是快取查詢結果集分配的記憶體大小,預設情況下,查詢快取是關閉的,query_cache_type是0的情況下,query_cache_size也會有預設的1M大小,,zai 5.6.8之前,預設的query_cache_type=1,query_cache_size=0,為了如果不使用查詢快取,query_cache_type應該設定成0,query_cache_size=0。這個引數可以接受的值是1024的倍數,如果不是就會設定成最最接近倍數的那個最小值。查詢快取需要最小40KB的空間來分配資料結構,如果設定的太小了,會有警告產生。
query_cache_type:
有3個可選設定,0,1,2 。0就是不適用查詢快取或在查詢快取中取資料,如果要禁止分配記憶體,還需設定query_cache_size=0。1會快取所有的查詢結果,除了select sql_no_cache這樣的sql。2 只快取select sql_cache這樣的sql結果集。
table_definition_cache:
能夠儲存在定義快取中的表定義數量,如果你使用了很多的表,你可以建立一個大的table definition cache來加快開啟表的速度,table definition cache不會佔用太多的空間,也不會像普通表快取使用檔案描述符,最小的值是400,預設值是基於下面的公式計算,最大到2000.
400+(table_open_cache/2),在5.6.8之前,預設的事400
table_open_cache:
所有執行緒開啟的表的數量,增加這個值會增加mysqld需要的檔案描述符,你可以通過檢視opened_tables的狀態來決定是否需要增加這個值,如果opened_tables這個值很大,並且你也不經常使用flush tables(這個動作會強制所有的表關閉在開啟),那麼就需要增加table_open_cache這個變數。
table_open_cache_instances:
開啟表快取例項的個數,為了減緩會話之間的競爭,開啟的表快取可以被分配到table_open_cache/table_open_cache_instances大小的不同小記憶體中,一個會話為了dml語句只需鎖定其中一個記憶體例項,ddl語句仍然需要鎖定整個記憶體,但是ddl執行的不是很頻繁,在一個16核或是更多核的系統上推薦設定成8或16。
sql_mode
:在5.6上這個引數的預設值是NO_ENGINE_SUBSTITUTION ,可以被動態設定,之前是個空的字串,該引數的具體取值含義待看.....
skip-name-resolve:
在檢查客戶端連線的時候不解析名稱,只使用ip,如果使用了這個選項,在分配許可權的時候host的列必須是ip或localhost,
skip-networking:對tcp/ip的連線不做監聽,所有與mysqld的互動使用命名管道或是socket,這個引數對於只有本地客戶端訪問的情況有用。
skip-slave-start:
back_log:
max_connections:允許同時能連線的客戶端的個數,預設情況下這個值是151,增加這個值就增加了mysqld開啟的檔案描述符,如果需要的描述符不可用,這個server減少max_connections的數量。
max_connect_errors:如果一個機器連線次數超過該引數的值都沒有成功,那麼server會阻止該機器的更多的連線,可以通過重新整理host cache來解除阻塞,可以通過flush hosts語句或是執行mysqladmin flush-hosts命令,如果一哥機器連線失敗了好多次,但是在達到上限之前成功了,那麼失敗的計數會清除到0,mysql5.6.6的預設值是100.
max_allowed_packet:最大的包大小或是生成的字串的大小,如果使用了blob或是很大的字串,一定要調大這個值,協議限制該值大小是1GB,如果你通過修改max_allowed_packet改變了訊息快取大小,也應該改變客戶端的快取大小,例如mysql和mysqldump的預設大小是16MB和24MB,可以在命令列上設定max_allowed_packet來改變客戶端的大小。
binlog_cache_size:
binlog_stmt_cache_size:
max_heap_table_size:
這個值設定了使用者建立記憶體表允許的最大大小。
tmp_table_size:
是記憶體臨時表的最大大小,實際的大小取決於tmp_table_size和max_heap_table_size哪個更小,如果一個記憶體臨時表超出了限制,mysql會自動的將它轉換成磁碟上的myisam表,如果有很多的group by查詢要增加這2個引數。
thread_cache_size:
這個值表示有多少的執行緒快取以備重用,當客戶端的數量小於thread_cache_size的數量時,客戶端在斷開後,客戶端的執行緒會放到快取中,如果有很多的客戶端的連線,可以增大這個值來提高效能,如果server每秒有幾百個連線,你就要設定這個引數很大,這樣就可以快取執行緒。
key_buffer_size:
MyISAM表的索引塊被快取並且被所有的執行緒共享,key_buffer_size是索引塊的記憶體空間,這個值在32位平臺上的最大值是4GB,64位平臺上的值可以更大,
可以使用show status語句來檢查key_read_requests,key_reads,key_write_requests和key_writes變數, key_reads/key_read_requests的比率正常情況下應該小於0.01,key_writes/key_write_request應該接近1,
The fraction of the key buffer in use can be determined using key_buffer_size
in
conjunction with the Key_blocks_unused
status
variable and the buffer block size, which is available from the key_cache_block_size
system
variable:
sort_buffer_size
:每個會話的排序要分配sort_buffer_size大小的記憶體用來排序,sort_buffer_size不針對任何的儲存引擎,增大max_sort_length可能要求增大sort_buffer_sized的大小,如果在show global status的輸出中看到了每秒很多的sort_merge_passes,你需要增加sort_buffer_size來加快order by 或group by的操作。
read_buffer_size:
每個執行緒對MyISAM表做一個順序掃描會分配read_buffer_size大小的記憶體,如果有很多的順序讀,就可能需要增加這個值,預設是131072,這個值應該設定成4KB的倍數,這個引數也會被用於所有儲存引擎的下列情況中:
1 批量插入到分割槽中
2巢狀查詢
3For caching the indexes in a temporary file (not a temporary table), when sorting rows for ORDER BY.
read_only:當該引數啟用的時候,除了有super許可權的使用者外,所有的客戶端都不能更新,這個引數預設是禁用的。如果這個引數被啟用,server會允許下面這些操作:
1在複製環境下,在slave機器上啟用這個引數能確保slave機器接受只來自master server的更新,一般在從庫上要設定這個引數。
2使用 analyze table或optimize table命令
3對臨時表的操作
4插入日誌表
join_buffer_size:
該引數代表了沒有使用索引進行了全表掃描的連線及普通索引掃描和範圍索引掃描。通常,獲得快速連線的最好方式是新增索引,當新增索引的方式行不通時,可以增加join_buffer_size來獲得快速的全連線。一個join buffer為2個表的全連線分配,對於沒有索引的複雜的多表連線,多個join buffer可能會被分配。
read_rnd_buffer_size:
這個引數用於MyISAM表的讀取及對於任意的儲存引擎,多範圍讀的優化。
bulk_insert_buffer_size:
MyISAM使用了特別的樹狀的快取來使insert...select,insert..values, 及load data infile批量插入更快,當向非空表中插入資料的時候。這個值限制了每個執行緒快取樹的大小。預設是8MB。
collation_server:
使用指定的名稱來作為server的排序規則。中文設定
character_set_server = utf8
collation_server = utf8_general_ci
log_slave_updates:
該值是說明slave在master上接收的更新是否應該被記錄在slave自己的二進位制日誌中,在串聯的結構中slave上應該開啟這個引數,否則串聯不起來,預設值是false。
-----------------------------------------------------------------------下面是主從複製相關的引數----------------------------------------------------------
log-bin-trust-function-creators
binlog-cache-size
事務快取在記憶體中的部分的大小,單位位元組,如果事務很大,超出了這個大小,那麼超出的部分會放到磁碟上,所以有很大事務的情況下,需要增加這個值得大小。
max-binlog-cache-size
這個選項用於限制二進位制日誌中每個事務的大小,如果事務的大小超過了這個限制,語句將會出錯終止。
max-binlog-size
如果向binary log寫日誌導致當前日誌檔案大小超過了這個變數設定的值,server會輪換二進位制日誌。
sync-binlog
當每進行n次事務提交之後,MySQL將進行一次fsync之類的磁碟同步指令來將binlog_cache中的資料強制寫入磁碟。
sql_log_bin 語句只在主庫上執行,不在從庫執行,也就是主庫上的變動不寫二進位制日誌,這個引數謹慎使用。
skip-slave-start 該引數是控制從庫的複製不隨資料庫的啟動而啟動,這樣才能方便管理,否則會出現很多無法控制的異常,該引數新增到配置檔案中即可。
[server]
port=3306
#basedir=/usr
datadir=/data/mysql_3306
#socket=/tmp/mysql3306.sock
skip-name-resolve
skip-slave-start
server_id=123456
auto_increment_increment,auto_increment_offset
這兩個引數主要是為了master-to-master的複製使用的,可以用來控制auto_increment的列,這2個引數可以在全域性及會話級別設定,合理的範圍是1到65535,auto_increment_incremnet控制著連續列的間隔,auto_increment_offset控制著自動增長的列的起始值。
mysql>SHOW VARIABLES LIKE 'auto_inc%';
+--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 1 | | auto_increment_offset | 1 | +--------------------------+-------+ 2 rows in set (0.00 sec) mysql>CREATE TABLE autoinc1
->(col INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
Query OK, 0 rows affected (0.04 sec) mysql>SET @@auto_increment_increment=10;
Query OK, 0 rows affected (0.00 sec) mysql>SHOW VARIABLES LIKE 'auto_inc%';
+--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 10 | | auto_increment_offset | 1 | +--------------------------+-------+ 2 rows in set (0.01 sec) mysql>INSERT INTO autoinc1 VALUES (NULL), (NULL), (NULL), (NULL);
Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql>SELECT col FROM autoinc1;
+-----+ | col | +-----+ | 1 | | 11 | | 21 | | 31 | +-----+ 4 rows in set (0.00 sec)
mysql>如果這2個值有改變了,但是表中已經存在了一些記錄,那麼新插入的值,會在按下面的公式生成的序列中生成SET @@auto_increment_offset=5;
Query OK, 0 rows affected (0.00 sec) mysql>SHOW VARIABLES LIKE 'auto_inc%';
+--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 10 | | auto_increment_offset | 5 | +--------------------------+-------+ 2 rows in set (0.00 sec) mysql>CREATE TABLE autoinc2
->(col INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
Query OK, 0 rows affected (0.06 sec) mysql>INSERT INTO autoinc2 VALUES (NULL), (NULL), (NULL), (NULL);
Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql>SELECT col FROM autoinc2;
+-----+ | col | +-----+ | 5 | | 15 | | 25 | | 35 | +-----+ 4 rows in set (0.02 sec)
auto_increment_offset
+ N
× auto_increment_increment
新的值將會是大於表中現有最大 值得序列中的最小值。
mysql>按上面的公式生成的序列是 [5, 15, 25, 35, 45, ...],原有記錄最大值是21,那麼下一個值就是35SHOW VARIABLES LIKE 'auto_inc%';
+--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 10 | | auto_increment_offset | 5 | +--------------------------+-------+ 2 rows in set (0.00 sec) mysql>SELECT col FROM autoinc1;
+-----+ | col | +-----+ | 1 | | 11 | | 21 | | 31 | +-----+ 4 rows in set (0.00 sec) mysql>INSERT INTO autoinc1 VALUES (NULL), (NULL), (NULL), (NULL);
Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql>SELECT col FROM autoinc1;
+-----+ | col | +-----+ | 1 | | 11 | | 21 | | 31 | | 35 | | 45 | | 55 | | 65 | +-----+ 8 rows in set (0.00 sec)