設置innodb_buffer_pool_size為可用內存的50-60%.注意可用內存應該是linux命令free下的-/+ buffers/cache行的free值;innodb_buffer_pool_size的值應該是在mysql實例沒有啟動情況下的值,而不是實例啟動后的值。見示例。
示例:
(1)在沒有對innodb_buffer_pool_size參數優化前:
SELECT sql_no_cache
N1.N_NAME AS SUPP_NATION,
N2.N_NAME AS CUST_NATION,
EXTRACT(YEAR FROM L_SHIPDATE) AS L_YEAR,
SUM(L_EXTENDEDPRICE * (1 - L_DISCOUNT)) AS REVENUE
FROM SUPPLIER,
LINEITEM,
ORDERS,
CUSTOMER,
NATION N1,
NATION N2
WHERE
S_SUPPKEY = L_SUPPKEY
AND O_ORDERKEY = L_ORDERKEY
AND C_CUSTKEY = O_CUSTKEY
AND S_NATIONKEY = N1.N_NATIONKEY
AND C_NATIONKEY = N2.N_NATIONKEY
AND (N1.N_NAME = 'FRANCE' AND N2.N_NAME = 'GERMANY' OR N1.N_NAME = 'GERMANY' AND N2.N_NAME = 'FRANCE')
AND L_SHIPDATE >= DATE '1995-01-01'
AND L_SHIPDATE <= DATE '1996-12-31'
GROUP BY
SUPP_NATION,
CUST_NATION,
L_YEAR
ORDER BY
SUPP_NATION,
CUST_NATION,
L_YEAR;
+-------------+-------------+--------+--------------------+
| SUPP_NATION | CUST_NATION | L_YEAR | REVENUE |
+-------------+-------------+--------+--------------------+
| FRANCE | GERMANY | 1995 | 54639732.7336 |
| FRANCE | GERMANY | 1996 | 54633083.30760003 |
| GERMANY | FRANCE | 1995 | 52531746.66970005 |
| GERMANY | FRANCE | 1996 | 52520549.022399954 |
+-------------+-------------+--------+--------------------+
4 rows in set (2 min 0.90 sec)
查詢耗費2 min 0.90 sec
(2)數據庫實例啟動情況下對可用內存的調整
[root@gflinux ~]# free
total used free shared buffers cached
Mem: 1034708 999860 34848 0 2852 161448
-/+ buffers/cache: 835560 199148
Swap: 4192924 152 4192772
設置innodb_buffer_pool_size值為可用內存的60%
199148*60%=119M,取128M
重啟數據庫后再次運行上述查詢語句,查看執行時間:
+-------------+-------------+--------+--------------------+
| SUPP_NATION | CUST_NATION | L_YEAR | REVENUE |
+-------------+-------------+--------+--------------------+
| FRANCE | GERMANY | 1995 | 54639732.7336 |
| FRANCE | GERMANY | 1996 | 54633083.30760003 |
| GERMANY | FRANCE | 1995 | 52531746.66970005 |
| GERMANY | FRANCE | 1996 | 52520549.022399954 |
+-------------+-------------+--------+--------------------+
4 rows in set (7.55 sec)
(3)數據庫實例沒有啟動情況下對可用內存的調整
[root@gflinux ~]# service mysql stop
Shutting down MySQL.... [ OK ]
[root@gflinux ~]# free
total used free shared buffers cached
Mem: 1034708 430908 603800 0 4396 353292
-/+ buffers/cache: 73220 961488
Swap: 4192924 152 4192772
設置innodb_buffer_pool_size值為可用內存的60%
961488*60%=577M,取580M
重啟數據庫后再次運行上述查詢語句,查看執行時間:
+-------------+-------------+--------+--------------------+
| SUPP_NATION | CUST_NATION | L_YEAR | REVENUE |
+-------------+-------------+--------+--------------------+
| FRANCE | GERMANY | 1995 | 54639732.7336 |
| FRANCE | GERMANY | 1996 | 54633083.30760003 |
| GERMANY | FRANCE | 1995 | 52531746.66970005 |
| GERMANY | FRANCE | 1996 | 52520549.022399954 |
+-------------+-------------+--------+--------------------+
4 rows in set (1.90 sec)
查詢時間縮短為2s左右。