1.如果採取“先把資料放在記憶體,然後集中寫入磁碟”的辦法,可以節省 CPU 資源和磁碟讀取的時間,但是也會面臨系統故障時會丟失資料的風險;
相反,如果每次都寫入磁碟,資料最安全,但是頻繁的磁碟讀寫,會導致系統效率低下。這就需要我們提升最佳化資源配置的能力。
2. 調整系統引數 InnoDB_flush_log_at_trx_commit
預設的值是 1,意思是每次提交事務的時候,都把資料寫入日誌,並把日誌寫入磁碟。
2 表示,每次提交事務的時候都將資料寫入日誌,但是日誌每間隔 1 秒寫入磁碟。
這樣做的好處是資料安全性最佳,不足之處在於每次提交事務,都要進行磁碟寫入的操作。
在大併發的場景下,過於頻繁的磁碟讀寫會導致 CPU 資源浪費,系統效率變低。
引數的值改成了 2。這樣一來,就不用每次提交事務的時候都啟動磁碟讀寫了,
在大併發的場景下,可以改善系統效率,降低 CPU 使用率。即便出現故障,損失的資料也比較小。
3. 調整系統引數 InnoDB_buffer_pool_size
InnoDB 儲存引擎使用快取來儲存索引和資料。這個值越大,可以載入到快取區的索引和資料量就越多,需要的磁碟讀寫就越少。
50%
4. 調整系統引數 InnoDB_buffer_pool_instances
將 InnoDB 的快取區分成幾個部分,這樣一來,就可以提高系統的並行處理能力,因為可以允許多個程序同時處理不同部分的快取區。
把 InnoDB_buffer_pool_instances 的值修改為 64,意思就是把 InnoDB 的快取區分成 64 個分割槽,這樣就可以同時有多個程序進行資料操作,CPU 的效率就高多了。
利用監控資訊診斷問題
performance_schema.events_statements_history_long
先用下面的語句,來看一下哪些查詢消耗的時間多。這個表的資料量很大
mysql> SELECT -> TRUNCATE(TIMER_WAIT / 1000000000000, 6) AS duration, -- 計算查詢的時長,單位是微微秒,需要轉換成秒 -> sql_text, -> EVENT_ID -> FROM -> performance_schema.events_statements_history_long -> WHERE -> TRUNCATE(TIMER_WAIT / 1000000000000, 6) <> 0 -> AND sql_text IS NOT NULL -> ORDER BY TRUNCATE(TIMER_WAIT / 1000000000000, 6) DESC -> LIMIT 1,2; +----------+---------------------------------+----------+ | duration | sql_text | EVENT_ID | +----------+---------------------------------+----------+ | 137.2529 | select count(*) from demo.trans | 17 | | 137.2420 | select count(*) from demo.trans | 907 | +----------+---------------------------------+----------+ 2 rows in set (0.00 sec)