mysql數據庫中的預熱

MySQL 5.0 5.1 下InnoDB的預熱方法 
http://dbahacker.com/mysql/mysql-5-0-5-1-%e4%b8%8binnodb%e7%9a%84%e9%a2%84%e7%83%ad%e6%96%b9%e6%b3%95 

之前在做一個項目的MySQL數據庫極限壓測, 有部分場景是涉及到MySQL重啓的,而這個項目使用的是InnoDB存儲引擎。 

重啓完畢後,一開始十幾分鐘的性能是非常差的,原因是因爲InnoDB有innodb buffer pool(簡稱ibf)的概念 

和innodb buffer pool相關的參數innodb_buffer_pool_size,size越大,可以放到內存的數據越多,而大多數的項目都會有熱點數據的存在,當熱點數據經過LRU算法進入到buffer pool之後,讀磁盤的次數減少,讀的都是內存,速度是最快的 

問題來了,數據庫一重啓,熱點數據都被清空,bf裏面都是空的.等待app的sql請求過來讓bf填滿數據是一個方法,但30分鐘內很難把熱點數據都裝載進來. 

這個時候,我們可以採取人工預熱的辦法來讓bf滿足我們的需求 

MySQL 5.0的預熱是最簡單的 

方法1 : 在MySQL重啓後 執行 SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES,經過我在一臺5.0MySQL的實驗 在重啓後查看show innodb status\G 和執行完這條語句後 Free buffers的頁數會減少. 

這個count語句有何作用呢?InnoDB的存儲格式和MyISAM不一樣, innodb會在mysql啓動後的第一次訪問表的時候,統計表的索引基數等相關信息,如果表很多的話,這也是一個巨大的開銷.所以在正式提供服務之前,就把表打開,放入到bp裏面 

MySQL 5.1的數據預熱 

我在一臺5.1.48的MySQL進行了重啓,測試了同樣的SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES 但發現free buffers的頁數沒有變少,情況和mysqlperformanceblog.com作者所說的一樣–這個方法在5.1之後就無法達到我們的需求了 

可以採用另外一種方法:獲得數據庫裏面的庫和對應的表,來進行預熱,核心代碼是這一句 

SELECT table_schema, table_name FROM information_schema.tables 

可以用perl或者python來獲取庫和表 然後執行 select * from db.table limit 1 來實現我們的方法 

最後提一下,我們可以再my.cnf 加入init-file=/mysql/init.sql ,在每次mysql重啓的時候就自動執行這個預熱的sql  當然了 sql是要我們自己生成的哦 

發佈了373 篇原創文章 · 獲贊 257 · 訪問量 115萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章