日韩国产精品99成人不卡在线无毒|狠狠躁夜夜爽一级二级精品|亚洲日日噜噜孕妇中文字幕|日韩久草中文三级片

新聞動態(tài)

MySQL內(nèi)存到底消耗在哪里?

常見問題 發(fā)布者:ou3377 2021-12-11 09:12 訪問量:174

MySQL內(nèi)存到底消耗在哪里?

    一說起MySQL使用的內(nèi)存,你可能會想到各種buffer,最著名的莫過于innodb buffer pool了,它是內(nèi)存使用的大戶,還有sort buffer等等。除了這些buffer之外,可能還有一些細枝末節(jié),今天我們來總結(jié)一下。


    首先是各種類型的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)


    可以看到,結(jié)果中有很多都會經(jīng)常用到。當(dāng)然,這里面,不都是會被用到的,例如max開頭的參數(shù),都是值最大的值,平時可能根本用不到,還有block相關(guān)的參數(shù),都是指內(nèi)存分配單位,也用不到。


這里我們首先簡單總結(jié)一下那些重要的buffer和cache:

01
各種buffer和cache

全局共享內(nèi)存:

innodb_buffer_pool_size:InnoDB緩沖池大小。


innodb_additional_mem_pool_size: 額外緩存池,MySQL8.0已經(jīng)廢棄


key_buffer_size: MyISAM緩存索引塊的內(nèi)存大小。


query_cache_size:查詢緩存,MySQL8.0已經(jīng)廢棄


innodb_log_buffer_size:redo log buffer,用來記錄事務(wù)執(zhí)行的中間狀態(tài)


線程級別內(nèi)存:

read_buffer_size:MyISAM表順序讀緩沖大小


sort_buffer_size: 排序緩沖區(qū)大小


join_buffer_size: 連接查詢緩沖區(qū)大小


read_rnd_buffer_size:連接查詢MRR優(yōu)化緩沖大小、MyISAM隨機讀緩沖大小


tmp_table_size:內(nèi)存臨時表大小


binlog_cache_size: 線程級別binlog緩沖大小


thread_stack: 每個線程的堆棧大小


內(nèi)存分配器:

    和其他數(shù)據(jù)庫一樣,MySQL的內(nèi)存分配器也要長時間持有一部分內(nèi)存,以供正常的內(nèi)存銷毀和分配,從而實現(xiàn)內(nèi)存重復(fù)使用。


因此,我們可以簡單的推導(dǎo)一個公式,就是MySQL中內(nèi)存的使用量,大概等于:

SELECT ( @@key_buffer_size
+ @@innodb_buffer_pool_size
+ @@innodb_log_buffer_size
connections * (
    @@read_buffer_size
    + @@read_rnd_buffer_size
    + @@sort_buffer_size
    + @@join_buffer_size
    + @@binlog_cache_size
    + @@thread_stack

    + @@tmp_table_size )


其中,connections代表當(dāng)前的連接數(shù)。


    從公式中不難看出,當(dāng)基礎(chǔ)配置不變情況下,連接數(shù)很多的時候,MySQL占用的內(nèi)存數(shù)據(jù),就會上漲的比較快。


02
performance_schema維度分析

    Performance_schema特性可以監(jiān)控MySQL的運行指標(biāo),通常情況下,默認是開啟的,開啟時候,會帶來10%左右的MySQL性能損耗。


   開啟Performance_schema特性后,會在performance_schema這個系統(tǒng)數(shù)據(jù)庫下存在5張內(nèi)存相關(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)的內(nèi)存監(jiān)控表

memory_summary_by_host_by_event_name

代表主機維度的內(nèi)存監(jiān)控

memory_summary_by_thread_by_event_name

線程維度內(nèi)存監(jiān)控表

memory_summary_by_user_by_event_name

用戶維度內(nèi)存監(jiān)控表

memory_summary_global_by_event_name

全局維度內(nèi)存監(jiān)控表


每張表都有很多字段,這里不再進行一一介紹。


可以在PS數(shù)據(jù)庫中使用下面的SQL進行內(nèi)存使用情況查詢:

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內(nèi)存消耗

文章連接: http://m.hsjyfc.com.cn/cjwt/802.html

版權(quán)聲明:文章由 晨展科技 整理收集,來源于互聯(lián)網(wǎng)或者用戶投稿,如有侵權(quán),請聯(lián)系我們,我們會立即刪除。如轉(zhuǎn)載請保留