mysql qps提升_上亿数据MYSQL的innodb优化 QPS轻松过5000
最近2周時間, 對于MYSQL 5.5.15-log Windows XP版本,進行了各種測試和優化。目前mysql的許多單表數據已經超過了1億條記錄,MYSQL在經過各種優化后,處理上億條記錄非常輕松,性能遠比想象的要好的多。
目前, 硬件情況是 intel Q9300 CPU 2.5G 4核心 775針的老CPU, 內存是2.6G DDR2, 硬盤是5900轉2T的希捷節能硬盤, 都是很普通廉價的硬件。
MYSQL的各數據表全部采用innodb引擎,開始使用autocommit, 相當于每一條語句都提交,測試的QPS是:單機2.4萬qps,后來修改為取消autocommit, 并且修改代碼,緩存了部分中間數據,大幅度減少了一些重復簡單的SELECT的命令數量,并且多條記錄一次性提交,測試情況是大約 5000 QPS,實際上5000 QPS的等效性能更好一些,因為基本上都是insert和update命令。
中間還測試了memory引擎,定時也測試過,隨時插入memory, 定時從memory寫到innodb,想這樣實現更高的性能,思路是利用內存數據庫的高性能,結果不理想, 本來想將insert先插入到memory引擎緩沖,結果,非常失望,memory引擎的并發能力非常有限,偶然會出現插入錯誤,只好取消了這個思路。 現在看memory引擎的表鎖,有時不能給其他進程等待的機會,對于我的應用,本來的思路是先緩沖到memory引擎,滿1000條記錄,再集中插入innodb, 定時時間設置為30秒,60秒,300秒測試都一樣,一旦從memory向innodb寫記錄,基本其他進程的insert Memory就可能失敗,期望是有一個等待的機會,實際測試不行,即使只有幾百條記錄的緩沖也會鎖死, 結果,出現部分插入失敗,寫入log日志中, 其它進程不能得到應該容忍的等待時間,問題在哪里, 估計是memory只使用表鎖,造成的問題。 總之,這個思路受困于Memory差勁的并發能力。
主要的優化:
# 設定默認的事務隔離級別.可用的級別如下:
# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE
# 默認是REPEATABLE_READ,? 查看你的程序是否可以運行在READ-COMMITED 隔離模式下,如果可以,
# 這個選項有一些性能的優勢,特別是在5.0,5.1版和行級別的復制方面.
# 設置隔離等級, 默認是REPEATABLE-READ
transaction_isolation=READ-COMMITTED
#*** INNODB Specific options ***
innodb_use_sys_malloc =0
# 系統默認 innodb_use_sys_malloc =1, 表示使用操作系統自帶的,
#*** INNODB Specific options ***
innodb_use_sys_malloc =0
# 系統默認 innodb_use_sys_malloc =1, 表示使用操作系統自帶的,
innodb_data_home_dir????? = "E:/mysql/data/"
innodb_data_file_path=ibdata1:20G
innodb_log_group_home_dir = "R:/"
# 設置log文件到虛擬內存盤中去,這樣可以提高性能,同時設置innodb_fast_shutdown=0,
# 可以保證關機前數據全部保存到硬盤,這個是最牛的設置,這樣等于REDO日志的性能和內存是一樣快的。
#innodb_log_arch_dir????? = "C:/mysqllog/"
innodb_log_files_in_group=2
innodb_autoextend_increment = 32
innodb_additional_mem_pool_size=8M
innodb_flush_log_at_trx_commit=2
innodb_log_buffer_size=1M
innodb_buffer_pool_size=640M
innodb_log_file_size=63M
innodb_file_io_threads=4
# InnoDB 中的文件 I/O 線程。 通常設置為 4,
# 但是在 Windows 下可以設定一個更大的值以提高磁盤 I/O。
innodb_max_dirty_pages_pct=75
# 默認為75%, 感覺太高了點,以前的默認值更高位90.
innodb_fast_shutdown=0
# 默認為允許快速關閉=1, innodb_fast_shutdown影響著innodb表的行為,該參數可設置為0,1,2
#0 表示當MySQL關閉時,InnoDB需要完成所有的full purge和merge insert buffer操作。耗時比較長。
#1 是默認值。表示不需要完成full purge和merge insert buffer操作,但是在緩沖池中的一些數據臟頁會刷新到磁盤。
#2 不完成full purge和merge insert buffer操作,不將緩沖池中的數據臟頁寫回到磁盤,將日志寫入到日志文件。MySQL下次啟動執行恢復操作。
# close double write, 默認是打開的
# innodb_doublewrite=0
# 不關閉校驗和檢查(提供更好的性能)
# innodb_checksums=0
# 不打開單表空間
#innodb_file_per_table = 0
innodb_io_capacity=100
innodb_read_io_threads=1
innodb_open_files=300
innodb_max_purge_lag=2000000
#innodb_import_table_from_xtrabackup=1
innodb_support_xa=0
##如果使用復制, 那么一定要innodb_support_xa=1, 即默認參數
innodb_thread_sleep_delay=40
設置thread延遲sleep時間為40微秒,默認為10000,這個我與默認參數的分歧很大。
innodb_thread_concurrency=4
# InnoDB 會試圖將 InnoDB 服務的使用的操作系統進程小于或等于這里所設定的數值。
# 此參數默認值為 8。如果計算機系統性能較低或 innodb_monitor 顯示有很多線程等侍信號,
# 應該將這個值設小一點。如果你的計算機系統有很多處理器與磁盤系統,則可以將這個值設高一點以充分利用你的系統資源。建議設值為(處理器數目+ 磁盤數目)*2。默認是建議設置為10,我設置為4,這個經過測試,對于本機同時跑20個spider進程的情況下,設置為4的性能最好。
[mysqldump]
# 不要在將內存中的整個結果寫入磁盤之前緩存. 在導出非常巨大的表時需要此項
quick
max_allowed_packet = 16M
最后修改于 2012-07-01 23:45
閱讀(?)評論(0)
總結
以上是生活随笔為你收集整理的mysql qps提升_上亿数据MYSQL的innodb优化 QPS轻松过5000的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python实现计时的方法
- 下一篇: MegaCli常用命令有哪些