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
並帶有警告)。
這裡有一個 例子,可以看下。