MySQL發(fā)展到今天,InnoDB引擎已經(jīng)作為絕對(duì)的主力,除了像大數(shù)據(jù)量分析等比較特殊領(lǐng)域需求外,它適用于眾多場(chǎng)景。然而,仍有不少開發(fā)者還在“執(zhí)迷不悟”的使用MyISAM引擎,覺得對(duì)InnoDB無法把握好,還是MyISAM簡(jiǎn)單省事,還能支持快速COUNT(*)。本文是由于最近幾天幫忙處理discuz論壇有感而發(fā),希望能對(duì)廣大開發(fā)者有幫助。
1. 快速認(rèn)識(shí)InnoDB
InnoDB是MySQL下使用最廣泛的引擎,它是基于MySQL的高可擴(kuò)展性和高性能存儲(chǔ)引擎,從5.5版本開始,它已經(jīng)成為了默認(rèn)引擎。
InnODB引擎支持眾多特性:
a) 支持ACID,簡(jiǎn)單地說就是支持事務(wù)完整性、一致性;
b) 支持行鎖,以及類似ORACLE的一致性讀,多用戶并發(fā);
c) 獨(dú)有的聚集索引主鍵設(shè)計(jì)方式,可大幅提升并發(fā)讀寫性能;
d) 支持外鍵;
e) 支持崩潰數(shù)據(jù)自修復(fù);
InnoDB有這么多特性,比MyISAM來的優(yōu)秀多了,還猶豫什么,果斷的切換到InnoDB引擎吧 :)
2. 修改InnoDB配置選項(xiàng)
可以選擇官方版本,或者Percona的分支,如果不知道在哪下載,就google吧。
安裝完MySQL后,需要適當(dāng)修改下my.cnf配置文件,針對(duì)InnoDB相關(guān)的選項(xiàng)做一些調(diào)整,才能較好的運(yùn)行InnoDB。
相關(guān)的選項(xiàng)有:
| #InnoDB存儲(chǔ)數(shù)據(jù)字典、內(nèi)部數(shù)據(jù)結(jié)構(gòu)的緩沖池,16MB 已經(jīng)足夠大了。innodb_additional_mem_pool_size = 16M#InnoDB用于緩存數(shù)據(jù)、索引、鎖、插入緩沖、數(shù)據(jù)字典等#如果是專用的DB服務(wù)器,且以InnoDB引擎為主的場(chǎng)景,通常可設(shè)置物理內(nèi)存的50%#如果是非專用DB服務(wù)器,可以先嘗試設(shè)置成內(nèi)存的1/4,如果有問題再調(diào)整#默認(rèn)值是8M,非常坑X,這也是導(dǎo)致很多人覺得InnoDB不如MyISAM好用的緣故innodb_buffer_pool_size = 4G#InnoDB共享表空間初始化大小,默認(rèn)是 10MB,也非常坑X,改成 1GB,并且自動(dòng)擴(kuò)展innodb_data_file_path = ibdata1:1G:autoextend#如果不了解本選項(xiàng),建議設(shè)置為1,能較好保護(hù)數(shù)據(jù)可靠性,對(duì)性能有一定影響,但可控innodb_flush_log_at_trx_commit = 1#InnoDB的log buffer,通常設(shè)置為 64MB 就足夠了innodb_log_buffer_size = 64M#InnoDB redo log大小,通常設(shè)置256MB 就足夠了innodb_log_file_size = 256M#InnoDB redo log文件組,通常設(shè)置為 2 就足夠了innodb_log_files_in_group = 2#啟用InnoDB的獨(dú)立表空間模式,便于管理innodb_file_per_table = 1#啟用InnoDB的status file,便于管理員查看以及監(jiān)控等innodb_status_file = 1#設(shè)置事務(wù)隔離級(jí)別為 READ-COMMITED,提高事務(wù)效率,通常都滿足事務(wù)一致性要求transaction_isolation = READ-COMMITTED 在這里,其他配置選項(xiàng)也需要注意:#設(shè)置最大并發(fā)連接數(shù),如果前端程序是PHP,可適當(dāng)加大,但不可過大#如果前端程序采用連接池,可適當(dāng)調(diào)小,避免連接數(shù)過大max_connections = 60#最大連接錯(cuò)誤次數(shù),可適當(dāng)加大,防止頻繁連接錯(cuò)誤后,前端host被mysql拒絕掉max_connect_errors = 100000#設(shè)置慢查詢閥值,建議設(shè)置最小的 1 秒long_query_time = 1#設(shè)置臨時(shí)表最大值,這是每次連接都會(huì)分配,不宜設(shè)置過大 max_heap_table_size 和 tmp_table_size 要設(shè)置一樣大max_heap_table_size = 96Mtmp_table_size = 96M#每個(gè)連接都會(huì)分配的一些排序、連接等緩沖,一般設(shè)置為 2MB 就足夠了sort_buffer_size = 2Mjoin_buffer_size = 2Mread_buffer_size = 2Mread_rnd_buffer_size = 2M#建議關(guān)閉query cache,有些時(shí)候?qū)π阅芊炊且环N損害query_cache_size = 0#如果是以InnoDB引擎為主的DB,專用于MyISAM引擎的 key_buffer_size 可以設(shè)置較小,8MB 已足夠#如果是以MyISAM引擎為主,可設(shè)置較大,但不能超過4G#在這里,強(qiáng)烈建議不使用MyISAM引擎,默認(rèn)都是用InnoDB引擎key_buffer_size = 8M#設(shè)置連接超時(shí)閥值,如果前端程序采用短連接,建議縮短這2個(gè)值#如果前端程序采用長(zhǎng)連接,可直接注釋掉這兩個(gè)選項(xiàng),是用默認(rèn)配置(8小時(shí))interactive_timeout = 120wait_timeout = 120 |