1. 
          

          1. 新聞動(dòng)態(tài)

            MySQL內存到底消耗在哪里?

            常見(jiàn)問(wèn)題 發(fā)布者:ou3377 2021-12-11 09:12 訪(fǎng)問(wèn)量:143

            MySQL內存到底消耗在哪里?

                一說(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:

            01
            各種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中內存的使用量,大概等于:

            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代表當前的連接數。


                從公式中不難看出,當基礎配置不變情況下,連接數很多的時(shí)候,MySQL占用的內存數據,就會(huì )上漲的比較快。


            02
            performance_schema維度分析

                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ì )立即刪除。如轉載請保留

            双腿国产亚洲精品无码不卡|国产91精品无码麻豆|97久久久久久久极品|无码人妻少妇久久中文字幕
                1.