1. 程式人生 > 資料庫 >MySql優化之InnoDB,4GB記憶體,多查詢的my.ini中文配置方案詳解

MySql優化之InnoDB,4GB記憶體,多查詢的my.ini中文配置方案詳解

本文是一個針對 4G 記憶體系統(主要執行只有 InnoDB 表的 MySQL 並使用幾個連線數執行復雜的查詢)的 MySQL 配置檔案方案

#開始配置資訊
#描述:4GB 記憶體、只有 InnoDB、ACID、幾個連線數、繁重的查詢
#型別:系統
#結束配置資訊

# 你可以複製該檔案到 /etc/my.cnf 以設定全域性的選項,複製到 mysql-data-dir/my.cnf 以設定伺服器特有的選項(在本安裝中該目錄是 C:mysqldata ),複製到 ~/.my.cnf 以設定使用者特有的選項。
#
# 在該檔案中,你可以使用一個程式所支援的全部永久選項。
# 如果你想了解哪些選項是程式支援的,在執行程式時使用“--help”選項。

#
# 更多有關個別選項的詳細資訊也可以在手冊中找到。

# 下面的選項將被 MySQL 客戶端應用程式所讀取。
# 注意,只有 MySQL 標準的客戶端應用程式是被保證能讀取到該章節的。
# 如果你希望你自己的 MySQL 客戶端程式能夠承兌這些值,你需要在 MySQL 客戶端庫初始化中作為一個選項來指定它。
#
[client]
#password = [your_password]
port = 3306
socket = /tmp/mysql.sock

# *** 應用程式特定的選項在下面 ***

# MySQL 伺服器。
[mysqld]

# 通用配置選項
port = 3306
socket = /tmp/mysql.sock

# back_log 是指保持在作業系統監聽佇列中的連線數量,即在 MySQL 連線管理器執行緒處理它們之前的連線數量。
# 如果你有一個非常高的連線率並見到過“拒絕連線”的錯誤,你可能需要提高該值。
# 在你的系統文件中檢查該引數的最大值。
# 試圖將 back_log 設定得高於你作業系統的限制將不會起到任何作用。
back_log = 50

# 根本不用監聽一個 TCP/IP 埠。
# 如果執行在相同主機上的所有程序都需要連線到 mysqld,這可能是一個安全增強。
# 所有與 mysqld 的互動都必須通過 Unix sockets(套接字)或命名管道進行。
# 注意,在 Windows 上使用該選項但卻不啟用命名管道(通過“enable-named-pipe”選項)將使得 mysqld 變得無用。

#
#skip-networking

# MySQL 允許的併發會話的最大數量。
# 其中的一個連線將被保留給擁有 SUPER 特權的使用者,即使已經到達了連線限制,仍可以允許管理者登入。
max_connections = 100

# 每個主機允許的最大錯誤數量。
# 如果已到達該限制,主機將阻止對 MySQL 伺服器的連線,直到執行“FLUSH HOSTS”或者伺服器被重啟。
# 在連線階段的無效密碼和其它錯誤將導致該值被提高。
# 請看全域性計數器的“Aborted_connects”狀態變數。
max_connect_errors = 10

# 所有執行緒開啟表的數量。
# 提高該值將提高 mysqld 需要的檔案描述符的數量。
# 因此,你必須確定要設定的開啟檔案數量,在“mysqld 安全”章節的“open-file-limit”變數中,允許到至少為 4096。
table_open_cache = 2048

# 啟用外部檔案級鎖定。
# 啟用檔案鎖定將有一個性能上的負面影響,因此,只有在如果你有多個數據庫例項執行在相同的檔案上(注意,有些限制仍舊被應用)或者如果你使用其它軟體依靠在檔案級上鎖定 MyISAM 表時,才使用。
#external-locking

# 伺服器可以處理的一個查詢包的最大容量,以及伺服器可以處理的最大查詢大小(當工作在大型 BLOB 欄位時很重要)。
# 動態擴大,對於每一個連線。
max_allowed_packet = 16M

# 在一個事務中能夠為二進位制日誌 SQL 語句保持的快取大小。
# 如果你經常使用大的、多語句的事務,你可以提高該值以獲得更好的效能。
# 來自事務的所有語句被緩衝到二進位制日誌快取,並在 COMMIT 之後立即被寫入到二進位制日誌中。
# 如果事務大於該值,磁碟上的臨時檔案將被替代使用。
# 該緩衝在事務中第一個更新語句時分配給每個連線。
binlog_cache_size = 1M

# 一個單一的 HEAP(在記憶體中)表的最大允許大小。
# 該選項對偶然建立的一個非常大的 HEAP 表起保護作用,否則它將會使用完所有的記憶體資源。
max_heap_table_size = 64M

# 排序緩衝被用來執行一些 ORDER BY 和 GROUP BY 查詢的排序。
# 如果已排序的資料沒有進入到排序緩衝,一個基於磁碟的合併排序將被替代使用 - 請看“Sort_merge_passes”狀態變數。
# 如果排序是需要的,將分配給每個執行緒。
sort_buffer_size = 8M

# 該緩衝被用來優化 FULL JOIN(沒有索引的 JOIN)。
# 無論如何,該 JOIN 在大多數情況下對效能是非常壞的,但是設定該變數為一個大值將減少對效能的影響。
# 請看針對一定數量的 FULL JOIN 的“Select_full_join”狀態變數。
# 如果 FULL JOIN 被發現,將分配給每個執行緒。
join_buffer_size = 8M

# 我們保持在一個快取中的可重用的執行緒有好多。
# 當一個客戶端斷開連線時,如果在這之前的執行緒沒有超過 thread_cache_size,客戶端的執行緒將放在快取中。
# 如果你有很多新的連線,這將大幅減少建立所需執行緒的數量。
# (如果你有一個很好的執行緒實現,這通常不會給出一個顯著的效能改善。)
thread_cache_size = 8

# 這允許應用程式給予執行緒系統一個針對執行在相同時間的執行緒所需數量的提示。
# 該值只在支援 thread_concurrency() 函式呼叫的系統上有意義(例如 Sun Solaris)。
# 你應該對 thread_concurrency 嘗試 CPU 數量的 2/4/6/... 倍。
thread_concurrency = 8

# 查詢快取被用來快取 SELECT 結果並在稍後返回它們,不會再次實際執行相同的查詢。
# 如果你有很多相同的查詢並且很少改變表的話,查詢快取的啟用將導致顯著的速度改善。
# 請看“Qcache_lowmem_prunes”狀態變數,以檢查當前值對於你的載入是否足夠高。
# 注意:如果你的表經常改變,或者如果你的查詢每次是不同的原文,那麼查詢快取將導致變慢,替代效能的改善。
query_cache_size = 64M

# 只有快取結果集是小於該限制的。
# 這可以保護一個非常大結果集的查詢快取覆蓋所有其它查詢結果。
query_cache_limit = 2M

# 編制到全文檢索索引的最小單詞長度。
# 如果你需要檢索更短的單詞,你可能希望減小它。
# 注意,在你修改了該值以後,你需要重建你的 FULLINDEX 索引。
ft_min_word_len = 4

# 如果你的系統支援 memlock() 函式呼叫,你可能想要啟用該選項(執行 MySQL 以保持它鎖定到記憶體,並在出現高記憶體壓力時避免潛在的交換輸出)。
# 這對效能是很有益的。
#memlock

# 如果在 CREATE TABLE 語句期間沒有指定不同的,當建立一個新表時所使用的預設表型別。
default-storage-engine = MYISAM

# 使用的執行緒堆疊大小。
# 該記憶體量總是在連線時間被保留的。
# MySQL 自己通常需要不超過 64K 的記憶體,然而如果你使用的是你自己的堆疊 UDF 函式或者你的系統針對某些操作需要更多堆疊,你可能需要設定該值為一個更高的值。
thread_stack = 192K

# 設定預設的事務隔離等級。
# 可用的級別有:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE。
transaction_isolation = REPEATABLE-READ

# 內部(記憶體中的)臨時表的最大容量。
# 如果一個表的增長超過該值,它將自動地轉換到基於磁碟的表。
# 該限制是針對一個單一的表,但可以有很多這樣的表。
tmp_table_size = 64M

# 啟用二進位制日誌。
# 這在一個複製配置中,對於充當 MASTER 的是必要的。
# 如果你需要有能力及時從你最後的備份點中進行恢復,你也需要二進位制日誌。
log-bin = mysql-bin

# 推薦的二進位制日誌格式 - mixed。
binlog_format = mixed

# 如果你正在使用連鎖從伺服器(A-〉B-〉C)進行復制,你需要在伺服器 B 上啟用該選項。
# 它允許通過從伺服器執行緒將日誌記錄到從伺服器的二進位制日誌中來實現日誌的更新。
#log_slave_updates

# 啟用完整的查詢日誌。伺服器接收到的每一個查詢(甚至是錯誤的語法)都將被記錄。
# 這對於除錯是很有用的,它通常在產品使用時被禁用。
#log

# 列印警告到錯誤日誌檔案。
# 如果你有任何 MySQL 的問題,你應該啟用警告日誌並檢查錯誤日誌中可能的解釋。
#log_warnings

# 記錄慢查詢。
# 慢查詢是指消耗時間超過“long_query_time”中定義的總時間的查詢,或者如果 log_short_format 沒有啟用,不使用索引的查詢。
# 如果你頻繁地新增新查詢到系統中,開啟這個是一個比較好的注意。
slow_query_log

# 所有消耗時間超過該總時間的查詢都將被視為是緩慢的。
# 不要在這裡使用“1”值,因為這會導致甚至非常快的查詢都會被不時地被記錄(MySQL 當前的度量時間只精確到秒)。
long_query_time = 2

# 被 MySQL 用來儲存臨時檔案的目錄。
# 例如,它被用來執行基於磁碟的大的排序,以及內部和顯式的臨時表。
# 如果你不會建立一個非常大的臨時檔案,將它放在一個 swapfs/tmpfs 檔案系統中是有好處的。
# 另外,你可以把它放在一個專用的磁碟上。
# 你可以指定以“;”分隔的多個路徑 - 它們將在稍後被用在一個迴圈方式中。
#tmpdir = /tmp

# *** 與複製有關的設定

# 1 到 2^32-1 之間的唯一伺服器標識號。
# 該值對於主伺服器和從伺服器都是必須的。
# 如果“master-host”沒有設定則預設為 1,但若是忽略,MySQL 將不會作為一個主伺服器的功能。
server-id = 1

# 複製從伺服器(註釋掉主伺服器章節以便使用這個)。
#
# 要配置該主機為一個複製從伺服器,你可以選擇以下兩種方法:
#
# 1)使用 CHANGE MASTER TO 命令(在我們的手冊中有完整的描述) - 其語法是:
#
# CHANGE MASTER TO MASTER_HOST = 〈host〉,MASTER_PORT = 〈port〉,MASTER_USER = 〈user〉,MASTER_PASSWORD = 〈password〉;
#
# 使用帶引號的字串替換 〈host〉、〈user〉、〈password〉,並且 〈port〉 是主伺服器的埠號(預設為 3306)。
#
# 例子:
#
# CHANGE MASTER TO MASTER_HOST = '125.564.12.1',MASTER_PORT = 3306,MASTER_USER = 'joe',MASTER_PASSWORD = 'secret';
#
# 或者
#
# 2)設定下面的變數。然而,如果你選擇了該方法,請在第一時間內啟動複製(就算不成功,例如,如果你在 MASTER_PASSWORD 中未鍵入密碼,並且從伺服器連線失敗),從伺服器將建立一個 master.info 檔案,稍後在該檔案中對下面變數值的任何改變都將被忽略,並被 master.info 檔案中的連線所覆蓋,除非你關閉從伺服器、刪除 master.info 並重新啟動從伺服器。
# 基於這種因素,你可能想要離開下面未接觸的行(已註釋的)並替代使用 CHANGE MASTER TO(請看上面)。
#
# 需要 2 到 2^32-1 之間的唯一 id(與主伺服器不同)。
# 如果“master-host”已被設定,預設設定為 2。
# 但若是忽略,將不會作為一個從伺服器的功能。
#server-id = 2
#
# 針對該從伺服器的複製主伺服器 - 必須的。
#master-host = 〈hostname〉
#
# 使用者名稱,當連線到主伺服器時,從伺服器將用此來進行認證 - 必須的。
#master-user = 〈username〉
#
# 密碼,當連線到主伺服器時,從伺服器將用此來進行認證 - 必須的。
#master-password = 〈password〉
#
# 埠,主伺服器正在監聽的。
# 可選的 - 預設為 3306。
#master-port = 〈port〉

# 讓從伺服器只讀。
# 只有擁有 SUPER 特權的使用者和複製從伺服器執行緒能夠修改它的資料。
# 你可以使用這個來確保不會有應用程式在無意中替代主伺服器修改從伺服器上的資料。
#read_only

#*** MyISAM 特有的選項

# 鍵緩衝區的大小,用來為 MyISAM 表快取索引塊。
# 不要將它設定為超過你可用記憶體的 30% 以上,因為作業系統也需要一些記憶體來快取行。
# 即使你不使用 MyISAM 表,你仍應該將它設定為 8-64M,因為它也被用於內部的臨時磁碟表。
key_buffer_size = 32M

# 用於進行 MyISAM 表全表掃描的緩衝區大小。
# 如果全表掃描是需要的,將分配給每個執行緒。
read_buffer_size = 2M

# 當在一個有序的排序中讀取行時,可以通過該緩衝區來讀取行,以避免對磁碟的查詢。
# 如果將該值設定為一個很高的值,你可以大幅度提高 ORDER BY 的效能。
# 當需要時,分配給每個執行緒。
read_rnd_buffer_size = 16M

# MyISAM 使用特殊的類似於樹的快取來讓大批量插入(亦即 INSERT ... SELECT、INSERT ... VALUES(...) 和 LOAD DATA INFILE)操作變得更快。
# 該變數限制每個執行緒的快取樹的位元組大小。
# 將它設定為 0 將禁用該優化。
# 為了優化效能,不要將它設定得比“key_buffer_size”大。
# 當檢測到大量的插入時,該緩衝區被分配。
bulk_insert_buffer_size = 64M

# 當 MySQL 需要通過 REPAIR、OPTIMIZE、ALTER 表語句重建索引,以及 LOAD DATA INFILE 到一個空表時,該緩衝區被分配。
# 它是給每個執行緒分配的,因此小心比較大的設定。
myisam_sort_buffer_size = 128M

# 當重建索引(在 REPAIR、ALTER TABLE 或 LOAD DATA INFILE 期間)時,MySQL 允許使用的臨時檔案的最大大小。
# 如果“file-size”比這個值大,索引將通過鍵快取(更慢一些)建立。
myisam_max_sort_file_size = 10G

# 如果一個表有超過一個的索引,MyISAM 能夠在排序時並行地使用超過一個的執行緒來修復它們。
# 如果你有多個 CPU 和足夠的記憶體,這是很有意義的。
myisam_repair_threads = 1

# 自動地檢查和修復沒有正確關閉的 MyISAM 表。
myisam_recover

# *** INNODB 特定的選項 ***

# 如果你有一個支援 InnoDB 啟用的 MySQL 伺服器,而你卻並不計劃使用它,請使用該選項。
# 這可以儲存一些記憶體和磁碟空間,並提高速度。
#skip-innodb

# 附加的記憶體池,InnoDB 用來儲存元資料資訊。
# 如果 InnoDB 因該目的而需要更多的記憶體,它將開始從作業系統來分配它。
# 由於這在大多數最近的作業系統上是足夠快的,你通常不需要改變這個值。
# SHOW INNODB STATUS 將顯示當前使用總量。
innodb_additional_mem_pool_size = 16M

# InnoDB,不像 MyISAM,使用一個緩衝池來快取索引和行資料。
# 你將該值設得越大,在表中訪問需要的資料時,磁碟 I/O 就越少。
# 在一個專用的資料庫伺服器上,你可以設定該引數到機器實體記憶體大小的 80%。
# 不要把它設定得太大,因為實體記憶體的競爭可能導致作業系統中的分頁。
# 注意,在 32 位的系統上,你可能在每個處理器的使用者級記憶體上被限制在 2-3.5G,因此不要把它設定得太高。
innodb_buffer_pool_size = 2G

# InnoDB 儲存資料到一個或多個數據檔案,形成表空間。
# 如果對於你對你的資料有一個單一的物理裝置,那麼一個單一的自動擴充套件檔案就已經足夠了。
# 在其它情況下,每裝置一個單一檔案是一個非常好的選擇。
# 你也可以配置 InnoDB 來使用原始的磁碟分割槽 - 請參考手冊以獲取更多有關這個的資訊。
innodb_data_file_path = ibdata1:10M:autoextend

# 如果你希望 InnoDB 表空間檔案儲存到其它的地方,設定該選項。
# 預設的是 MySQL 資料目錄。
#innodb_data_home_dir = 〈directory〉

# 非同步 IO 操作所使用的 IO 執行緒數。
# 該值在 Unix 系統上被硬編碼為 4,但在 Windows 上,磁碟 I/O 可能受益於一個更大的數字。
innodb_file_io_threads = 4

# 如果你遇到 InnoDB 表空間腐爛,設定該值為一個非零值,將很容易地幫助你匯出你的表。
# 以值 1 開始並提高它,直到你能夠成功地匯出表。
#innodb_force_recovery=1

# InnoDB 核心裡面允許的執行緒數量。
# 最佳的值高度取決於應用程式、硬體以及作業系統的排程屬性。
# 一個太高的值可能導致執行緒顛簸。
innodb_thread_concurrency = 16

# 如果設定為 1,InnoDB 在每次提交(提供完整的 ACID 行為)時重新整理事務日誌到磁碟。
# 如果你想安全地進行折中,並且你正在執行小事務,你可以為 0 或 2 來減少日誌的磁碟 I/O。
# 值 0 表示日誌只被寫入到日誌檔案,並且日誌檔案大約每秒一次重新整理到磁碟。
# 值 2 表示日誌在每次提交時被寫入到日誌檔案,但是日誌檔案只是大約每秒一次被重新整理到磁碟。
innodb_flush_log_at_trx_commit = 1

# 加速 InnoDB 的關閉。
# 這在關閉時將禁用 InnoDB 做一個完整的清除和插入緩衝合併。
# 它可能會提高不少關閉的時間,但替代的是 InnoDB 將在下一次啟動時來完成它。
#innodb_fast_shutdown

# InnoDB 緩衝日誌資料所使用的緩衝區大小。
# 一旦它滿了,InnoDB 將重新整理它到磁碟。
# 因為不管怎麼它都是每秒重新整理一次,所以沒有必要讓它變得很大(甚至是很長的事務)。
innodb_log_buffer_size = 8M

# 一個日誌組中每個日誌檔案的大小。
# 你可以設定日誌檔案的聯合大小為你的緩衝池大小的 25%-100%,以避免對日誌檔案不必要的緩衝池動態重新整理重寫。
# 然而,注意,一個更大的日誌檔案大小將增加恢復處理所需的時間。
innodb_log_file_size = 256M

# 日誌組中檔案的總數。
# 通常值為 2-3 就已足夠了。
innodb_log_files_in_group = 3

# InnoDB 日誌檔案的位置。
# 預設為 MySQL 的資料目錄。
# 你可能希望指定它到一個專用的硬碟或一個 RAID1 卷標來改善效能。
#innodb_log_group_home_dir

# InnoDB 緩衝池中允許的髒頁面的最大百分比。
# 如果它到達了,InnoDB 將開始積極地清理它們,以避免消耗完所有的乾淨頁面。
# 這是一個軟限制,不保證能夠一直保持。
innodb_max_dirty_pages_pct = 90

# InnoDB 對日誌使用的重新整理方法。
# 表空間總是使用雙寫重新整理邏輯。
# 預設值為“fdatasync”,其它選項是“O_DSYNC”。
#innodb_flush_method = O_DSYNC

# 一個 InnoDB 事務應等待的在回滾之前被授權鎖定的時長。
# InnoDB 在它自己的鎖定表中自動地檢測事務死鎖,並回滾事務。
# 如果你在相同的事務中使用 LOCK TABLES 命令,或者其它比 InnoDB 更加事務安全的儲存引擎,那麼稍後會出現 InnoDB 不能提示的死鎖。
# 如果像這樣,超時對於解決問題是很有用的。
innodb_lock_wait_timeout = 120

[mysqldump]
# 在寫入到檔案之前,不要緩衝整個結果集。
# 匯出非常大的表時是必須的。
quick

max_allowed_packet = 16M

[mysql]
no-auto-rehash

# 只允許 UPDATE 和 DELETE 使用鍵。
#safe-updates

[myisamchk]
key_buffer_size = 512M
sort_buffer_size = 512M
read_buffer = 8M
write_buffer = 8M

[mysqlhotcopy]
interactive-timeout

[mysqld_safe]
# 增加每次處理所允許開啟的檔案數量。
# 警告:確保你已經設定全域性系統限制足夠高!
# 對於一個大數量的開啟表,高值是必須的。
open-files-limit = 8192

以上的引數設定大家可以根據自己實現情況參考一下