咨詢(xún)電話(huà)
微信掃一掃
新聞動(dòng)態(tài)
MySQL內存到底消耗在哪里?
常見(jiàn)問(wèn)題 發(fā)布者:ou3377 2021-12-11 09:12 訪(fǎng)問(wèn)量:143
一說(shuō)起MySQL使用的內存,你可能會(huì )想到各種buffer,最著(zhù)名的莫過(guò)于innodb buffer pool了,它是內存使用的大戶(hù),還有sort buffer等等。除了這些buffer之外,可能還有一些細枝末節,今天我們來(lái)總結一下。
首先是各種類(lèi)型的buffer和cache,利用SQL可以查到:
mysql 22:57:49> show variables like '%buffer%size%';
+-------------------------------+-------------+
| Variable_name | Value |
+-------------------------------+-------------+
| bulk_insert_buffer_size | 8388608 |
| clone_buffer_size | 4194304 |
| innodb_buffer_pool_chunk_size | 134217728 |
| innodb_buffer_pool_size | 21474836480 |
| innodb_change_buffer_max_size | 25 |
| innodb_log_buffer_size | 8388608 |
| innodb_sort_buffer_size | 1048576 |
| join_buffer_size | 16777216 |
| key_buffer_size | 134217728 |
| myisam_sort_buffer_size | 134217728 |
| preload_buffer_size | 32768 |
| read_buffer_size | 16777216 |
| read_rnd_buffer_size | 33554432 |
| sort_buffer_size | 16777216 |
+-------------------------------+-------------+
14 rows in set (0.00 sec)
mysql 22:57:45> show variables like '%cache%size%';
+----------------------------+----------------------+
| Variable_name | Value |
+----------------------------+----------------------+
| binlog_cache_size | 32768 |
| binlog_stmt_cache_size | 32768 |
| host_cache_size | 1003 |
| innodb_ft_cache_size | 8000000 |
| innodb_ft_total_cache_size | 640000000 |
| key_cache_block_size | 1024 |
| max_binlog_cache_size | 18446744073709547520 |
| max_binlog_stmt_cache_size | 18446744073709547520 |
| thread_cache_size | 64 |
+----------------------------+----------------------+
9 rows in set (0.01 sec)
可以看到,結果中有很多都會(huì )經(jīng)常用到。當然,這里面,不都是會(huì )被用到的,例如max開(kāi)頭的參數,都是值最大的值,平時(shí)可能根本用不到,還有block相關(guān)的參數,都是指內存分配單位,也用不到。
這里我們首先簡(jiǎn)單總結一下那些重要的buffer和cache:
全局共享內存:
innodb_buffer_pool_size:InnoDB緩沖池大小。
innodb_additional_mem_pool_size: 額外緩存池,MySQL8.0已經(jīng)廢棄
key_buffer_size: MyISAM緩存索引塊的內存大小。
query_cache_size:查詢(xún)緩存,MySQL8.0已經(jīng)廢棄
innodb_log_buffer_size:redo log buffer,用來(lái)記錄事務(wù)執行的中間狀態(tài)
線(xiàn)程級別內存:
read_buffer_size:MyISAM表順序讀緩沖大小
sort_buffer_size: 排序緩沖區大小
join_buffer_size: 連接查詢(xún)緩沖區大小
read_rnd_buffer_size:連接查詢(xún)MRR優(yōu)化緩沖大小、MyISAM隨機讀緩沖大小
tmp_table_size:內存臨時(shí)表大小
binlog_cache_size: 線(xiàn)程級別binlog緩沖大小
thread_stack: 每個(gè)線(xiàn)程的堆棧大小
內存分配器:
和其他數據庫一樣,MySQL的內存分配器也要長(cháng)時(shí)間持有一部分內存,以供正常的內存銷(xiāo)毀和分配,從而實(shí)現內存重復使用。
因此,我們可以簡(jiǎn)單的推導一個(gè)公式,就是MySQL中內存的使用量,大概等于:
+ @@tmp_table_size )
其中,connections代表當前的連接數。
從公式中不難看出,當基礎配置不變情況下,連接數很多的時(shí)候,MySQL占用的內存數據,就會(huì )上漲的比較快。
Performance_schema特性可以監控MySQL的運行指標,通常情況下,默認是開(kāi)啟的,開(kāi)啟時(shí)候,會(huì )帶來(lái)10%左右的MySQL性能損耗。
開(kāi)啟Performance_schema特性后,會(huì )在performance_schema這個(gè)系統數據庫下存在5張內存相關(guān)的表:
show tables like '%memory%';
+-----------------------------------------+
| Tables_in_performance_schema (%memory%) |
+-----------------------------------------+
| memory_summary_by_account_by_event_name |
| memory_summary_by_host_by_event_name |
| memory_summary_by_thread_by_event_name |
| memory_summary_by_user_by_event_name |
| memory_summary_global_by_event_name |
+-----------------------------------------+
5 rows in set (0.00 sec)
其中:
memory_summary_by_account_by_event_name
代表賬號相關(guān)的內存監控表
memory_summary_by_host_by_event_name
代表主機維度的內存監控
memory_summary_by_thread_by_event_name
線(xiàn)程維度內存監控表
memory_summary_by_user_by_event_name
用戶(hù)維度內存監控表
memory_summary_global_by_event_name
全局維度內存監控表
每張表都有很多字段,這里不再進(jìn)行一一介紹。
可以在PS數據庫中使用下面的SQL進(jìn)行內存使用情況查詢(xún):
select substring_index(event_name,'/',2) as code_area, sys.format_bytes(sum(current_alloc)) as current_alloc from sys.x$memory_global_by_current_bytes group by substring_index(event_name,'/',2) order by sum(current_alloc) desc ;
+---------------------------+---------------+
| code_area | current_alloc |
+---------------------------+---------------+
| memory/innodb | 21.11 GiB |
| memory/performance_schema | 283.57 MiB |
| memory/mysys | 130.72 MiB |
| memory/sql | 74.98 MiB |
| memory/temptable | 67.00 MiB |
| memory/mysqld_openssl | 1.96 MiB |
| memory/myisam | 696 bytes |
| memory/csv | 88 bytes |
| memory/blackhole | 88 bytes |
| memory/vio | 8 bytes |
+---------------------------+---------------+
10 rows in set (0.01 sec)
關(guān)鍵字: MySQL內存消耗
文章連接: http://www.gostscript.com/cjwt/802.html
版權聲明:文章由 晨展科技 整理收集,來(lái)源于互聯(lián)網(wǎng)或者用戶(hù)投稿,如有侵權,請聯(lián)系我們,我們會(huì )立即刪除。如轉載請保留
晨展解決方案
晨展新聞