前言
我的數據庫版本是5.7.23,最近發現執行SQL越來越慢,一條SQL語句執行需要將近30s。
對於原因,查詢資料, https://www.cnblogs.com/qwangxiao/p/8921196.html一文中寫道:
導致SQL執行慢的原因:
1. 硬件問題。如網絡速度慢,內存不足,I/O吞吐量小,磁盤空間滿了等。
我查詢內存、磁盤利用率如下:
2. 沒有索引或者索引失效。(一般在互聯網公司,DBA會在半夜把表鎖了,重新建立一遍索引,因為當你刪除某個數據的時候,索引的樹結構就不完整了。所以互聯網公司的數據做的是假刪除.一是為了做數據分析,二是為了不破壞索引 )
我們所有數據都是做的假刪除,索引也建了的。
3. 數據過多(分庫分表)
數據量確實比較大,所以我們也是選擇的分表。
4. 服務器調優及各個參數設置(調整my.cnf)
調整參數innodb_buffer_pool_size
以上三點,檢查基本過關,那就只剩最后一點了,對應調整my.cnf的參數,我首先想到的是innodb_buffer_pool_size ,對於這個參數https://blog.csdn.net/kk185800961/article/details/79378313/一文中提到:用於緩存 索引 和 數據的內存大小, 這個當然是越多越好, 數據讀寫在內存中非常快, 減少了對磁盤的讀寫。 當數據提交或滿足檢查點條件后才一次性將內存數據刷新到磁盤中。然而內存還有操作系統或數據庫其他進程使用, 一般設置 buffer pool 大小為總內存的 3/4 至 4/5。
並提出:較優設置:假設系統內存 = 128 GB, buffer pool 大小預計100GB(128GB*80%)
innodb_buffer_pool_instances = 8 #默認值,或者邏輯CPU數量
innodb_buffer_pool_chunk_size = 128MB #默認值
innodb_buffer_pool_size = 100 GB # N*8*128MG = N GB ,N 剛好為正整數。設 N=100使得 buffer pool 為總內存的 3/4 至 4/5。
我的服務器邏輯CPU數量為4,內存是15G。
cat /proc/cpuinfo | grep "processor" |wc -l
free -h
當前innodb_buffer_pool_instances = 1,innodb_buffer_pool_chunk_size 和innodb_buffer_pool_size =134217728,也就是128M。
我將上面的參數都提高4倍。
SET GLOBAL innodb_buffer_pool_size=536870912; SET GLOBAL innodb_buffer_pool_chunk_size =536870912;
SELECT @@innodb_buffer_pool_instances, @@innodb_buffer_pool_chunk_size, @@innodb_buffer_pool_size
看到SQL執行快了7s
於是我繼續改配置:
這時速度提升了一半。后經過反復測試,發現以下配置,速度最快,所以三個參數最終的的配置(/etc/my.cnf里)是:
innodb_buffer_pool_size = 1280M innodb_buffer_pool_chunk_size= 1280M innodb_buffer_pool_instances=1
開啟獨立空間參數global innodb_file_per_table
SET global innodb_file_per_table=1;
開啟之后,快了一點點
其他優化,參考:
https://www.cnblogs.com/erisen/p/6068265.html