從事IT行業十五年+,最近有個運行中項目的列表頁面,在本地測試台式機執行效率在三秒以內,布署到服務器(32G內存,16G Cpu)后反而執行20秒+ ,百思不得其解。
解決辦法
※以下部分內容來自博主的文章
1.首先查看max_write_lock_count
我個人認為這不是報錯的主要原因,因為這是寫入空間,如果報錯則應該會在導入數據時報錯,而不是到運行查詢分類時報錯(純粹個人見解,如若不當請多包涵!)
查詢語句:show global variables like 'max_write_lock_count';
可以看出這個空間的value值有4G,足夠存儲我的數據,應該不是報錯主因。
2.其次查看innodb_buffer_pool_size
查詢語句:show global variables like 'innodb_buffer%';
innodb_buffer_pool_size 的默認大小為 8M,
即緩沖區的大小只有8M,完全不足以處理龐大的數據量,
所以我們需要修改這個值的大小(value值大小可根據自己需求修改):
修改語句:set global innodb_buffer_pool_size=4294967296; 這句是解決問題的關鍵。優化緩沖區內存。 innodb_buffer_pool_size=12000M
修改完畢后再次在Workbench 或 Navicat Premium 12 中運行嘗試:
可以正常運行啦~
至此,該部分問題解決,希望對大家有所幫助!
Mysql對於內存的使用,可以分為兩類,一類是我們無法通過配置參數來配置的,如Mysql服務器運行、解析、查詢以及內部管理所消耗的內存;另一類如緩沖池所用的內存等。
在服務器中每個連接所分配的內存主要由下面四個參數控制:
(1)sort_buffer_size 連接進行排序時候分配該配置參數大小的內存進行排序操作,比如該大小設置為100M,如果有100個連接同時進行排序將分配10G的內存,很容易造成服務器內存溢出;
(2)join_buffer_size 定義mysql的每個線程所使用連接的緩沖區的大小,對於這個參數需要注意的是,如果一個查詢中關聯了多張表,那么就會為每個關聯分配一個連接緩存,所以每個查詢可能會有多個連接緩沖;
(3)read_buffer_size 對MyISAM表進行全表掃描時分配的讀緩存池的大小,mysql只會在有查詢需要時為該緩存分配內存,分配的內存為配置參數指定內存的大小,大小一般為4K的倍數;
(4)read_rnd_buffer_size 索引緩沖區的大小,有查詢需要時才分配內存,分配的大小為需要內存的大小,而不是配置參數的大小;
上面四個參數全部是為每個線程分配的,如果有一百個連接可能會分配100倍以上內存的和。