1. 程式人生 > >Mysql 8.0 第5章 Mysql伺服器管理 (第5.1.8節 伺服器系統變數 )

Mysql 8.0 第5章 Mysql伺服器管理 (第5.1.8節 伺服器系統變數 )

Mysql伺服器系統變數變數列表

不斷翻譯,不斷更新…

max_allowed_packet

屬性
命令列使用格式 --max-allowed-packet=#
系統變數 max_allowed_packet
範圍 global,session
Dynamic
SET_VAR 提示
型別 整數
預設值(> = 8.0.3) 67108864 (64MB)
預設值(<= 8.0.2) 4194304 (4MB)
最小值 1024
最大值 1073741824 (1GB)

一個數據包或任何生成/中間字串的最大大小,或C API函式 mysql_stmt_send_long_data()傳送的任何引數 的大小。預設值為64MB。

資料包訊息緩衝區初始化為 net_buffer_length位元組,但在需要時可以增長到max_allowed_packet位元組。預設情況下,此值很小,以捕獲大量(可能不正確)的資料包。

如果使用大BLOB列或長字串,則必須增加此值 。它應該與您想要使用BLOB的最大值一樣大 。協議限制為 max_allowed_packet=1GB。該值應為1024的倍數; 非1024的倍數值會向下舍入到最接近的倍數。

通過更改max_allowed_packet 變數的值來更改訊息緩衝區大小時,如果客戶端程式允許,還應更改客戶端的緩衝區大小。max_allowed_packet內置於客戶端庫的預設 值為1GB,但單個客戶端程式可能會覆蓋此值。例如, mysql和mysqldump的預設值分別為16MB和24MB。它們還允許您通過在命令列或選項檔案中進行設定max_allowed_packet來更改客戶端值 。

此變數的會話值是隻讀的。客戶端最多可以接收與會話值一樣多的位元組。但是,伺服器不會向客戶端傳送比當前全域性max_allowed_packet值更多的位元組 。(如果在客戶端連線後更改全域性值,則全域性值可能小於會話值。)
譯者例項
通常在批量新增記錄的時候就會出現此問題:
(1)批量操作語句:

sql = 'insert into t5 values'
    for i in range(100000):
        sql += '(NULL,"' + ''.join(random.sample(string.ascii_lowercase, 5)) + '","' + ''.join(
            random.sample(string.ascii_lowercase, 5)) + '","' + ''.join(
            random.sample(string.ascii_lowercase, 7)) + '","' + ''.join(random.sample(string.ascii_lowercase, 8)) + '"),'
    sql = sql[:len(sql) - 1] + ";"

這裡向t5表插入20W條記錄,列印sql語句的長度是8800021,已經超4M,報錯如下:

  File "C:\Python37\lib\site-packages\pymysql\err.py", line 109, in raise_mysql_exception
    raise errorclass(errno, errval)
pymysql.err.InternalError: (1153, "Got a packet bigger than 'max_allowed_packet' bytes")

(2)修改max_allowed_packet為64M,重新進命令列,並重新提交批量資料,不再報錯。

set global max_allowed_packet=1024 * 1024 * 64;

max_sort_length

屬性
命令列使用格式 --max-sort-length=#
系統變數 max_sort_length
範圍 global,session
Dynamic
SET_VAR 提示
型別 整數
預設值 1024
最小值 4
最大值 8388608

排序資料值時使用的位元組數。
伺服器僅使用每個列值的前max_sort_length個位元組,而忽略其餘的值。因此,在GROUP BY, ORDER BY, DISTINCT 的排序中使用前max_sort_length個位元組。

增加max_sort_length也可能需要增加sort_buffer_size的值 。有關詳細資訊,請參見 第 8.2.1.14節“ORDER BY優化”

譯者例項
(1)例項表

create table sv_max_sort_length(id int auto_increment primary key,c1 varchar(10) not null);

insert into sv_max_sort_length values (NULL,'abcdefffff'),
(NULL,'bbcdefffff'),(NULL,'bbcdeaaaaa'),values(NULL,'bbcdeaaa0a');

mysql> select * from sv_max_sort_length order by c1;
+----+------------+
| id | c1         |
+----+------------+
|  1 | abcdefffff |
|  4 | bbcdeaaa0a |
|  3 | bbcdeaaaaa |
|  2 | bbcdefffff |
+----+------------+

(2)設定全域性變數 max_sort_length = 5,退出命令列並重進。

set global max_sort_length = 5;

(3)再次檢視結果,已經發生了變化。

mysql> select * from sv_max_sort_length order by c1;
+----+------------+
| id | c1         |
+----+------------+
|  1 | abcdefffff |
|  2 | bbcdefffff |
|  3 | bbcdeaaaaa |
|  4 | bbcdeaaa0a |
+----+------------+
4 rows in set (0.00 sec)

sort_buffer_size

屬性
命令列使用格式 --sort-buffer-size=#
系統變數 sort_buffer_size
範圍 global,session
Dynamic
SET_VAR 提示
型別 整數
預設值 262144 (也就是256KB)
最小值 32768
最大值(非Windows,64位平臺) 18446744073709551615
最大值(非Windows,32位平臺) 4294967295
最大價值(Windows) 4294967295

每個執行排序的會話都必須分配一個擁有此大小的緩衝區。
sort_buffer_size 不特定於任何儲存引擎,並且以一般方式應用於優化。sort_buffer_size的最小值必須足夠大,以容納排序緩衝區中的十五個元組。此外,增加max_sort_length可能需要增加sort_buffer_size。有關更多資訊,請參見 第8.2.1.14節“ORDER BY優化”

如果在SHOW GLOBAL STATUS輸出中看到每秒很多Sort_merge_passes ,則可以考慮增加 sort_buffer_size值以加速ORDER BY或GROUP BY,這種方法可能在你通過 查詢優化或改進索引 依然無法提升查詢效率的時候起到作用。

優化器嘗試計算出需要多少空間,但可以分配更多空間,直到極限。將其設定為大於全域性所需的大小將減慢大多數排序的查詢。最好將其作為會話設定進行增加,並且僅適用於需要更大尺寸的會話。在Linux上,存在256KB和2MB的閾值,其中較大的值可能顯著減慢記憶體分配,因此您應該考慮保持低於其中一個值。嘗試為您的需求找到最佳價值。請參見 第B.6.3.5節“MySQL儲存臨時檔案的位置”

允許的sort_buffer_size最大值為 4GB-1。64位平臺允許更大的值(64位Windows除外,其中大值被截斷為4GB-1並帶有警告)。

這裡有一個 例子,可以看下。